我正在尝试使用 IPTables 转发 FTP 服务器。FTP 服务器在 Windows 2008 机器 (Cerberus) 上运行。
赢奖箱详情:
- IP:192.168.220.51
- FTP 端口:21
- PASV 端口:11000-13000
FTP 服务器在 LAN 中运行良好。
路由器对其他客户端(服务 NAT、DHCP、防火墙等)运行良好。我需要将 FTP 服务转发到外部世界,但我无法使用端口 20-21(已被占用)。
我尝试了这个,但是没有用:
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 2121 -j DNAT --to 192.168.220.51:21
当前 IPTables 配置:
[root@router ~]# service iptables status
Table: nat
Chain PREROUTING (policy ACCEPT)
num target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
num target prot opt source destination
1 MASQUERADE all -- 0.0.0.0/0 0.0.0.0/0
2 MASQUERADE all -- 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Table: filter
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 127.0.0.1 0.0.0.0/0
2 DROP all -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:2222
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:68
6 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:1194
7 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
8 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
9 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3128
10 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
11 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
12 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:1194
13 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
14 DROP udp -- 0.0.0.0/0 0.0.0.0/0
15 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp flags:0x17/0x02
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
任何帮助都将非常有帮助:-)。
悬赏-编辑:我一直没能弄清楚这一点,如能得到任何帮助我将非常感激。
编辑2
运行以下命令后,我现在就能够 telnet 到我的 FTP 服务器了:
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 2121 -j DNAT --to 192.168.220.51:21
我开始到达那里...我想我现在只需要让我的 PASV 端口工作起来......
EDIT3:额外信息
[root@router ~]# iptables -L -n -v
Chain INPUT (policy ACCEPT 3251 packets, 154K bytes)
pkts bytes target prot opt in out source destination
540 48534 ACCEPT all -- * * 127.0.0.1 0.0.0.0/0
4270K 5625M ACCEPT all -- * * 192.168.220.0/24 0.0.0.0/0
0 0 DROP all -- eth1 * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:2222
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:68
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:1194
65 8487 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
8 404 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3128
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:1194
63870 81M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
974 224K DROP udp -- * * 0.0.0.0/0 0.0.0.0/0
638 34956 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x17/0x02
Chain FORWARD (policy ACCEPT 3578K packets, 3355M bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 2275K packets, 703M bytes)
pkts bytes target prot opt in out source destination
[root@router ~]# iptables -L -n -v -t nat
Chain PREROUTING (policy ACCEPT 33954 packets, 2595K bytes)
pkts bytes target prot opt in out source destination
0 0 DNAT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:2121 to:192.168.220.51:21
Chain POSTROUTING (policy ACCEPT 5925 packets, 699K bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- * eth1 0.0.0.0/0 0.0.0.0/0
27170 1785K MASQUERADE all -- * eth0 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 5777 packets, 457K bytes)
pkts bytes target prot opt in out source destination
解决方案
这就是我所做的,可能不是很漂亮,但它有效。
[root@router ~]# iptables -t nat -I PREROUTING -p tcp --dport 2121 -j DNAT --to 192.168.220.51:2121
[root@router ~]# iptables -I FORWARD -p tcp -d 192.168.220.51 --dport 2121 -j ACCEPT
[root@router ~]# iptables -t nat -I PREROUTING -p tcp --dport 11000:13000 -j DNAT --to 192.168.220.51:11000-13000
[root@router ~]# iptables -I FORWARD -p tcp -d 192.168.220.51 --dport 11000:13000 -j ACCEPT
一些额外说明:FTP 服务器正在监听 21 和 2121 机器人,PASV 范围设置为 11000 至 13000
答案1
为了使被动支持发挥作用,你需要转发被动的端口到内部 FTP 服务器相同的端口号。
简单的解决方案:一直转发所有
互联网IP:11000-13000 --> 192.168.220.51:11000-13000
更难的解决方案:
您将需要一些专用的连接跟踪代理来读取 FTP 协议并及时进行正确的 NAT 映射。看起来 ip_conntrack_ftp 可以做到这一点。
答案2
我相信您需要加载 FTP 连接跟踪模块。
http://www.sns.ias.edu/~jns/wp/2006/01/12/iptables-connection-tracking-ftp/
答案3
iptables -t nat -I PREROUTING -p tcp --dport 2121 -j DNAT --to 192.168.220.51:2121
iptables -I FORWARD -p tcp -d 192.168.220.51 --dport 2121 -j ACCEPT
modprobe nf_conntrack_ftp
modprobe nf_nat_ftp
应该足够了