使用iptables转发端口

编辑:解决使用信息我在这里find了iptables在debian上的端口转发

我试图在现有的Web服务器上设置svn,由于某种原因,我用于通过路由器转发到Web服务器的相同技术不适用于svn的不同端口。 我写了下面这个简单的shell脚本来添加一个服务器

#!/bin/bash #!/bin/sh ROOT_UID=0 if [ $UID -ne $ROOT_UID ] then echo "You must be root." exit 87 else echo "Adding FORWARD entry..." iptables -I FORWARD 5 -p tcp -i eth1 -d $1 --dport $3 -j ACCEPT echo "Adding PREROUTING entries..." iptables -t nat -I PREROUTING 1 -p tcp -i eth1 --dport $3 -j DNAT --to $1:$3 iptables -t nat -I PREROUTING 2 -p tcp -i ath0 -d $2 -j DNAT --to $1:$3 iptables -t nat -I PREROUTING 3 -p tcp -i eth2 -d $2 -j DNAT --to $1:$3 echo "Adding POSTROUTING entry..." iptables -t nat -A POSTROUTING -p tcp -o eth2 -d $1 --dport $3 -j MASQUERADE echo "Done" exit 0 fi 

其中$ 1是服务器的内部IP,$ 2是外部主机名,$ 3是端口。 我也试着打开input端口作为端口扫描显示,我试图使用的端口运行上述脚本后closures。

任何帮助,将不胜感激。

一些build议:

1)如果你要把东西添加到表格的底部,使用“-A PREROUTING”。 如果你想添加一堆东西到顶部,请删除数字。 默认情况下,我使用1.这样可以节省您不必重新编号的行,如果你添加额外的行。

2)你有两个/ bin / bash和/ bin / sh在顶部。 放下/ bin / sh。 两者都不会做任何事情,但可能会让人困惑。

3)取消你的根检查,把脚本的主体从if语句中取出。 这使得代码更清晰。 我可能也会废除ROOT_UIDvariables,因为你只使用一次,条件和错误消息明确你正在检查什么。

最后,也许最重要的是,不要手工编写iptables规则。 使用类似shorewall的东西,让它处理复杂性。 你可以用类似的东西replace你的脚本:

 DNS/DNAT net loc:10.0.0.9 - - - 83.100.256.28 

这意味着将来自Internet区域的任何DNSstream量redirect到本地networking上的最初的83.100.256.28到10.0.0.9。 它会添加你需要的所有iptables规则。