總之
從 TUN 介面讀取的封包在寫回同一 TUN 介面時找不到路徑。
在全
設想:
在一台機器上只有1連接到網路的NIC(eth0),我編寫了一個從TUN介面讀取IP封包的應用程式;那麼它可能:
- 將封包不做任何變更寫回同一個 TUN 接口
- 區塊資料包
- 對資料包進行變更(例如加密其有效負載)並將受操作的資料包寫回 TUN 介面。
完畢:
我已經完成了以下步驟:
- 我運行我的程式。它分配並實例化 TUN 設備並等待設備啟動。
然後我執行以下命令:
ifconfig tun0 up ifconfig tun0 10.0.0.2 route add -net 0.0.0.0 netmask 0.0.0.0 dev tun0 echo 1 > /proc/sys/net/ipv4/ip_forward
現在我的程式開始成功讀取資料包(並列印/記錄其內容)。
- 我的程序,寫回資料包沒有任何改變返回 tun0 設備
問題:
寫回的封包,沒有找到它傳回的路由,例如到 eth0 或到應用層。例如,當我執行 ping 時:
ping 4.2.2.4
在另一個終端上:
tshark -i tun0
我看到 tun0 看到了 ICMP echo 封包(也是我的程式):
10.0.0.2 → 4.2.2.4 ICMP 84 Echo (ping) request id=0x14b1, seq=2/512, ttl=64
10.0.0.2 → 4.2.2.4 ICMP 84 Echo (ping) request id=0x14b1, seq=3/768, ttl=64
10.0.0.2 → 4.2.2.4 ICMP 84 Unknown ICMP (obsolete or malformed?)
我的程式將資料包寫回 tun0 並tshark
看到它(在上面的程式碼片段中)
但ICMP請求沒有到達乙太網路0所以它可以找到它的方式4.2.2.4
。恕我直言,路由規則有問題,但我不知道該如何修改它。
歡迎任何評論,問候
答案1
當然,路由規則有問題,您告訴核心將所有資料包路由出去tun0
:)。當您將該資料包傳回 時tun0
,它會再次路由回tun0
,而不是eth0
。除了在您的情況下聽起來像是由於「反向路徑過濾器」而導致資料包被丟棄,即它拒絕將資料包從它們進入的相同介面中彈回。