設想:

設想:

總之

從 TUN 介面讀取的封包在寫回同一 TUN 介面時找不到路徑。

在全

設想:

在一台機器上只有1連接到網路的NIC(eth0),我編寫了一個從TUN介面讀取IP封包的應用程式;那麼它可能:

  • 將封包不做任何變更寫回同一個 TUN 接口
  • 區塊資料包
  • 對資料包進行變更(例如加密其有效負載)並將受操作的資料包寫回 TUN 介面。

完畢:

我已經完成了以下步驟:

  1. 我運行我的程式。它分配並實例化 TUN 設備並等待設備啟動。
  2. 然後我執行以下命令:

    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

  3. 現在我的程式開始成功讀取資料包(並列印/記錄其內容)。

  4. 我的程序,寫回資料包沒有任何改變返回 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。除了在您的情況下聽起來像是由於「反向路徑過濾器」而導致資料包被丟棄,即它拒絕將資料包從它們進入的相同介面中彈回。

相關內容