昨天,我发布了一个问题这里但我觉得我说的不够清楚。顺便说一句,这个问题不是重复的。
我有如下的 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.54
NAT 的内部/私有 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
- 确保你允许
2222
从0.0.0.0/0
nat 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