Linux

如何收緊 DNAT+SNAT 流量的轉發 iptables 轉發鏈

  • July 20, 2018

我希望我的 linux 路由器/網際網路網關 192.168.80.1 在通過 LAN 請求時將埠 9091 轉發到 192.168.80.15:9091。我還希望我的路由器將埠 9091 上的 WAN 發起請求轉發到 192.168.80.15:9091。

第二部分我已經成功完成,我大部分時間都在使用第一部分

iptables -A PREROUTING -p tcp -m tcp --dport 9091 -j DNAT --to-destination 192.168.80.15:9091
iptables -A POSTROUTING -d 192.168.80.15/32 -p tcp -m tcp --dport 9091 -j SNAT --to-source 192.168.80.1

根據這裡的最佳答案。但是,這僅在我將 FORWARD 策略設置為 ACCEPT 時才有效。我想將轉發策略保留為 DROP,並為我正在轉發的流量創建一個特定的例外。

我試過了

iptables -A FORWARD -p tcp --dport 9091 -j ACCEPT

並且它將流量傳遞到 192.168.80.15:9091 但從 192.168.80.15 到 192.168.80.1 的響應返回到另一個埠,我認為它被丟棄了。我如何制定一個規則,在允許我想要的流量的同時保持事情相對安全?我玩過 conntrack 但到目前為止還沒有成功。

更新

我知道有一種稱為髮夾 NAT 的替代方法。如果這是一種更好的方法,我願意接受爭論,但我應該注意,目前bind在我的網關/路由器上配置,以便我的 LAN 上的客戶端的域名解析為 192.168.80.1(而它在外部解析為網關的公共 IP )

最終,我希望 mydomain.com:9091 訪問相同的服務,無論請求來自 LAN 還是 WAN。

數據包必須通過您的路由器,因此它們必須通過 FORWARD 鏈。

一個簡單的方法是使用這個命令:

iptables -A FORWARD -m conntrack --ctstate ESTABLISHED -j ACCEPT

無論如何,NAT(SNAT 或 DNAT)工作都需要連接跟踪,因此它甚至不會增加太多成本,而且您不必擔心特定規則。

採用

iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,DNAT -j ACCEPT

它將涵蓋兩者

iptables -A FORWARD -p tcp --dport 9091 -j ACCEPT

你猜對了

iptables -A FORWARD -m conntrack --ctstate ESTABLISHED -j ACCEPT

來自上一個答案,這是允許通過路由器返回流量所必需的。

缺點 - 該規則將允許您通過路由器進行 DNAT 檢測的任何流量。這可能會或可能不會被視為不安全,具體取決於您的政策。

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