Linux
是否可以在 dnat 時在 iptables 中提及目標介面?
我正在嘗試使用 iptables 來做 dnat,如下所示
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 9000 -j DNAT --to-destination 10.0.0.1:9000
是否可以提及
output interface
使用 iptables 或路由表是唯一的方法?
這是不可能的,因為命令會告訴 (
Can't use -o with PREROUTING
),原因如下:
- DNAT 發生在 nat/PREROUTING 中,顧名思義,發生在路由決策之前。
- 在做出路由決定之前,還沒有使用路由堆棧來確定輸出介面是什麼(如果不是主機本身,iptables 的過濾器根本沒有輸出介面)。所以這個資訊對 nat/PREROUTING 是不可用的,這就是為什麼它不允許指定一個輸出介面:你不能匹配你沒有的(元)數據。
這是解釋其工作原理的示意圖:
路由決策永遠不會由netfilter或iptables完成,而是由路由堆棧完成。所以對於具體的路由,
ip route
必須使用路由棧(…)。有時您可以通過使用 iptables 在數據包上設置標記來將路由堆棧推向正確的方向,如果沒有它就無法完成的話。但是路由部分可能會變得非常棘手。如果您有特定需求,則應在問題中提出這些需求:該問題還應說明原因,而不僅僅是您要如何執行此操作,以避免出現XY問題。