sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD DROP
sudo iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 21 -j ACCEPTsudo iptables -A INPUT -p tcp --dport 20 -j ACCEPT
sudo iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
参考:
http://lumingming1987.iteye.com/blog/1044358
这里先说说FTP传输的两种模式吧:
在正常模式下﹕
1. FTP client 开启一个随机选择的高于 1024 的 port 呼叫 FTP server 的 port 21
请求联机。当顺利完成 Three-Way Handshake 之后﹐联机就成功建立﹐但这仅是命
令通道的建立。
2. 当两端需要传送数据的时候﹐client 透过命令通道用一个 port 命令告诉 server
﹐客户端可以用另一个高于 1024 的 port 做数据信道﹐并准备好 socket 资源。
3. 然后 server 用 port 20 和刚才 client 所告知的 socket 建立数据联机。请注意
﹕联机方向这是从 server 到 client 的﹐TCP 封包会有一个 SYN 旗标。
4. 然后 client 会返回一个带 ACK 旗标的确认封包﹐并完成另一次的 Three-Way
Handshake 手续。这时候﹐数据信道才能成功建立。
5. 开始数据传送。
在 passive 模式下﹕
1. FTP client 开启一个随机选择的高于 1024 的 port 呼叫 FTP server 的 port 21
请求联机﹐并完成命令通道的建立。
2. 当两端需要传送数据的时候﹐client 透过命令通道送一个 PASV 命令给 server﹐
要求进入 passive 传输模式。
3. 然后 server 像上述的正常模式之第 2 步骤那样﹐挑一个高于 1024 的 port ﹐
并用命令通道告诉 client 关于 server 端用以做数据信道的 socket。
4. 然后 client 用另一个高于 1024 的 port 呼叫刚才 server 告知的 scoekt 来建
立数据信道。此时封包带 SYN 标签。
5. server 确认后回应一个 ACK 封包。并完成所有交握手续﹑成功建立数据信道。
6. 开始数据传送。
iptables会自上而下的对比规则﹐找到符合的就不再往下找了。根据这样的特性﹐我们可以将 NAT 外部界面进入的某些联机﹐在那行 syn 过滤规则之前 ACCEPT 进来。
iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT这条命令可以解决问题, 只开了20 21 是没用的,要是连被动的ftp服务器,边上21后,服务器端是随机端口和你的连接的,,ESTABLISHED,RELATED -j ACCEPT 可以解决此问题