简单端口转发

我遇到了一些麻烦,因为我正在尝试设置一个反向代理和第二个服务器。我的想法是让防火墙将https转发到反向代理,并将端口29418(gerrit ssh)转发到第二个服务器。现在我的合作IT人员说:不行!要么两个端口都指向服务器1,要么两个端口都指向服务器2。
好吧,作为一种解决办法,我尝试在反向代理上设置端口转发,将端口29418转发到server2:29418。
详细信息如下:
- Server1 IP:10.0.0.132和192.168.10.2,运行Ubuntu 12.04.2 LTS - Server2 IP:10.0.0.133和192.168.10.3,运行Ubuntu 12.04.2 LTS
现在,防火墙将https和端口29418都转发到10.0.0.132,IT说这是唯一的方法。:(
所以,请告诉我如何将10.0.0.132:29418转发到192.168.10.3:29418或10.0.0.133:29418。
当我在10.0.0.132上工作时,我可以连接到10.0.0.133:29418和192.168.10.3:29418,所以端口是开放的。
-- 更新 --
我的iptables-t nat -L的输出如下:
root@dev:/root# iptables -t nat -L Chain PREROUTING (policy ACCEPT) target prot opt source destination DNAT tcp -- anywhere dev.example.com tcp dpt:29418 to:10.0.0.133
Chain INPUT (policy ACCEPT) target prot opt source destination
Chain OUTPUT (policy ACCEPT) target prot opt source destination
Chain POSTROUTING (policy ACCEPT) target prot opt source destination root@dev:/root# cat /proc/sys/net/ipv4/ip_forward 1

我发现这篇文章很有用。在Linux中启用IP转发的主要问题在"配置防火墙以转发端口80"部分中有描述。 - alireza pirankashani
4个回答

如果有其他人正在寻找真正有效的方法,我在这里提供一个解决方案。虽然@HorsePunchKid的建议是正确的,但我找到了一份详细说明,填补了遗漏的步骤。

http://www.debuntu.org/how-to-redirecting-network-traffic-to-a-new-ip-using-iptables/

本质上说:
启用IP转发:
sysctl net.ipv4.ip_forward=1

添加您的转发规则(使用n.n.n.n:端口):
iptables -t nat -A PREROUTING -p tcp -d 10.0.0.132 --dport 29418 -j DNAT --to-destination 10.0.0.133:29418

请IPtables进行伪装:
iptables -t nat -A POSTROUTING ! -s 127.0.0.1 -j MASQUERADE

就是这样!无论如何,对我来说都有效果 :)

2这是我在这个主题上找到的最好的答案。 - Victor Pudeyev
使用这个解决方案后,我的Docker容器失去了连接。不得不删除规则。规则本来是有效的,但是丢失了所有其他流量。我不推荐使用这个解决方案。 - Dyin
iptables -t nat -A POSTROUTING -j MASQUERADE 哇喔...太厉害了,就是这样,谢谢!花了好几个小时在网上搜索和摸索。这是如此简单而且有效。 - shrimpwagon
它完美地运作着,现在,如何使这些规则永久有效呢? - vmalep
我注意到的一个问题是,当端口转发被激活时,路由器无法再访问apt服务器了...有什么线索吗? - vmalep

如果有人正在寻找一种临时的方法,请尝试以下解决方案。
ssh -L 192.168.0.10:8080:10.0.0.10:80 root@10.0.0.10

以上命令将所有连接重定向到基础机器上的8080端口,以80个虚拟机端口。您可以通过访问网页http://192.168.0.10:8080来测试它是否有效,并且它将显示来自客户机的网页。
这适用于所有端口 :)

如果您在10.0.0.132上安装了iptables,我认为这将会非常简单:
iptables -t nat -A PREROUTING -j DNAT -d 10.0.0.132 -p tcp --dport 29418 --to 10.0.0.133

这段话的意思是将进入端口29418的流量发送到10.0.0.132,然后转发到10.0.0.133的相同端口,而不是让10.0.0.132尝试进行其他路由。如果您运行此命令时遇到问题,请将-A标志替换为-D以删除它。
如果您希望在10.0.0.132启动时自动运行此规则,请考虑将上述命令作为“post-up”规则添加到/etc/network/interfaces中。

1这正是我所做的,但没有起作用。我已经在/etc/sysctl.conf中取消了net.ipv4.ip_forward = 1的注释,但我仍然无法连接到10.0.0.132:29418并出现错误。 - uncletall

最后我不得不在我的ESXi服务器上安装pfSense作为路由器,将流量路由到不同的虚拟机,因为我无法在Ubuntu中使其正常工作。