在设置ftp经过iptables规则前,须要先了解下ftp工做的两种模式,他们分别是主动模式和被动模式。若是对ftp原理不是很清楚,能够先参考下下面几篇文章。html
一、 FTP主动模式和被动模式的区别linux
二、 Active FTP vs. Passive FTP, a Definitive Explanationruby
简单的说,主动模式是从服务器端向客户端发起链接;被动模式是客户端向服务器端发起链接。二者的共同点是都使用 21端口进行用户验证及管理,差异在于传送数据的方式不一样,PORT模式的FTP服务器数据端口固定在20,而PASV模式则在1025-65535之间 随机。bash
了解ftp原理后,接下来就去设置iptables规则。我本身服务器上默认INPUT规则是DROP,OUTPUT是ACCEPT。服务器
# iptables -A INPUT -p tcp --dport 20 -j ACCEPT
# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
若是OUTPUT默认也是DROP,那么还须要添加一下规则。tcp
# iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
有关related状态的说明:ui
RELATED状态在有双通道的服务中会出现的。好比ftp服务的控制通道和数据通道。client发送syn请求到server的21端口,中间的linux系统变为NEW状态。server回复syn+ack应答包给client,中间的linux变为ESTABLISHED状态。当ftp的控制通道创建完后,会创建数据通道,而数据通道的第一个包就是RELATED状态,之后的包又变成ESTABLISHED状态。spa
# vi /etc/sysconfig/iptables-config
找到IPTABLES_MODULES,取消注释,添加ip_conntrack_ftp模块,保存。ip_conntrack_ftp模块可让iptables支持被动模式的ftp链接。.net
IPTABLES_MODULES="ip_conntrack_ftp"
[root@iZ94myad6wkZ ~]# service iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ] [root@iZ94myad6wkZ ~]# service iptables restart iptables: Setting chains to policy ACCEPT: filter nat [ OK ] iptables: Flushing firewall rules: [ OK ] iptables: Unloading modules: [ OK ] iptables: Applying firewall rules: [ OK ] iptables: Loading additional modules: ip_conntrack_ftp [ OK ]
重启iptables是多了个加载模块的地址,ok正常。rest