我进行过多次搜索,每次都学到一点东西,但却没有找到解决我的问题的方法。
我已设置 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
我使用以下方法加载它们(出于测试目的):
iptables-restore < /etc/iptables.test.rules
作为参考,我正在运行 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
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
另外我的 vsftpd.conf 被动端口设置如下:
pasv_min_port=50000
pasv_max_port=60000
我也尝试过使用 加载模块,modprobe ip_conntrack_ftp
但似乎不起作用。通过上面的输出,似乎模块甚至不在系统中,或者已被nf_conntrack_ftp
... nf_ modules ...取代
最终编辑
所以我想我找到了答案:http://www.shorewall.net/FTP.html#Conntrack
由于 ftp 辅助模块必须读取和修改通过命令通道发送的命令,所以当通过使用 TLS/SSL 加密命令通道时,它们将无法工作。
此外,另一个引起一些困惑的有趣事实是为什么我有nf_conntrack
vs。ip_conntrack
如果您运行的是内核 2.6.19 或更早版本,则模块名称为 ip_nat_ftp 和 ip_conntrack_ftp
测试uname -r
(获取内核版本)
我已通过禁用 TLS/SSL 测试了上述操作,PASV 运行良好RELATED,ESTABLISHED
。然而,我想要使用 TLS/SSL 的主要原因是用户名/密码不会以明文形式发送。
答案1
如果你加载内核模块,ip_conntrack_ftp
这应该有助于解决你的问题。你可以使用以下命令加载模块
modprobe ip_conntrack_ftp
答案2
这个是不正确:
-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
答案3
识别通常大于 1023 的被动端口。
-A INPUT -p tcp --dport 50000:60000 -m state --state RELATED,ESTABLISHED -j ACCEPT
使用被动模式使用的端口范围修改此行。