
我正在嘗試編寫一個 C 程序,為我的電腦實體介面建立一個 tun 設備介面。整個想法是,當我在隧道設備上寫入任何原始資料包時,它會將其放入我的實際實體介面中。我的問題是如何將 tun 設備映射到實際的實體介面?
例如,我的 eth1 的 IP 位址是 - 10.16.1.152。如何建立 tun 設備以便可以在 eth1 介面上讀取/寫入?我需要提供相同的 IP 位址還是不同的 IP 位址?是我在 tun 設備上寫入資料包並創建一條將 tun 設備的預設網關作為 phy 設備的路由的唯一方式。
我正在關注這個例子,但我還不清楚這個概念。
我透過以下命令建立了隧道設備。我的電腦有一個真正的乙太網路介面。此乙太網路介面IP位址10.16.1.152連接到一堆PC,然後連接到網關伺服器以存取網際網路。
我正在嘗試編寫一個 C 程序,將 OSPF hello 封包寫入介面。
為此,我創建了一個隧道設備,以便可以在其上寫入 OSPF hello 封包。但在這樣做之前,我要檢查隧道設備。這裡我的隧道設備是 11.11.11.2/24,我正在設定路由取得 10.16.1.152。我的理解是,在實際介面(即10.16.1.152)上接收或發送的所有資料包都將被該隧道設備介面接收,其IP位址為11.11.11.2。但是,當我對 10.16.1.152 執行 ping 操作時,收到的 RX/Tx 資料包仍然為零。所以,我認為我的隧道沒有收到任何資料包。
ip tuntap add mode tun dev tun0
ip addr add 11.11.11.2/24 dev tun0
ip link set dev tun0 up
ip route get 10.16.1.152
我在這裡缺少任何概念嗎?我怎樣才能這樣做呢?我仍然在努力弄清楚我的隧道設備概念。
答案1
您不能使用tun
介面「將實際資料包放入現有介面」。接口tun
始終是新的網路接口,與所有現有接口不同。
但你可以使用封包套接字將原始資料包寫入現有網路介面(或從中讀取原始資料包)。man 7 packet
詳情請參閱。但是你用這個繞過了所有協定層,所以你必須自己實作正確的協定行為,所以除非你真的,真的知道自己在做什麼,不要這樣做。
你沒有說出你真正想要實現的目標,而且你似乎對這些概念有點困惑,所以這可能是一個XY問題,並且完全有可能tun
介面和資料包套接字都不是您真正需要的。