工作流程分为两种模式:
主动和被动模式:
FTP一种是主动模式,一种是被动模式,以FTP Server为参照,主动模式:服务器主动连接客户端传输;被动模式:等待客户端连接。
FTP会话包含了两个通道,控制通道和数据传输通道,控制命令通道使用21端口,数据传输通道使用20端口。
主动模式工作流程:
FTP客户端使用一个随机高位端口A连接到FTP服务器的21号端口,发送用户名和密码,客户端开放一个随机高位端口B(1024以上),发送PORT命令到FTP服务器,告知服务器客户端采用主动模式并开放随机高位端口B,FTP服务器收到PORT主动模式命令和端口后,通过服务器的20端口和客户端开放的随机高位端口B连接,发送数据。(无论是主动还是被动模式,首先控制通道都是先建立起来,只是数据传输模式上的区别)
linux 2.6的内核的随机端口范围默认是32768 到61000 ,高位端口指1024,
被动模式的工作原理:
PASV是Passive的缩写,中文被动模式,工作原理:FTP客户端使用随机高位端口A连接到FTP服务器所监听的21号端口,发送用户名和密码,发送PASV命令到FTP服务器,服务器在本地随机开放一个高位端口(1024以上),然后把开放的端口告知客户端,而后客户端使用随机高位端口B连接到服务器开放的随机高位端口进行数据传输。
以上说明主动和被动是相对于FTP server端而言,如果server去连接client开放的端口,说明是主动,相反,如果是client去连接server开放的端口,则是被动。
vim /etc/vsftpd/vsftpd.conf
connect_from_port_20=YES # YES为主动模式
connect_from_port_20=YES 主动模式端口为20(该项配置文件默认已经添加)
ftp_data_port=20 指定主动模式的端口,默认没有添加,手动添加
被动模式端口范围(默认没添加,手动添加):
pasv_min_port=6000 (0为随机分配)
pasv_max_port=6010(这两项定义了可以同时执行下载链接的数量。)
iptables -R INPUT 8 -m multiport -p tcp --dports 22,6000:6010 -j ACCEPT
43 connect_from_port_20=NO
44 ftp_data_port=20
45 pasv_min_port=6000
46 pasv_max_port=6010
当vsftpd.conf 配置了 pasv_min_port=6000 pasv_max_port=6010,即使connect_from_port_20=YES ,仍然使用被动模式,服务器会开放6000-6010中的一个端口,但是防火墙没开放6000-6010端口的话,客户端仍然连接失败。如下图。
当防火墙放行6000-6010端口后,客户端连接成功,netstat -lnput | grep ftp 就不会显示出6000范围端口的进程了。
iptables -A INPUT -p tcp -m multiport --dports 20,21,22,80,6000:6010 -j ACCEPT