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

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

因此,我在 AWS 上设置了 2 个实例,以便我可以从我的家用机器 C 直接通过 SSH 进入它们(A、B)。

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

IPtables 似乎就是我想要的(rinetd 不错,但似乎该项目已经失败并且它仅涵盖 TCP)。

我遵循了各种教程,但它们似乎不起作用+我认为无论如何我都需要另一条规则。

这些是我在盒子 A 上配置的规则,用于将 SSH 会话通过盒子 A 转发到盒子 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”,然后“当我将修改后的数据包发送回网络时,将其源更改为我自己(A)”

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

我想知道如何让盒子 A 从盒子 B 那里获取响应,并修改它们的源为自身 + 再将它们转发回盒子 C...

答案1

首先,我认为您可能需要启用 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 查看这些进出的数据包是否真的被修改了。

相关内容