FTP协议

FTP服务器的模式

FTP服务器工作端口

  • TCP21 命令传输端口
  • TCP20 数据传输端口

主动模式

image

FTP主动模式联机示意图

如上图所示,FTP服务器在主动模式下,联机步骤如下:

1,建立命令信号通道
客户机会随机选取大于1024以上的端口(port AA)来与FTP服务器的21端口连接,这个过程需要TCP的三次握手建立可靠的连接,建立连接后,客户机会对服务器进行命令的下达。
2,协商阶段
客户机通知FTP服务器使用主动模式(active)进行数据的传输,并且会告知服务器,自己采用的数据传输的端口号。
3,传输数据阶段
此时,FTP服务器由命令通道知道了客户机的数据传输请求后,且知道了客户机的数据传输端口;服务 器会主动向客户机的数据传输端口建立链接请求,这个时候也会用TCP的三次握手!建立连接后,此时,客户机和服务器共会建立两天可靠的TCP连接,在命令信道进行下载或上传的指令,在数据信道进行实际的数据传输。
注: 一句话总结,主动模式是,服务器端主动发出数据连接请求,客户端等待服务器的主动连接。
被动模式

被动模式主要使用与客户端有防火墙的情况下,如下图中,服务器当主动和客户机进行数据连接请求时,会被客户端的防火墙阻止。

image

由上图可知,由于有防火墙的存在或透过 NAT 的转换后,FTP 服务器只能得知 NAT 的 IP 而不是客户端的 IP , 因此 FTP 服务器会以 port 20 主动的向 NAT 的 port BB 发送主动联机的要求。 但你的 NAT 并没有启动 port BB 来监听 FTP 服务器的联机啊!因此,不能顺利建立数据连接。

解决以上的问题有两种方式
1. 使用iptables的两个模块,你可以用modprobe这个命令来加载 ip_conntrack_ftp和ip_nat_ftp模块来实现,条件是FTP服务器必须使用标准的21端口
2. 使用FTP的被动模式,如下图

image

具体的过程是这样的:

1.客户机和服务器建立命令通道
这和之前主动模式是一样的

2. 协商连接模式
这时客户机会使用建立好的命令信道,向服务器发出PASV的被动模式连接要求,并等待服务器的回应。此时客户机并没有告知服务器自己的数据传输端口,只是个请求
3. 当服务器接收到要求被动模式的连接时,且服务器支持此模式;就会先启动一个大于1024的端口号进入监听状态。这个号码也可以通过自己FTP服务器设定一个范围。之后服务器会透过命令信道,告知客户端自己已经启动的数据传输端口,并等待客户机的连接
4. 这时,客户机知道了服务器端的数据连接端口后,会随机用一个大于1024的端口号来和服务器的数据端口号进行连接。此时一切OK的话,就可传输数据。
注:一句话总结,被动模式是服务器端先开启一个数据端口进行监听,等待客户机的连接。而客户机会主动向服务器进行连接。

port_enable=YES|NO   如果你要在数据连接时取消PORT模式时,设此选项为NO。默认值为YES。
connect_from_port_20=YES|NO   控制以PORT模式进行数据传输时是否使用20端口(ftp-data)。YES使用,NO不使用。默认值为NO,
但RHEL 自带的vsftpd.conf文件中此参数设为YES。
ftp_data_port=port number  设定ftp数据传输端口值(ftp-data)。默认值为20。此参数用于PORT FTP模式。
port_promiscuous=YES|NO 默认值为NO。为YES时,取消PORT安全检查。该检查确保外出的数据只能连接到客户端上。
小心打开此选项。
pasv_enable=YES|NO YES,允许数据传输时使用PASV模式。NO,不允许使用PASV模式。默认值为YES。
pasv_min_port=port number //设定在PASV模式下,建立数据传输所可以使用port范围的下界和上界,0 表示任意。默认值为0。
pasv_max_port=port number //把端口范围设在比较高的一段范围内,比如50000-60000,将有助于安全性的提高。
pasv_promiscuous=YES|NO   此选项激活时,将关闭PASV模式的安全检查。该检查确保数据连接和控制连接是来自同一个IP地址。小心打开
此选项。此选项唯一合理的用法是存在于由安全隧道方案构成的组织中。默认值为NO。
pasv_address=   此选项为一个数字IP地址,作为PASV命令的响应。默认值为none,即地址是从呼入的连接套接字
(incoming connectd socket)中获取
三、FTP服务器的用户分类
匿名用户 (anonymous或ftp)
本地用户(local user)
虚拟用户(guest) use_localtime=YES //使用本地主机的时间,建议设置

1. 匿名用户的配置选项

anonymous_enable=YES|NO   
控制是否允许匿名用户登录,YES允许,NO不允许,默认值为YES。
ftp_username=   
匿名用户所使用的系统用户名。默认下,此参数在配置文件中不出现,值为ftp。
no_anon_password=YES|NO  
 控制匿名用户登入时是否需要密码,YES不需要,NO需要。默认值为NO。   
deny_email_enable=YES|NO  
 此参数默认值为NO。当值为YES时,拒绝使用banned_email_file参数指定文件中所列出的e-mail地址进行登录的匿名用户。即,当匿名用户使用banned_email_file文件中所列出的e-mail进行登录时,被拒绝。显然,这对于阻击某些Dos攻击有效。当此参数生效时,需追加banned_email_file参数
banned_email_file=/etc/vsftpd.banned_emails   
指定包含被拒绝的e-mail地址的文件,默认文件为/etc/vsftpd.banned_emails。
anon_root=   
设定匿名用户的根目录,即匿名用户登入后,被定位到此目录下。主配置文件中默认无此项,默认值为/var/ftp/。
 anon_world_readable_only=YES|NO   
控制是否只允许匿名用户下载可阅读文档。YES,只允许匿名用户下载可阅读的文件。NO,允许匿名用户浏览整个服务器的文件系统。默认值为YES。
 anon_upload_enable=YES|NO  
 控制是否允许匿名用户上传文件,YES允许,NO不允许,默认是不设值,即为NO。除了这个参数外,匿名用户要能上传文件,还需要两条件:一、write_enable=YES;
二、在文件系统上,目录有写权限。
anon_mkdir_write_enable=YES|NO   
控制是否允许匿名用户创建新目录,YES允许,NO不允许,默认是不设值,即为NO。当然在文件系统上,FTP匿名用户必需对新目录的上层目录拥有写权限。 • 如果要设定为 YES, 那么 anony_other_write_enable 必须设定为 YES

anon_other_write_enable=YES|NO
  控制匿名用户是否拥有除了上传和新建目录之外的其他权限,如删除、更名等。YES拥有,NO不拥有,默认值为NO。
chown_uploads=YES|NO   
是否修改匿名用户所上传文件的所属主。YES,匿名用户所上传的文件的所有权将改为另外一个不同的用户所有,用户由chown_username参数指定。此选项默认值为NO
chown_username=whoever   
指定拥有匿名用户所上传文件的所属主的用户。此参数与chown_uploads一起用。不推荐使用root用户。
2.本地用户配置选项

local_enable=YES|NO   
控制服务器的本地用户是否可以登录vsftpd。默认值为YES。
 local_root=   
定义所有本地用户的根目录。当本地用户登入时,将被更换到此目录下。默认值为无此配置语句。
 user_config_dir=   
定义用户个人配置文件所在的目录。用户的个人配置文件为该目录下的同名文件。个人配置文件的格式与vsftpd.conf格式相同。例如定义user_config_dir=/etc/vsftpd/userconf,并且主机上有用户zenxiaoxian,那我们可以在user_config_dir的目录新增名为zenxiaoxian的文件。当用户zenxiaoxian登入时,VSFTPD则会读取user_config_dir下zenxiaoxian这个文件中的设定值,应用于用户zenxiaoxian。默认值为无
3.虚拟用户配置选项

guest_enable=YES|NO   
若是启动这项功能,所有的非匿名登入者都视为guest。默认值为关闭。
  guest_username=
  定义VSFTPD的虚拟用户在系统中所映射的本地用户名。默认值为ftp。

4.用户的登陆控制

pam_service_name=vsftpd  指出VSFTPD进行PAM认证时所使用的PAM配置文件名,默认值是vsftpd,默认PAM配置文件是
/etc/pam.d/vsftpd。
/etc/vsftpd/ftpusers  VSFTPD禁止列在此文件中的用户登录FTP服务器。这个机制是在/etc/pam.d/vsftpd中默认设置的。
userlist_enable=YES|NO   
此选项为YES时,VSFTPD将读取userlist_file参数所指定的文件中的用户列表。当列表中的用户登录FTP服务器时,该用户在提示输入密码之前就被禁止了。即该用户名输入后,VSFTPD查到该用户名在列表,VSFTPD就直接禁止掉该用户,不会再进行询问密码等后续步聚。默认值为NO。
userlist_file=/etc/vsftpd/user_list  
 指出userlist_enable选项生效后,被读取的包含用户列表的文件。默认值是/etc/vsftpd/user_list。
userlist_deny=YES|NO   
决定禁止还是只允许由userlist_file指定文件中的用户登录FTP服务器。此选项在userlist_enable 选项启动后才生效。YES,默认值,禁止文件中的用户登录,同时也不向这些用户发出输入口令的提示。NO,只允许在文件中的用户登录FTP服务器。  
tcp_wrappers=YES|NO  
 在VSFTPD中使用TCP_Wrappers远程访问控制机制,默认值为YES
5.用户的目录访问控制

chroot_list_enable=YES|NO  
 锁定某些用户在自家目录中。即当这些用户登录后,不可以转到系统的其他目录,只能在自家目录(及其子目录)下。具体的用户在chroot_list_file参数所指定的文件中列出。默认值为 注释。

chroot_list_file=/etc/vsftpd/chroot_list  
 指出被锁定在自家目录中的用户的列表文件。文件格式为一行一用户。通常该文件是/etc/vsftpd/chroot_list。此选项默认不设置。

chroot_local_users=YES|NO  
 将本地用户锁定在自家目录中。当此项被激活时,chroot_list_enable=YES参数的作用将发生变化,chroot_list_file所指定文件中的用户将不被锁定在自家目录。本参数被激活后,可能带来安全上的冲突

passwd_chroot_enable   
当此选项激活时,与chroot_local_user选项配合,chroot()容器的位置可以在每个用户的基础上指定。每个用户的容器来源于/etc/passwd中每个用户的自家目录字段。默认值为NO
tcp_wrappers=YES <==支持 TCP Wrappers 的防火墙机制

作者:xiguatian
链接:https://www.jianshu.com/p/252f901c5a8a
来源:
著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

你可能感兴趣的:(FTP协议)