编辑:使用我在这里找到的信息解决Debian 上的 iptables 端口转发
我正在尝试在现有的 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 上打开端口,因为端口扫描显示在运行上述脚本后我尝试使用的端口已关闭。
任何帮助,将不胜感激。
答案1
一些建议:
1) 如果要将内容添加到表的底部,请使用“-A PREROUTING”。如果要将一堆内容添加到顶部,请删除数字。默认情况下,-I 使用 1。如果您添加其他行,这可以节省您重新编号行的时间。
2) 顶部有 /bin/bash 和 /bin/sh。删除 /bin/sh。同时有这两个文件不会有任何作用,但可能会造成混淆。
3) 否定对 root 的检查,并将脚本主体从 if 语句中取出。这会使代码更简洁。我可能还会废弃 ROOT_UID 变量,因为您只使用它一次,并且条件和错误消息清楚地表明了您正在检查什么。
最后,也可能是最重要的一点,不要手动编写 iptables 规则。使用 shorewall 之类的东西,让它处理复杂性。你可以用类似以下内容替换你的脚本:
DNS/DNAT net loc:10.0.0.9 - - - 83.100.256.28
这意味着将来自 Internet 区域的任何 DNS 流量重定向到本地网络上的 83.100.256.28 到 10.0.0.9。它将添加您需要的所有 iptables 规则。