Linux

AWS VPC + IPtables + NAT:埠轉發不起作用

  • August 25, 2016

昨天,我在這裡發布了一個問題,但我認為我的話不夠清楚。順便說一句,這個問題不是重複的。

我有如下 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.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 實例遠端登錄到伺服器 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

引用自:https://serverfault.com/questions/570386