一、说明
FTP端口说明:
FTP仅基于TCP的服务,不支持UDP。FTP协议在工作时会开启两个端口,一个用于服务器与客户机之间的传输控制命令(通常为21号端口);
一个用于传输数据,并且根据实际情况而定,有主动、被动模式之分;
而主动、被动模式这个概念是相对与服务器端而言。
二、主动模式
1、工作模式:客户端指定数据传输端口,服务器主动去连接客户端,这就是FTP的主动模式
2、
客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的命令端口,也就是21端口。然后客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)。
针对FTP服务器前面的防火墙来说,必须允许以下通讯才能支持主动方式FTP:
1. 任何大于1024的端口到FTP服务器的21端口。(客户端初始化的连接,连接至命令端口使客户端能够发送FTP命令“port N+1”到FTP服务器)
2. FTP服务器的21端口到大于1024的端口。 (服务器响应客户端的控制端口)
3. FTP服务器的20端口到大于1024的端口。(服务器端初始化数据连接到客户端的数据端口,保障数据能够顺利传输)
4. 大于1024端口到FTP服务器的20端口(客户端发送ACK响应到服务器的数据端口)
主动 FTP:
命令连接:客户端 >1024端口 -> 服务器 21端口
数据连接:客户端 >1024端口 <- 服务器 20端口
三、被动模式
在被动模式中,命令连接和数据连接都是客户端发起的,这样就可以避免从服务器到客户端的数据端口方向上被防火墙过滤掉的问题。
当开启一个FTP连接时,客户端会打开两个任意的非特权本地端口(n>1024,n+1)。第一个端口连接服务器端的21号端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交 PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。
对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP:
1. 从任何大于1024的端口到服务器的21端口(客户端初始化的连接)
2. 服务器的21端口到任何大于1024的端口(服务器响应到客户端的控制端口的连接)
3. 从任何大于1024端口到服务器的大于1024端口(客户端初始化数据连接到服务器指定的任意端口)
4. 服务器的大于1024端口到远程的大于1024的端口(服务器发送ACK响应和数据到客户端的数据端口)
被动 FTP:
命令连接:客户端 >1024端口 -> 服务器 21端口
数据连接:客户端 >1024端口 -> 服务器 >1024端口
四、Linux下配置防火墙
方法一:
可以通过修改配置文件,修改被动模式下,开放端口范围
#vim /etc/vsftpd/vsftpd.conf
在一行添加如下内容:
pasv_min_port=10050 (设置被动模式的端口范围)
pasv_max_port=10060(设置被动模式的端口范围)
然后通过修改iptables,运行端口访问
#vim /etc/sysconfig/iptables
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10050:100060 -j ACCEPT
方法二:
1、
iptables 的filter表的INPUT链的默认策略设为了DROP,其余的链均为ACCEPT。 该服务器即要作ftp服务器,也要连上别的ftp服务器。即是说要把源端口和目的端口都开放21才行:
iptables -A INPUT -p tcp –sport 21 -j ACCEPT
iptables -A INPUT -p tcp –dport 21 -j ACCEPT
加载模块:
modprobe ip_nat_ftp
modprobe ip_conntrack
modprobe ip_conntrack_ftp
2、
处于server
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
处于client
iptables -A OUTPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
允许连接保持的被动访问。
其实这样在重启iptables的时候所需的模块又不见了,
可以通过编辑
vim /etc/sysconfig/iptables-config:
IPTABLES_MODULES="ip_conntrack_ftp"
IPTABLES_MODULES="ip_nat_ftp"
把需要加载的模块加入,无论重启系统还是iptables但ftp模块始终还是加载的。