Linux
NAT TCP/UDP 連接與 AWS 上的 iptables
所以我在 AWS 上設置了 2 個實例,所以我可以從我的家用機器 C 直接通過 SSH 連接到它們(A,B)。
但是我想設置盒子 A,以便我可以將某些 UDP 和 TCP 連接從它轉發到盒子 B。
IPtables 似乎是我想要的(rinetd 會很好,但似乎該項目已死,它只涵蓋 TCP)。
我遵循了各種教程,但它們似乎不起作用+我認為無論如何我都需要另一條規則。
這些是我在框 A 上配置的規則,用於將 SSH 會話通過框 A 轉發到 B:
iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 1044 -j DNAT --to-destination B:22 iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source A
我將其讀作“獲取在埠 1044 上接收到的 TCP 數據包,將它們的目的地從框 A 更改為框 B”然後“當我將修改後的數據包發送回網路時,將它們的源更改為我自己 (A)”
本教程似乎認為只需要這兩個命令,但它們不起作用。
我想知道盒子A應該如何從B那裡獲取響應並將它們的源修改為自身+將它們轉發回C …
首先,我認為您可能需要啟用 ip 轉發。
sysctl -w net.ipv4.ip_forward=1
讓您的機器成為路由器。有關 ip 轉發的完整詳細資訊在這裡。
其次,我不會對此發誓,但您的 iptables 規則對我來說是錯誤的。看來你需要更像這樣的東西:
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 1044 -j DNAT --to-destination B:22 iptables -A FORWARD -p tcp -d B --dport 22 -j ACCEPT
如果您的預設策略是接受,您可能不需要第二行,那麼可能只是您沒有啟用 ip 轉發。但是,您所做的有點奇怪,數據包在同一個介面上進出。我從來沒有嘗試過。
您的第二個 POSTROUTING 行,這似乎是錯誤的或具有誤導性。如果您需要這條線,您可能希望將過濾器縮小到埠 22 到 B。
另外,tcpdump 是你的朋友!使用 tcpdump 查看這些進出的數據包是否真的被修改了。