Iptables

無法通過 iptables PREROUTING 鏈讓 NAT 工作

  • October 17, 2020

所以,不關心為什麼,更關心如何,我想看看是否有人知道我在哪裡出錯了。

基本上,我想將所有指向我已別名為環回設備(169.254.169.254)的 IP 上的埠 80 的數據包轉發到另一個 IP 上的埠 8080,這恰好是公共 IP同一個盒子(我們將使用 1.1.1.1 來解決這個問題)。在這樣做時,我應該

$$ ostensbily $$能夠跑

telnet 169.254.169.254 80

並達到 1.1.1.1:8080,但是,這並沒有發生。

這是我在 iptables 中的 nat 表:

~# iptables -nvL -t nat
Chain PREROUTING (policy ACCEPT 66 packets, 3857 bytes)
pkts bytes target     prot opt in     out     source               destination         
   0     0 DNAT       tcp  --  *      *       0.0.0.0/0            169.254.169.254      tcp dpt:80 to:1.1.1.1:8080

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination

我錯過了什麼嗎?我已經關注了 iptables 手冊頁和下面的連結中的大部分資訊,但是,在我的 telnet 嘗試期間仍然收到“連接被拒絕”。我嘗試添加~#iptables -t nat -A POSTROUTING -j MASQUERADE到我的 iptables,但無濟於事:/

如果有人能指出我正確的方向,那將是驚人的!

http://linux-ip.net/html/nat-dnat.html

https://www.frozentux.net/iptables-tutorial/chunkyhtml/x4033.html

編輯 我想補充一點,我確實啟用了以下 sysctl 參數~# sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1

編輯 2 我能夠通過將規則添加到 nat 表中的 OUTPUT 鏈來解決這個問題,而不是我最初嘗試的 PREROUTING 鏈。

我實際上是通過確保在主機上傳入核心模組“br_netfilter”來完成這項工作的。就這麼簡單,被難住了這麼久,簡單得令人討厭。

引導我找到解決方案的文件/文章:

https://github.com/omribahumi/libvirt_metadata_api>和<https://thewiringcloset.wordpress.com/2013/03/27/linux-iptable-snat-dnat/

請參閱“設置 iptables”部分——我使用 ‘DNAT’ 而不是 ‘REDIRECT’ bc ‘REDIRECT’ 只是將流量重定向到本地系統上的介面,而不是像目標 NAT 那樣轉發到已刪除的地址。

https://serverfault.com/questions/179200/difference-beetween-dnat-and-redirect-in-iptables>和<https://www.netfilter.org/documentation/HOWTO/NAT-HOWTO-6.html

如上所述,幫助我理解了 REDIRECT 和 DNAT 之間的區別。

https://github.com/omribahumi/libvirt_metadata_api/pull/4/files

這個送出讓我找到了實際的解決方案(我之前已經做過的上述事情,但無濟於事)。

引用自:https://unix.stackexchange.com/questions/267185