使用iptables进行端口转发

我有一个奇怪的networking拓扑,我试图转发端口失败。

事情是,我有一个公共服务器,所有的端口必须从路由器转发到同一个服务器(DMZ)。

我的拓扑:

internet | router | /----+--+------\ | | | pc1 server etc 

服务器使用iptables运行linux(ubuntu)。 防火墙configuration非常像这样:

 iptables -P INPUT DROP iptables -P FORWARD DROP iptables -t nat -P PREROUTING ACCEPT iptables -t nat -P POSTROUTING ACCEPT # for every port I accept on the server (this part works perfectly) iptables -A INPUT -p tcp --dport xxxx -j ACCEPT # for every port I want to forward to pc1 (this is the part that doesn't work) iptables -A FORWARD -p tcp --dport xxxx -j ACCEPT iptables -t nat -P PREROUTING -p tcp --dport xxxx -j DNAT --to $PC1_IP # I've also tried with the following line: iptables -t nat -P POSTROUTING -p tcp --sport xxxx -j SNAT --to $PC1_IP 

但转发似乎并没有工作。

当我启用转发时,连接可以连接(或似乎可以)但不传输数据。 也许他们只是超时。
当我不启用所述转发时,连接立即被拒绝。

目标电脑已被检查,它可以接受连接。

我也试过在两台机器上用Wireshark嗅探一下。 在服务器上,数据包被接受,但没有find外出的数据包(我想如果实际发生DNAT重新路由,应该有一个数据包)。 在pc1 ,没有收到数据包。

任何人都可以build议一个修复 我一直在Google上search几天,我已经尝试了几个设置这个端口 – 他们都没有工作。

尝试添加

 echo 1 > /proc/sys/net/ipv4/ip_forward 

在linux上启用路由

 iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT 

否则本地PC的响应将不会被转发回互联网。

你也可以使用:

 iptables -t nat -P PREROUTING -p tcp --dport xxxx -d your.public.ip.addr -j DNAT --to $PC1_IP 

如果遵守规则 – 从本地networking发送到端口xxxx的stream量将被转发到$ PC1_IP