![使用 IPTables 允许 FTP](https://linux22.com/image/487731/%E4%BD%BF%E7%94%A8%20IPTables%20%E5%85%81%E8%AE%B8%20FTP.png)
我当前的场景涉及允许各种规则,但我需要 ftp 可以从任何地方访问。操作系统是 Cent 5,我正在使用 VSFTPD。我似乎无法获得正确的语法。所有其他规则都正常工作。
## Filter all previous rules
*filter
## Loopback address
-A INPUT -i lo -j ACCEPT
## Established inbound rule
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
## Management ports
-A INPUT -s x.x.x.x/24 -p icmp -m icmp --icmp-type any -j ACCEPT
-A INPUT -s x.x.x.x/23 -p icmp -m icmp --icmp-type any -j ACCEPT
-A INPUT -s x.x.x.x/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -s x.x.x.x/23 -p icmp -m icmp --icmp-type any -j ACCEPT
-A INPUT -s x.x.x.x/23 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -i lo -j ACCEPT
## Allow NRPE port (Nagios)
-A INPUT -s x.x.x.x -p tcp -m state --state NEW -m tcp --dport 5666 -j ACCEPT
-A INPUT -s x.x.x.x -p tcp -m state --state NEW -m tcp --dport 5666 -j ACCEPT
##Allow FTP
## Default rules
:INPUT DROP [0:0]
:FORWARD DROP
:OUTPUT ACCEPT [0:0]
COMMIT
以下是我尝试过的规则。
##Allow FTP
-A INPUT --dport 21 any -j ACCEPT
-A INPUT --dport 20 any -j ACCEPT
-A INPUT -p tcp --dport 21 -j ACCEPT
-A INPUT -p tcp --dport 20 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 20 -j ACCEPT
-A INPUT -p tcp -s 0/0 -d 0/0 --destination-port 20 -j ACCEPT
-A INPUT -p tcp -s 0/0 -d 0/0 --destination-port 21 -j ACCEPT
-A INPUT -s 0.0.0.0/0 -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
-A INPUT -s 0.0.0.0/0 -p tcp -m state --state NEW -m tcp --dport 20 -j ACCEPT
答案1
这是我向人们推荐的文档,以便他们可以遵循 FTP 协议:http://slacksite.com/other/ftp.html
- 要执行主动模式 FTP,您需要允许到 TCP 端口 21 的传入连接和从端口 20 的传出连接。
- 要执行被动模式 FTP,您需要允许传入连接到 TCP 端口 21 以及传入连接到服务器计算机上的随机生成的端口(需要在 netfilter 中使用 conntrack 模块)
您的帖子中没有关于 OUTPUT 链的任何内容,因此我也会在此处包含该内容。如果您的 OUTPUT 链是 default-drop,那么这很重要。
将这些规则添加到您的 iptables 配置中:
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
为了支持被动模式 FTP,您需要在启动时加载 ip_conntrack_ftp 模块。取消注释并修改 /etc/sysconfig/iptables-config 文件中的 IPTABLES_MODULES 行,如下所示:
IPTABLES_MODULES="ip_conntrack_ftp"
保存 iptables 配置并重新启动 iptables。
service iptables save
service iptables restart
要完全排除 VSFTPD 的问题,请停止 VSFTPD,使用“netstat -a”验证它没有监听端口 21,然后运行:
nc -l 21
这将启动 netcat 监听端口 21,并将输入回显到您的 shell。从另一台主机,TELNET 到您的服务器的端口 21,并验证您是否获得了 TCP 连接,以及在输入 TELNET 连接时您是否在 shell 中看到输出。
最后,重新启动 VSFTPD,验证它是否正在监听端口 21,然后尝试再次连接。如果与 netcat 的连接有效,则您的 iptables 规则没有问题。如果在 netcat 连接成功后与 VSFTPD 的连接无效,则您的 VSFTPD 配置存在问题。
答案2
尝试此规则。注意:$EXTIP
是 FTP 服务器的外部 IP 地址。
-A INPUT -i $EXTIP -m state --state NEW,ESTABLISHED,RELATED -p TCP -s 0.0.0.0 -d $EXTIP --dport 21 -j ACCEPT
答案3
在我的例子中,我缺少 ip_conntrack_ftp 内核模块。需要加载它。因此,您可以尝试以下操作:
modprobe ip_conntrack_ftp
并将 ip_conntrack_ftp 添加到 /etc/modules,以便它在重启后可以工作