草庐IT

Linux FTP传输协议

背对背依靠 2023-03-28 原文

FTP:File Transfer Protocol ,文件传输协议

FTP:属于NAS存储的一种协议,基于CS结构。

FTP的工作原理:

ftp采用的是双端口模式,分为命令端口和数据端口

  • 命令端口:固定,tcp/21,命令端口对应的就是命令通道

  • 数据端口:不固定,数据端口对应的就是数据通道

说明:
  ftp不同的工作模式使用不同类型的端口。

ftp的工作模式:(从服务器角度)
  • 主动模式:服务器主动向客户端发起连接

  • 被动模式:服务器被动接受客户端的连接请求

说明:

  主动模式和被动模式是数据通道的概念。

ftp的通信流程:
  • 1.服务端开启对21端口的监听。

  • 2.客户端发起对服务端的连接请求,通过服务器的21端口连接到服务器。此时建立起了命令通道,命令通道用于传输和通信相关的一些指令。

  • 3.建立数据通道
    如果是主动模式:服务端会使用20端口主动连客户端的一个随机端口。
    如果是被动模式:客户端使用一个随机端口连接服务端的一个随机端口

  • 4.使用数据通道进行数据的传输。

说明:
  不管是主动模式还是被动模式,服务端都会打开两个端口,一个固定的21端口用于和客户端建立命令通道。一个20或其他端口用于和客户端建立数据通道。

  使用防火墙的连接跟踪功能可以解决防火墙对随机端口的拦截。

防火墙连接跟踪功能:

  监控命令通道中传输的指令,自动分析随机端口,在客户端发起连接的时候就自动打开了这个随机端口。
iptables启动连接跟踪功能的方法:

探测端口是否打开的方法:

telnet工具
  格式:telnet host port #如果能响应则端口就是打开的

例如:查看22端口是否开启

#如果telnet能响应则端口就是打开的'
[root@CentOS8 ~]# telnet 10.0.0.12 22
Trying 10.0.0.12...
Connected to 10.0.0.12.
Escape character is '^]'.
SSH-2.0-OpenSSH_8.0

常见 FTP 相关软件

服务端软件:centos默认的FTP服务端软件是FTP

客户端软件:FTP、wget、curl等等

vsftpd 软件

Very Secure FTP Daemon,CentOS 默认FTP服务器

特点:
速度快、稳定性好

官网:
https://security.appspot.com/vsftpd.html

vsftpd的相关配置:

配置文件格式:option=value

注意:= 前后不要有空格

使用:man vsftpd.conf 可以查看csftpd的相关配置说明

  1. 配置命令通道的命令端口

默认为21端口

listen_port=2121 默认值为21
  1. 数据通道主动模式的端口
connect_from_port_20=YES  #设置主动模式端口为20

ftp_data_port=20 (默认)  #指定主动模式的端口
  1. 被动模式端口范围
linux ftp 客户端默认使用被动模式
windows ftp 客户端默认使用主动模式

pasv_min_port=6000   0为随机分配,端口范围会影响客户端的并发数
pasv_max_port=6010   #表示被动模式端口范围是6000---6010
  1. ftp服务器的时间
use_localtime=YES 使用当地时间(默认为NO,使用GMT)

#默认使用的是格林尼治时间,北京时间为:GMT+8
  1. 匿名用户登录
#开启后可以使用匿名用户ftp或anonymous登录  
anonymous_enable=YES    #支持匿名用户,CentOS8 默认不允许匿名

no_anon_password=YES    #匿名用户略过口令检查 , 默认NO,表示不输入匿名用户的密码进行登录
  1. 匿名用户上传文件
anon_upload_enable=YES   #表示允许匿名上传,注意:文件系统权限
#FTP服务端允许了匿名用户上传,但是指定文件的权限不允许上传也是没法上传成功 所以需要在服务器的指定目录下给ftp用户添加权限

anon_mkdir_write_enable=YES 匿名建目录

范例:实现匿名用户上传

服务端:
[root@CentOS8 ~]# vim /etc/vsftpd/vsftpd.conf
anon_upload_enable=YES  #允许匿名用户上传

#如果没有开启权限,虽然打开了匿名上传功能,但是跨网络传输数据,ftp对远程目录的文件夹没有写权限,所以不能上传。
#给ftp用户根目录下的pub目录添加ftp用户的权限
[root@CentOS8 ~]# setfacl -m u:ftp:rwx /var/ftp/pub/ #给ftp用户权限


客户端:
[root@CentOS8 ~]# ftp 10.0.0.11
Connected to 10.0.0.11 (10.0.0.11).
220 (vsFTPd 3.0.3)
Name (10.0.0.11:root): ftp
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> !ls
anaconda-ks.cfg  test.1
ftp> cd pub
250 Directory successfully changed.
ftp> put test.1
local: test.1 remote: test.1
227 Entering Passive Mode (10,0,0,11,51,195).
150 Ok to send data.
226 Transfer complete.
10485760 bytes sent in 0.057 secs (184086.66 Kbytes/sec)
ftp>

说明:

  不能给FTP根目录写权限,只能给子目录写权限,否则报如下错误

#服务端
[root@CentOS8 ~]# setfacl -m  u:ftp:rwx /var/ftp/

#客户端访问
[root@CentOS8 ~]# ftp 10.0.0.11
Connected to 10.0.0.11 (10.0.0.11).
220 (vsFTPd 3.0.3)
Name (10.0.0.11:root): ftp
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.
421 Service not available, remote server has closed connection
ftp>
方法一:
anon_world_readable_only=NO    默认YES 所有人都具有读权限的文件才能下载

方法二:
anon_umask=0333 指定匿名上传文件的umask,默认077,注意:0333中的0不能省略 0333是八进制形式

实现上传文件的删除和修改
anon_other_write_enable=YES 可删除和修改上传的文件,默认NO
  1. 指定匿名用户的上传文件的默认的所有者和权限
#默认上传文件的所有者就是客户端当前的账号
chown_uploads=YES          #默认NO YES表示允许修改上传文件的权限和所有者

chown_username=wang        #文件所有者

chown_upload_mode=0644     #文件权限
  1. 设置Linux系统用户登录ftp服务器
local_enable=YES   #是否允许本地用户登录,YES表示允许

write_enable=YES   #是否允许本地用户上传文件,YES表示允许

local_umask=022    #指定系统用户上传文件的默认权限对应umask
  1. 将系统用户映射为一个指定的账号
guest_enable=YES     #所有系统用户都映射成某一个guest用户

guest_username=ftp   #配合上面选项才生效,指定guest用户

local_root=/ftproot  #指定guest账号登录进来映射的目录

#设置每个用户都拥有独立的配置
user_config_dir=/etc/vsftpd/conf.d/ 每个用户独立的配置文件目录  这里可以针对不同的用户放不同的配置

范例: 让所有的系统用户映射指定guest用户

服务器端配置
[root@CentOS8 ~]# vim /etc/vsftpd/vsftpd.conf
guest_enable=YES
guest_username=ftp
local_root=/ftproot

[root@CentOS8 ~]# useradd bob 
[root@CentOS8 ~]# passwd bob

[root@CentOS8 ~]# mkdir ftproot/
[root@CentOS8 ~]# touch test1

客户端:
[root@CentOS8 ~]# ftp 10.0.0.11
Connected to 10.0.0.11 (10.0.0.11).
220 (vsFTPd 3.0.3)
Name (10.0.0.11:root): bob
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (10,0,0,11,172,77).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Oct 21 03:46 test.1
226 Directory send OK.
ftp>

范例:映射登录的用户为guest用户,并使用独立的家目录

服务端:
#创建tom和bob两个用户

#修改服务器配置文件
[root@CentOS8 ~]# vim /etc/vsftpd/vsftpd.conf
guest_enable=YES 所有系统用户都映射成guest用户
guest_username=ftp   配合上面选项才生效,指定guest用户
local_root=/ftproot 指定guest用户登录所在目录,但不影响匿名用户的登录目录
user_config_dir=/etc/vsftpd/conf.d/ 每个用户独立的配置文件目录

#创建存放tom和bob独立配置文件的目录
[root@CentOS8 ~]# mkdir  /etc/vsftpd/conf.d/
#生成tom和bob的独立配置文件
[root@CentOS8 conf.d]# echo "local_root=/ftproot_bob" >  /etc/vsftpd/conf.d/bob
[root@CentOS8 conf.d]# echo "local_root=/ftproot_tom" >  /etc/vsftpd/conf.d/tom
#重启服务
[root@CentOS8 ~]# systemctl status vsftpd.service

#创建对应的文件目录
[root@CentOS8 ~]# mkdir /ftproot_bob  /ftproot_tom
[root@CentOS8 ftproot_bob]# touch bob.test
[root@CentOS8 ftproot_tom]# touch tom.test


客户端测试:
[root@CentOS8 ~]# ftp 10.0.0.11
Connected to 10.0.0.11 (10.0.0.11).
220 (vsFTPd 3.0.3)
Name (10.0.0.11:root): bob
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (10,0,0,11,222,234).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Oct 21 05:37 bob.test
226 Directory send OK.
ftp>
  1. 禁锢系统用户
      禁锢所有系统用户在家目录中:
#不允许用户随便切换目录,只能在家目录中
chroot_local_user=YES #禁锢系统用户,默认NO,即不禁锢

此时ftp会把对应用户的家目录作为根目录,如果这个家目录存在写权限则登录的时候会提示错误相关错误信息。

访问ftp服务器可以通过三种类型的账号进行访问:

  • 匿名用户:ftp、anonmous,共享目录在/vat/ftp下

  • 系统用户:例如linux的自身的账号,默认进入的就是用户的加目录

  • 虚拟账号:专用于ftp服务的账号,虚拟账号:给对应服务使用的账号,不在操作系统上的账号

  1. 日志
vsftpd默认使用的就是wu-ftp的日志格式
#wu-ftp 日志:默认启用
xferlog_enable=YES #启用记录上传下载日志,此为默认值
xferlog_std_format=YES #使用wu-ftp日志格式,此为默认值
xferlog_file=/var/log/xferlog #可自动生成, 此为默认值


#vsftpd日志:默认不启用
dual_log_enable=YES 使用vsftpd日志格式,默认不启用
vsftpd_log_file=/var/log/vsftpd.log 可自动生成, 此为默认值
  1. 提示信息:
    (1)登录前提示信息
方法一:
ftpd_banner="welcome to mage ftp server"

方法二:将提示信息存放到一个文件中
banner_file=/etc/vsftpd/ftpbanner.txt

(2)目录访问提示信息

dirmessage_enable=YES    #此为默认值,开启这个选项后,在对应目录中创建指定文件就实现了提示信息

message_file=.message    #信息存放在指定目录下.message ,此为默认值,只支持单行说明
  1. PAM模块实现用户访问控制
      pam是一个可插拔的配置模块,利用pam可以控制用户的访问
pam_service_name=vsftpd    # 默认值 vsftpd是/etc/pam.d/vsftpd下的一个文件

#pam配置文件:/etc/pam.d/vsftpd

/etc/vsftpd/ftpusers 默认文件中用户拒绝登录,默认是黑名单,但也可以是白名单

查看黑名单中限制登录ftp的用户

[root@CentOS8 pam.d]# cat /etc/vsftpd/ftpusers
# Users that are not allowed to login via ftp
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody

是否启用控制用户登录的列表文件

userlist_enable=YES                #此为默认值,表示启用xx这个文件列表

userlist_deny=YES(默认值)           #表示将xx设置为黑名单,不提示口令,NO为白名单

userlist_file=/etc/vsftpd/user_list #此为默认值,指定登录列表文件
[root@CentOS8 pam.d]# cat /etc/vsftpd/user_list
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
  1. 连接数限制
max_clients=0     #设置最大并发连接数

max_per_ip=0      #设置每个IP同时发起的最大连接数
  1. 连接超时时间设置;
connect_timeout=60    #主动模式数据连接超时时长

accept_timeout=60     #被动模式数据连接超时时长

data_connection_timeout=300    #数据连接无数据输超时时长

idle_session_timeout=60        #无命令操作超时时长
  1. 设置传输速率,单位:字节/秒
anon_max_rate=0 匿名用户的最大传输速率,以字节为单位,比如:1024000表示1MB/s

local_max_rate=0 本地用户的最大传输速率

有关Linux FTP传输协议的更多相关文章

  1. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  2. ruby - HTTP POST 上的 SSL 错误(未知协议(protocol)) - 2

    尝试通过SSL连接到ImgurAPI时出现错误。这是代码和错误:API_URI=URI.parse('https://api.imgur.com')API_PUBLIC_KEY='Client-ID--'ENDPOINTS={:image=>'/3/image',:gallery=>'/3/gallery'}#Public:Uploadanimage##args-Theimagepathfortheimagetoupload#defupload(image_path)http=Net::HTTP.new(API_URI.host)http.use_ssl=truehttp.verify

  3. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  4. ruby - 使用 Ruby 将 HTTP GET 的响应主体流式传输到 HTTP POST - 2

    我正在尝试下载一个大文件,然后使用Ruby将该文件发布到REST端点。该文件可能非常大,即超过可以存储在内存中甚至磁盘上的临时文件中的容量。我一直在用Net::HTTP尝试这个,但我愿意接受任何其他库(rest-client等)的解决方案,只要他们做我想做的事情。这是我尝试过的:require'net/http'source_uri=URI("https://example.org/very_large_file")source_request=Net::HTTP::Get.new(source_uri)source_http=Net::HTTP.start(source_uri.ho

  5. ruby-on-rails - 将 Heroku 环境变量传输到 Docker 实例 - 2

    我在Heroku上构建了一个必须在Docker容器内运行的RoR应用程序。为此,我使用officialDockerfile.因为它在Heroku中很常见,所以我需要一些附加组件才能使这个应用程序完全运行。在生产中,变量DATABASE_URL在我的应用程序中可用。但是,如果我尝试其他一些使用环境变量(在我的例子中是Mailtrap)的加载项,变量不会在运行时复制到实例中。所以我的问题很简单:如何让docker实例在Heroku上执行时知道环境变量?您可能会问,我已经知道我们可以在docker-compose.yml中指定一个environment指令。我想避免这种情况,以便能够通过项目

  6. 网络实验之RIPV2协议(一) - 2

    一、RIPV2协议简介  RIP(RoutingInformationProtocol)路由协议是一种相对古老,在小型以及同介质网络中得到了广泛应用的一种路由协议。RIP采用距离向量算法,是一种距离向量协议。RIP-1是有类别路由协议(ClassfulRoutingProtocol),它只支持以广播方式发布协议报文。RIP-1的协议报文无法携带掩码信息,它只能识别A、B、C类这样的自然网段的路由,因此RIP-1不支持非连续子网(DiscontiguousSubnet)。RIP-2是一种无类别路由协议(ClasslessRoutingProtocol),支持路由标记,在路由策略中可根据路由标记对

  7. ruby - Capistrano 3.0 文件传输? - 2

    似乎Capistrano曾经有anextensivefiletransferpackage.但是在3.0版本重写后好像没有了。知道是否还有其他方法可以将文件传输到服务器/从服务器传输文件吗? 最佳答案 下载:desc"downloadfoobar.txtintolocal_dir/"task:foobardodownload!"some_remote_path/foobar.txt","local_dir/"end我知道这从Cap3.2.1开始有效,因为我现在正在使用它。 关于ruby-

  8. ruby-on-rails - 如何将数据从我的生产数据库传输到 heroku 中的登台数据库? - 2

    我正在尝试将数据从我的生产数据库传输到我的登台数据库,但没有成功。我正在关注heroku的相关文档:http://devcenter.heroku.com/articles/pgbackups#transfers这些是我运行的命令...$herokuaddons:addpgbackups--remotestaging$herokuaddons:addpgbackups--remoteproduction$herokupgbackups:capture--remoteproduction$herokupgbackups:restoreDATABASE`herokupgbackups:ur

  9. ruby - Ruby 和 Net::SCP 传输(套接字)的性能问题 - 2

    从命令行scp实用程序的功能来看,SCP上传速度似乎在库中受到很大限制。我知道这是Ruby(1.9.2-p0),但是Net::SCP比Linux实用程序慢大约8倍(使用大文件看到...见下文)。我很好奇知道(我快速查看了代码)这是否是Ruby中套接字的方式,或者是否可以更好地多路复用Net::SCP套接字?我注意到无论我尝试哪种上传方式(串行上传、异步操作channel、使用scp对象的多个实例)我都无法在SCP上传上获得超过9兆字节/秒的传输速度。现在……让我解释一下我调查的细节:1)尝试不同的加密算法我使用了不同类型的加密,速度没有太大变化示例:我可以使用命令行scp(加密算法=a

  10. ruby - 从 Amazon S3 流式传输动态 zip - 2

    我正在寻找一种从AmazonS3动态流式下载zip文件的方法。应用程序托管在EC2上,文件存储在S3上。需要让用户能够从一组文件中进行选择,然后将这些文件打包并下载给他们。听说过一些可能可行的Actionscript库(aszip和fzip),或者可以在Ruby或什至PHP中执行此操作。文件不需要任何压缩,zip只是用于将文件捆绑到一个下载中.... 最佳答案 我使用NginxZipModule流式传输本地文件,但可以选择从远程位置流式传输。否则,您可以将它与VFS安装的S3存储一起用作本地文件系统。支持seek-断点续传和加速下载

随机推荐