为 FTP PASV 模式连接设置 Linux iptables

far*_*ace 4 linux iptables connection ftp

我一直在进行大量搜索,每次都学到了一些东西,但还没有找到解决我的问题的方法。

我有 vsftpd 设置,使用 SSL/TLS 我让它按照我的需要工作,但我无法应用下面的 iptable 规则。主要是 PASV 模式不起作用。随着iptables -F一切正常。只要我应用下面的规则,它就会连接,但客户端(CuteFTP)尝试进入 PASV 模式,它会超时。

我的ip表规则如下:

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# ssh
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

# web
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

# ssl
#-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

# subversion
-A INPUT -p tcp -m tcp --dport 3690 -j ACCEPT

# ftp + active ftp + pasv ftp
-A INPUT -p tcp --dport 21 -m state --state ESTABLISHED,NEW -j ACCEPT
-A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
-A INPUT -p tcp --dport 50000:60000 -m state --state RELATED,ESTABLISHED -j ACCEPT

# mysql
-A INPUT -p tcp -m tcp --dport 3306 -s 67.181.185.126 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -s 98.224.120.34 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -s 174.143.169.230 -j ACCEPT

# ping
-A INPUT -p icmp -j ACCEPT


-A INPUT -i lo -j ACCEPT
-A INPUT -j DROP
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
COMMIT
Run Code Online (Sandbox Code Playgroud)

我使用(用于测试目的)加载它们:

iptables-restore < /etc/iptables.test.rules
Run Code Online (Sandbox Code Playgroud)

作为参考,我正在运行 Ubuntu 10.04 LTS 另外这里是我使用以下命令获得的一些输出:

lsmod

Module                  Size  Used by
xt_conntrack            2303  1
xt_helper               1155  0
nf_nat_ftp              1751  0
nf_nat                 12653  1 nf_nat_ftp
ipv6                  220702  16
xt_state                1215  4
nf_conntrack_ftp        5108  1 nf_nat_ftp
nf_conntrack_ipv4       9505  7 nf_nat
nf_conntrack           43972  7 xt_conntrack,xt_helper,nf_nat_ftp,nf_nat,xt_state,nf_conntrack_ftp,nf_conntrack_ipv4
iptable_filter          2218  1
ip_tables              13794  1 iptable_filter
nf_defrag_ipv4          1051  1 nf_conntrack_ipv4
dm_mirror              11338  0
dm_region_hash          6224  1 dm_mirror
dm_log                  7341  2 dm_mirror,dm_region_hash
dm_snapshot            23956  0
dm_mod                 50258  3 dm_mirror,dm_log,dm_snapshot
Run Code Online (Sandbox Code Playgroud)

locate _ftp

/lib/modules/2.6.33.5-rscloud/kernel/net/ipv4/netfilter/nf_nat_ftp.ko
/lib/modules/2.6.33.5-rscloud/kernel/net/netfilter/ipvs/ip_vs_ftp.ko
/lib/modules/2.6.33.5-rscloud/kernel/net/netfilter/nf_conntrack_ftp.ko
/lib/security/pam_ftp.so
/usr/share/man/man8/pam_ftp.8.gz
Run Code Online (Sandbox Code Playgroud)

另外我的 vsftpd.conf 被动端口设置如下:

pasv_min_port=50000
pasv_max_port=60000
Run Code Online (Sandbox Code Playgroud)

我也试过加载模块,modprobe ip_conntrack_ftp但这似乎不起作用。通过上面的输出,似乎该模块甚至不在系统上或被nf_conntrack_ftp...... nf_ modules ...

最终编辑

所以我想我找到了答案:http : //www.shorewall.net/FTP.html#Conntrack

由于 ftp 帮助程序模块必须读取和修改通过命令通道发送的命令,因此当通过使用 TLS/SSL 对命令通道进行加密时,它们将无法工作。

另外另一个引起一些混乱的有趣事实是为什么我有nf_conntrackvs ip_conntrack.

如果您运行的是内核 2.6.19 或更早版本,则模块名称为 ip_nat_ftp 和 ip_conntrack_ftp

测试uname -r(获取内核版本)

我已经通过禁用 TLS/SSL 测试了上述内容,并且 PASV 与RELATED,ESTABLISHED. 然而,我想使用 TLS/SSL 的主要原因是用户名/密码不会以明文形式发送。

小智 5

这是不正确的:

-A INPUT -p tcp --dport 50000:60000 -m state --state RELATED,ESTABLISHED -j ACCEPT

它应该是 :

-A INPUT -p tcp --dport 50000:60000 -m state --state RELATED,ESTABLISHED,NEW -j ACCEPT


poi*_*ige 2

如果您加载内核模块,ip_conntrack_ftp这应该有助于解决您的问题。您可以使用以下命令加载模块

modprobe ip_conntrack_ftp

  • 内核 &gt;= 4.7 中发生了一些变化,需要一些额外的更改才能正常工作:`echo "1" &gt; /proc/sys/net/netfilter/nf_conntrack_helper`,请参阅[这个问题](http://unix.stackexchange. com/a/308357/165251)了解详细信息。 (4认同)