使用 iptables 转发端口

使用 iptables 转发端口

编辑:使用我在这里找到的信息解决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 规则。

相关内容