AWS VPC + IPtables + NAT:端口转发不起作用

AWS VPC + IPtables + NAT:端口转发不起作用

昨天,我发布了一个问题这里但我觉得我说的不够清楚。顺便说一句,这个问题不是重复的。

我有如下的 AWS VPC 设置。

在此处输入图片描述

目标/问题:通过互联网 SSH 连接到服务器 A。但它不起作用。

服务器 A 位于私有子网中,因此我想在我的 NAT 实例上启用 iptables NATing,以便我可以直接从互联网 ssh 到服务器 A

我正在关注

我在 NAT 实例上运行了以下命令:

NAT# iptables -t nat -A PREROUTING  -p tcp --dport 2222 -j DNAT --to-destination 10.0.1.243:22

NAT 实例上启用了 IP 转发:

NAT# sysctl  -p
net.ipv4.ip_forward = 1

MASQUERADE 正在 NAT 实例上运行:

NAT# iptables -t nat -vnL POSTROUTING
Chain POSTROUTING (policy ACCEPT 6 packets, 312 bytes)
 pkts bytes target     prot opt in     out     source               destination
  199 16466 MASQUERADE  all  --  *      eth0    10.0.0.0/16          0.0.0.0/0

AWS 安全组配置良好,可以允许此测试用例所需的各种访问。

故障排除:

我可以通过 NAT telnet 到服务器 A 的端口 22。因此访问正常。

telnet 54.213.116.251 2222当我在笔记本电脑上运行时,我在 NAT 上的 tcpdump 中看到以下条目:

NAT# tcpdump -n -i eth0 dst 10.0.1.243 and port 22
09:59:13.738316 IP xxx.xxx.xxx.xxx.51709 > 10.0.1.243.ssh: Flags [S], seq 1868541786, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
09:59:16.737009 IP xxx.xxx.xxx.xxx.51709 > 10.0.1.243.ssh: Flags [S], seq 1868541786, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
09:59:22.775567 IP xxx.xxx.xxx.xxx.51709 > 10.0.1.243.ssh: Flags [S], seq 1868541786, win 8192, options [mss 1460,nop,nop,sackOK], length 0

所以这意味着 iptables 正在将数据包路由到10.0.1.243。 (顺便说一下,xxx.xxx.xxx.xxx这是我的笔记本电脑的公网 IP 地址)

但是当我在服务器 A 上运行 tcpdump 时,我没有看到任何来自10.0.0.54NAT 的内部/私有 IP 地址的信息(我认为这就是问题所在):

Server A# tcpdump  -n src 10.0.0.54
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 

但是如果我从 NAT 实例 telnet 到服务器 A,我会在服务器 A 上的 tcpdump 中看到好东西(这意味着我的整体PREROUTING规则没有按预期发挥作用):

Server A# tcpdump  -n src 10.0.0.54
05:01:47.500080 IP 10.0.0.54.44627 > 10.0.1.243.ssh: Flags [S], seq 2862522431, win 14600, options [mss 1460,sackOK,TS val 3013083 ecr 0,nop,wscale 7], length 0
05:01:47.501601 IP 10.0.0.54.44627 > 10.0.1.243.ssh: Flags [.], ack 760676524, win 115, options [nop,nop,TS val 3013083 ecr 12074896], length 0
05:01:47.535720 IP 10.0.0.54.44627 > 10.0.1.243.ssh: Flags [.], ack 22, win 115, options [nop,nop,TS val 3013092 ecr 12074928], length 0

结论:

从 NAT 上的 tcpdump 输出来看,Iptables 似乎正在正常转发我的数据包。

从服务器 A 上的 TCP 转储来看,我从 NAT 到服务器 A 具有良好的连接。

但是在端到端中,我无法从我的笔记本电脑连接到服务器 A。

顺便说一句,我知道 SSH 隧道和其他好东西。但我只希望 Iptables 能帮我实现这一点。

答案1

最后,我破解了它!

在 NAT 实例上,我必须更改以下命令:

从:

iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/16 -j MASQUERADE

到:

iptables -t nat -A POSTROUTING -j MASQUERADE

而且它有效!

因此,我很快将在 ServerFault 上创建一个新问题,询问使用上述两个命令的优点和缺点是什么。

答案2

  • 确保你允许22220.0.0.0/0nat box 的安全组进入 tcp 端口
  • 确保您已正确设置 VPC“路由表”。
  • 至少两个单独的表(一个与私有子网关联,一个与公共子网关联)
  • 您的10.0.1.0(私有)子网应该有一个路由表规则,例如:目的地:0.0.0.0/0,目标:“Nat box”
  • 您的10.0.0.0(公共)子网应该有一个路由表规则,例如:目的地:0.0.0.0/0,目标:“互联网网关”
  • 确保你有源/目标检查已禁用在你的 NAT 盒的 NIC 上,没有它,NAT 就毫无乐趣。(我知道你已经有这个了,但它真的很重要,因此将其包含在内以供将来的观众查看)

  • 确保出站数据包知道要去哪里:

    iptables --table nat --append POSTROUTING --source 10.0.0.0/16 --destination 0.0.0.0/0 --jump MASQUERADE

  • 确保传入数据包2222正确重新路由:

    iptables --table nat --append PREROUTING --protocol tcp --dport 2222 --jump DNAT --to-destination 10.0.1.243:22

答案3

这篇文章对我理解 AWS NAT 有很大帮助。因此我开始研究它是如何iptables -t nat -A POSTROUTING -j MASQUERADE工作的。

好吧,我找到了答案,上面的语句允许 NAT 盒将“LAPTOP”IP 源 NAT 为“10.0.0.54”,同时执行目标 NAT 到 10.0.1.243。此时,私有子网盒仅是来自 NAT 设备的 ssh 请求。此命令实际上降低了私有子网服务器的安全性。建议使用以下命令通过 ssh 和 NAT 盒微调私有子网访问,如下所述;

iptables --table nat --append POSTROUTING --source "INTERNET IP of the Laptop" --destination 10.0.1.243 --jump MASQUERADE

答案4

更安全一点:

iptables -t nat -I PREROUTING -d 52.213.216.251 -j DNAT --to-destination 10.0.1.243:22
iptables -t nat -I POSTROUTING -s 10.0.1.243 -j SNAT --to-source 52.213.216.251

相关内容