iptables:转发ssh端口

我有一个服务器有两个网卡:eth4 – 在外部networking上侦听。 eth1 – 与机器Y在同一个networking上。

我希望能够通过执行ssh server -p 1234从外部networkingssh到机器Y.

我已经提出了以下规则:

iptables -A PREROUTING -i eth4 -t nat -p tcp --dport 1234 -m state --state NEW,ESTABLISHED,RELATED -j DNAT --to-destination $MACHINE_Y_IP:22

iptables -A FORWARD -i eth4 -o eth1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

当我尝试SSH时,连接不会马上被拒绝,但感觉就像iptables没有转发数据包一样。 任何线索,我可能做错了什么? 操作系统是SLES,如果这对语法很重要。

编辑: sysctl net.ipv4.ip_forward报告net.ipv4.ip_forward = 1

iptables-save生成:

 `# Generated by iptables-save v1.4.2-rc1 on Fri Nov 12 10:28:26 2010 *mangle :PREROUTING ACCEPT [48787:5748712] :INPUT ACCEPT [48725:5742333] :FORWARD ACCEPT [29:1740] :OUTPUT ACCEPT [25938:4009532] :POSTROUTING ACCEPT [25967:4011272] COMMIT # Completed on Fri Nov 12 10:28:26 2010 # Generated by iptables-save v1.4.2-rc1 on Fri Nov 12 10:28:26 2010 *nat :PREROUTING ACCEPT [68959:12817029] :POSTROUTING ACCEPT [19579:1207747] :OUTPUT ACCEPT [19566:1206967] -A PREROUTING -i eth4 -p tcp -m tcp --dport 1234 -m state --state NEW,RELATED,ESTABLISHED -j DNAT --to-destination xxxx:22 COMMIT # Completed on Fri Nov 12 10:28:26 2010 # Generated by iptables-save v1.4.2-rc1 on Fri Nov 12 10:28:26 2010 *filter :INPUT ACCEPT [60982622:59727981305] :FORWARD ACCEPT [10:600] :OUTPUT ACCEPT [32438834:64059260511] -A FORWARD -i eth4 -o eth1 -p tcp -m tcp --dport 22 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT COMMIT # Completed on Fri Nov 12 10:28:26 2010` 

规则应该看起来像这样。

 iptables -t nat -I PREROUTING -p tcp -i eth4 --dport 1234 -j DNAT --to server:22 iptables -A FORWARD -i eth4 -o eth1 -p tcp --dport 22 -j ACCEPT 

不要打扰在状态模块中混合。 这很可能是导致你的问题的原因。 NAT模块将保持您需要的状态。

哦,确保你也打开了ip_forwarding;)

以下是我的工作规则 – 但我使用状态模块:

 *nat :PREROUTING ACCEPT [101:9081] :POSTROUTING ACCEPT [89:5340] :OUTPUT ACCEPT [209:13346] # DNAT to local ip #-A PREROUTING -p tcp --dport $FW_EXTERNAL_PORT -d $FW_EXTERNAL_IP -j DNAT --to-destination $INTERNAL_MACHINE_IP:$INTERNAL_MACHINE_PORT # ssh to server 192.168.0.3 -A PREROUTING -p tcp --dport 1234 -d 10.10.10.10 -j DNAT --to-destination 192.168.0.3:22 ... COMMIT *filter :INPUT ACCEPT [5583:2021142] :FORWARD DROP [24:2378] :OUTPUT ACCEPT [6291:2229990] #rules for DNAT #-A FORWARD -p tcp --dport $INTERNAL_MACHINE_PORT -d $INTERNAL_MACHINE_IP -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT # SSH to 192.168.0.3 -A FORWARD -p tcp --sport 22 -s 192.168.0.3 -j ACCEPT -A FORWARD -p tcp --dport 22 -d 192.168.0.3 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT ... COMMIT 

我希望你的iptablesconfiguration比你给我们的更多。 在*filter表中,INPUT默认设置为接受。 对于那些对iptables来说不熟悉的人来说,他们可能会接受并运行,并将其系统暴露出来。 您可能希望将filter中的默认链设置为DROP,然后只打开您希望到达您的盒子的端口,否则您将拥有一个“chain-link fence”而不是防火墙。 用你的POSTROUTING规则,它可以工作,但是你必须为每个打开的端口创build一个类似的规则。 就像这样[iptables -A POSTROUTING -t nat -o eth4 -j SNAT -to pu.bl.ic.ip]将适用于所有进入外部接口的端口。 在FORWARD链条中,使用“腰带和吊带”来保护您的包装箱是一个不错的主意。 你可以添加-s yo.ur.ext.ip,所以如果其他人尝试访问该端口,他们将被丢弃。 我希望这可以帮助别人。