如何收緊 DNAT+SNAT 流量的轉發 iptables 轉發鏈
我希望我的 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 檢測的任何流量。這可能會或可能不會被視為不安全,具體取決於您的政策。