AWS VPC + IPtables + NAT:埠轉發不起作用
昨天,我在這裡發布了一個問題,但我認為我的話不夠清楚。順便說一句,這個問題不是重複的。
我有如下 AWS VPC 設置。
目標/問題:從 Internet SSH 到伺服器 A。它不工作。
伺服器 A 在私有子網中,因此我想在我的 NAT 實例上啟用 iptables NATing,以便我可以直接從 Internet SSH 到 SErver 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 安全組配置良好,以允許此測試案例所需的各種訪問。
故障排除:
我可以通過 22 埠從 NAT 遠端登錄到伺服器 A。所以訪問很好。
當我
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 實例遠端登錄到伺服器 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 來幫助我。)
最後,我破解了!!!!
在 NAT 實例上,我必須更改以下命令:
從:
iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/16 -j MASQUERADE
到:
iptables -t nat -A POSTROUTING -j MASQUERADE
它成功了!!!!
因此,我將很快在 ServerFault 上創建一個新問題,詢問使用上述兩個命令的優缺點是什麼。
- 確保您在 nat 框的安全組上允許 tcp 埠
2222
入站0.0.0.0/0
- 確保您的 VPC“路由表”設置正確。
- 至少兩個單獨的表(一個與私有子網關聯,一個與公共子網關聯)
- 您的
10.0.1.0
(私有)子網應該有一個路由表規則,例如:Destination:0.0.0.0/0
, Target: “Nat box”- 您的
10.0.0.0
(公共)子網應該有一個路由表規則,例如:Destination:0.0.0.0/0
, Target: “Internet gateway”- 確保您在 NIC 上為您的 NAT 框禁用了源/目標檢查,沒有它就沒有 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