無法通過 iptables PREROUTING 鏈讓 NAT 工作
所以,不關心為什麼,更關心如何,我想看看是否有人知道我在哪裡出錯了。
基本上,我想將所有指向我已別名為環回設備(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”來完成這項工作的。就這麼簡單,被難住了這麼久,簡單得令人討厭。
引導我找到解決方案的文件/文章:
請參閱“設置 iptables”部分——我使用 ‘DNAT’ 而不是 ‘REDIRECT’ bc ‘REDIRECT’ 只是將流量重定向到本地系統上的介面,而不是像目標 NAT 那樣轉發到已刪除的地址。
如上所述,幫助我理解了 REDIRECT 和 DNAT 之間的區別。
https://github.com/omribahumi/libvirt_metadata_api/pull/4/files
這個送出讓我找到了實際的解決方案(我之前已經做過的上述事情,但無濟於事)。