Kernel

轉發前通過 TUN 設備路由所有數據包

  • July 8, 2020

我有一個創建 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。

這樣,您就可以避免看起來像路由循環的情況。

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