使用 IPTables 允许 FTP

使用 IPTables 允许 FTP

我当前的场景涉及允许各种规则,但我需要 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,以便它在重启后可以工作

相关内容