NAT 会重写数据包中的源 IP 吗?

NAT 会重写数据包中的源 IP 吗?

我正在尝试设置端口转发,以便特定 IP(例如 1.2.3.4/32)可以通过堡垒(例如 5.5.5.5:2222)通过 SSH 连接到应用服务器(10.3.3.3:22)。堡垒和应用服务器在 Amazon 的 VPC 中运行,只有堡垒暴露在互联网上。

我在堡垒上使用以下规则(我省略了源 IP,直到让它正常工作):

iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 2222 -j DNAT --to 10.3.3.3:22

但当我尝试连接时,没有得到任何回应。

在堡垒上运行 tcpdump 显示流量正在通过,因此我假设我访问了应用服务器的 VPC 安全组,但未到达其上的端口 22。我认为发生这种情况的原因是,虽然堡垒有权访问应用服务器上的端口 22,但 IP 1.2.3.4 没有权限。

所以,我的问题是:按照我设置的方式进行 NAT 是否会自动更改数据包的源 IP,使它们看起来来自堡垒,或者它们是否包含原始源 IP,在本例中为 1.2.3.4?

如果数据包转发后确实包含 1.2.3.4 作为源 IP,我该如何将源地址更改为堡垒的地址?

更新

我想我可以专门为 SSH 设置 SSH 隧道,但我也需要类似的解决方案来允许访问几个不同的应用服务器上的端口 443。

我现在也尝试添加 SNAT:

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.2.2.2

但它仍然不起作用(10.2.2.2 是堡垒的内部 IP)。

答案1

所以,我的问题是:按照我设置的方式进行 NAT 是否会自动更改数据包的源 IP,使它们看起来来自堡垒,或者它们是否包含原始源 IP,在本例中为 1.2.3.4?

不,DNAT 不会改变源 IP,只会目的地. DNAT - 目标网络地址转换

我如何知道堡垒机上是否启用了 IP 转发?

以下命令应返回 1

# cat /proc/sys/net/ipv4/ip_forward

我怎样才能让 iptables 执行 SNAT(如果这确实是我想要的 - 我希望 VPC 内的所有流量都看起来来自堡垒,然后让堡垒适当地将其重定向回去)?

# iptables -t nat -I POSTROUTING -p tcp -s 1.2.3.4 -d 5.5.5.5 --dport 2222 -j DNAT --to-destination 10.3.3.3:22

答案2

您已配置DNAT,或“目标 NAT”,这意味着您的网关正在重写目的地与该规则匹配的连接地址。源地址保持不变,因为您应该能够分辨出您是tcpdump在堡垒主机的出站接口上运行,还是在应用服务器上运行。

在您的示例中,这意味着应用服务器正在尝试将数据包返回到您的原始主机的地址1.2.3.4。这是否有效取决于您的所有主机的连接方式。

一个简单的解决方案是用一个简单的 tcp 代理替换你的 iptables 规则(例如,哈普罗西平衡等)。让代理侦听堡垒主机上的端口 2222,并将连接转发到应用服务器上的端口 22,这样它就可以正常工作,因为从应用服务器的角度来看,连接源自堡垒主机。

答案3

这只是一个权宜之计/短期解决方案

那么 SSH 隧道怎么样?

ssh -L 2222:10.3.3.3:22 [email protected] -N &
#then
ssh username@localhost -p 2222

SSH 超越 SSH :D

只是一个想法。

更新:没有看到 :-/:“更新我猜想我可以专门为 SSH 设置 SSH 隧道,但我还需要一个类似的解决方案来允许访问几个不同的应用服务器上的端口 443。”

相关内容