轉發前通過 TUN 設備路由所有數據包
我有一個創建 TUN 設備的應用程序,然後檢查進入該介面的所有數據包,並將它們原封不動地寫回 TUN,以防檢查成功。(想想防火牆)數據包的來源是執行我的防火牆應用程序的同一設備。這台機器 (VM,
10.0.2.15
) 可以192.168.1.151
使用主路由表訪問另一台機器 (Host, )(無需設置)。我現在的問題是,每當我通過防火牆應用程序發送數據包時,核心似乎都會丟棄它們。具體來說,當我在我的 TUN 介面上執行 tcpdump 時,我看到以下內容:tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes 12:24:21.548119 IP 10.0.2.15 > 192.168.1.151: ICMP echo request, id 9967, seq 1, length 64 12:24:21.548248 IP 10.0.2.15 > 192.168.1.151: ICMP echo request, id 9967, seq 1, length 64 12:24:22.555972 IP 10.0.2.15 > 192.168.1.151: ICMP echo request, id 9967, seq 2, length 64 12:24:22.556087 IP 10.0.2.15 > 192.168.1.151: ICMP echo request, id 9967, seq 2, length 64
您可以看到每個數據包都被記錄了兩次。一旦它進入我的應用程序,一旦它出來。然而,從那裡它似乎消失了。在應該向我的主機發送的介面上執行 tcpdump 不會顯示任何內容。
我在我的 VM 機器上配置了以下內容:
# enable forwarding and disable reverse path filtering sudo sysctl net.ipv4.conf.default.rp_filter=0 sudo sysctl net.ipv4.conf.all.rp_filter=0 sudo sysctl net.ipv4.ip_forward=1 # routes for the packets to take sudo ip rule add to 192.168.1.151/32 lookup 11 prio 11 sudo ip rule add iif tun0 lookup main priority 10
表 11 告訴數據包進入我的 TUN 設備。這如 tcpdump 所示。
我還將 iptables FORWARD 和 OUTPUT 鏈預設設置為 ACCEPT。此外,我使用帶有 UDP 的 netcat 測試了流量,以排除數據包無法返回的問題。
我錯過了什麼?核心丟棄我的數據包的原因可能是什麼?
我有一個創建 TUN 設備的應用程序,然後檢查進入該介面的所有數據包,並將它們原封不動地寫回 TUN,以防檢查成功。
我現在的問題是,每當我通過防火牆應用程序發送數據包時,核心似乎都會丟棄它們。
核心看到它發出的數據包進來了,所以它斷定在網路的某個地方一定有一個路由循環,並且為了防止網路被淹沒,丟棄數據包。
您已經嘗試使用 禁用該行為
rp_filter
,但您可能還需要設置accept_local
,因為您的 TUN 介面具有本地地址。更好的方法是真正將您的應用程序用作防火牆,讓它創建兩個 TUN 介面,一個傳入和一個傳出,並將一個或兩個移動到需要它的網路名稱空間/VM。
這樣,您就可以避免看起來像路由循環的情況。