使用AWS上的iptables进行NAT TCP / UDP连接

所以我在AWS上设置了2个实例,所以我可以直接从我的家用机器(A,B)连接到它们。

但我想设置框A,以便我可以将某些UDP和TCP连接从它转发到框B.

IPtables似乎是我想要的(rinetd会很好,但似乎项目已经死了,而且只覆盖了TCP)。

我跟着各种教程,但他们似乎并没有工作+我想我会需要另一个规则无论如何。

这些是我在框A上configuration它们的规则,用于通过框A转发SSH会话到B:

iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 1044 -j DNAT --to-destination B:22 iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source A 

我把它看作'把端口1044上接收到的TCP数据包,把它们的目的地从A框改成B框',然后'当我把修改过的数据包发送回networking时,把它们的源改成我自己(A)'

教程似乎认为只有这两个命令是需要的,但它们不起作用。

我想知道如何方块A应该从B的反应,并修改他们的来源本身+转发他们回到C …

首先,我认为你可能需要启用IP转发。

sysctl -w net.ipv4.ip_forward = 1

让你的机器成为一个路由器。 关于IP转发的全部细节在这里 。

其次,我不会发誓,但是你的iptables规则对我来说是错误的。 看来你需要更多这样的东西:

 iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 1044 -j DNAT --to-destination B:22 iptables -A FORWARD -p tcp -d B --dport 22 -j ACCEPT 

如果您的默认策略是接受,您可能不需要第二行,那么可能只是您没有启用IP转发。 然而,你在做什么有点奇怪,数据包进出相同的接口。 我从来没有尝试过。

你的第二个POSTROUTING行,这似乎是错误的或误导。 如果您完全需要这条线路,您可能需要将滤波器缩小到端口22到B.

另外,tcpdump是你的朋友! 使用tcpdump来查看这些进出的数据包是否真的被修改。