首先,我了解内核路由表使所有出站流量转发到tun0
.然而,他们不会访问本地tun0
接口拥有的IP 地址(例如,10.13.10.6
),而不是目标地址(例如,10.13.10.5
)。在这种情况下,OpenVPN 如何连接所有流向的流量tun0
?据我所知,涉及到一种叫做原始套接字的东西,但我想了解它是如何具体确保这种行为的。
答案1
再看一下路由表( 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接口是如何工作的吗?