OpenVPN 如何調整進入 tun0 的所有流量?
首先,我了解核心路由表將所有出站流量轉發到
tun0
. 但是,它們不會轉到本地tun0
介面具有的 IP 地址(例如10.13.10.6
),而是轉到目標地址(例如10.13.10.5
)。在這種情況下,OpenVPN 如何連接到所有的流量tun0
?正如我所聽到的,**涉及一種稱為原始套接字的東西,**但我想了解它是如何具體確保這種行為的。
再次查看路由表 (
ip route
)。你會注意到有一個default
路由到10.13.10.5
,或者一對0.0.0.0/1
/128.0.0.0/1
路由到10.13.10.5
(這只是一個允許 OpenVPN 保持預設路由的技巧,儘管它變得不活動),並且這個路由通過tun0
.擁有什麼 IP 並不重要
tun0
,重要的是網關IP,它恰好10.13.10.5
位於tun0
.那麼OpenVPN是如何讓所有流量進入的
tun0
呢?通過提供路由,就像沒有 OpenVPN 一樣,所有流量都流向eth0
(或wlan0
,或預設路由所說的任何內容)。OpenVPN 沒有做任何特別的事情。特別是,它不使用原始套接字,它創建了一個 tun/tap 介面。
編輯
OpenVPN 不會“監聽綁定到另一端的流量”。
當Linux 核心看到一個網路數據包時,它會查詢路由表來決定如何處理該數據包。如果路由表顯示“
10.13.10.5
通過”將所有數據包發送到網關tun0
,那麼這就是 Linux 核心所做的。OpenVPN 不會以任何方式參與其中。現在 OpenVPN 已經創建了
tun0
,所以當核心放入一個數據包時tun0
,OpenVPN 可以讀取這個數據包。這就是 tun/tap 介面的作用:它允許應用程序讀取放入該介面的數據包(由核心),並寫入將從該介面發出的數據包(也將像核心一樣處理,就像如果數據包來自真實的網卡)。不涉及混雜模式。是不是你不明白 tun/tap 介面是如何工作的?