Linux

iptables-mod-tee 複製的數據包複製後去哪了?

  • November 24, 2019

iptables-mod-tee當我添加這樣的規則時,打包後的複製是否被複製了?:

iptables -t mangle -A POSTROUTING -o eth2 -j TEE --gateway 192.168.0.3

請參考下圖。我認為很明顯,使用上面的命令,iptables-mod-tee模組使用 的POSTROUTING chain作為mangle table複製,但是數據包被複製會發生什麼?即複製去哪個鍊和表?

在此處輸入圖像描述

編輯:在上圖中添加了一條紅色虛線,以描述答案中描述的複製數據包的路徑。

在此處輸入圖像描述

通過 TEE 複製的數據包,被 conntrack 設置為不跟踪防止 再次複製,並通過路由堆棧的本地輸出部分發出,因此首先由 raw/OUTPUT 看到(您也可以參考Netfilter 中的此數據包流和通用網路示意圖:這將在本地程序之後)。如果之前對路由數據包進行了複製(例如在 mangle 或原始 PREROUTING 中),這將是相同的。這使得很難(但並非不可能)像額外的 nat 一樣接受額外的治療,因為它不會被跟踪並且很難將其與原始數據區分開來。

這是一個範例TRACE(使用 iptables-legacy 的版本)在類似於 OP 的設置中擷取從 192.168.0.2 到 8.8.8.8 的 ping:擷取是在路由器上使用iptables -t raw -A OUTPUT -j TRACE. 原始路由數據包不會出現,因為它必須從 raw/PREROUTING 中擷取,因此驗證了上面的解釋,告訴它是從輸出完成的。

TRACE: raw:OUTPUT:policy:2 IN= OUT=eth1 SRC=192.168.0.2 DST=8.8.8.8 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=39209 DF PROTO=ICMP TYPE=8 CODE=0 ID=3070 SEQ=1 
TRACE: mangle:OUTPUT:policy:1 IN= OUT=eth1 SRC=192.168.0.2 DST=8.8.8.8 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=39209 DF PROTO=ICMP TYPE=8 CODE=0 ID=3070 SEQ=1 
TRACE: mangle:POSTROUTING:policy:2 IN= OUT=eth1 SRC=192.168.0.2 DST=8.8.8.8 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=39209 DF PROTO=ICMP TYPE=8 CODE=0 ID=3070 SEQ=1

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