![通过 tun1 路由 tun0 流量(双跳 VPN)](https://linux22.com/image/747452/%E9%80%9A%E8%BF%87%20tun1%20%E8%B7%AF%E7%94%B1%20tun0%20%E6%B5%81%E9%87%8F%EF%BC%88%E5%8F%8C%E8%B7%B3%20VPN%EF%BC%89.png)
目标:为双跳 VPN 路由所有互联网流量从 eth0 -> tun0 -> tun1。以下路由表是否适合该目标?
$ IP路由显示:
0.0.0.0/1 via 10.8.1.1 dev tun1
default via 10.8.3.1 dev tun0 proto static metric 50
10.8.1.0/24 dev tun1 proto kernel scope link src 10.8.1.6
10.8.3.0/24 dev tun0 proto kernel scope link src 10.8.3.4 metric 50
101.133.213.73 via 10.8.3.1 dev tun0
127.0.0.0/8 dev lo scope link
128.0.0.0/1 via 10.8.1.1 dev tun1
191.72.65.45 via 182.160.0.1 dev eth0 proto static metric 100
182.160.0.0/24 dev eth0 proto kernel scope link src 182.160.0.19 metric 100
182.160.0.0/24 dev eth0 proto dhcp scope link src 182.160.0.19 metric 208
182.160.0.1 dev eth0 proto static scope link metric 100
答案1
eth0 : 182.160.0.19/24 (GW: 182.160.0.1)
tun0 : 10.8.3.4/24 (GW: 10.8.3.1 / VPN endpoint : 191.72.65.45 via eth0)
tun1 : 10.8.1.6/24 (GW: 10.8.1.1 / VPN endpoint : 101.133.213.73 via tun0)
这样,除了以太网(182.160.0.0/24)上的本地流量和 tun0/“VPN1”(10.8.3.0/24)上的本地流量之外,所有流量(包括来自 tun0 的传入流量)都将通过 tun1 路由。
有了这个路由表所有来自 eth0 的流量都将通过 tun1 路由问题中没有提到/要求...这种情况对你来说可以吗?如果答案是肯定的,那么你可以保留此设置。
如果这是您不愿意看到的情况(您不想将流量从 eth0 路由到 tun1 / tun0),您有(至少)两种处理方式。
- “自定义”路由表
可以有多个路由表,并且根据规则/策略,您可以管理哪些流量将由默认路由表以外的路由表处理。这样,您可以设置自定义路由表,其中默认网关将是 tun1,并且只有来自 tun0 的流量才会指向此自定义路由表。
- 网络命名空间
这样,您可以将整个 tun 接口与 eth0 隔离(使用命名空间之间的内部路由),以便您可以在命名空间中设置简单(默认)路由表,以便只有来自 tun0 的流量才能到达 tun1。
答案2
假设所需的顺序是来自您的 LAN 的流量应该从本地机器 -> tun0 -> tun1,这很可能就是正在发生的情况,但是它发生的方式在 tracreroute 上是不可见的。
让我们获取一个发往任意互联网地址的数据包 - 在此示例中我将使用 8.8.8.8。
计算机拾取数据包并寻找如何发送它。它发现应该通过 tun1 发送它(因为下面的 2 条路由相当于默认路由,但限制更多,因此优先于默认路由 - 在这种情况下,第一个路由被命中)-
0.0.0.0/1 via 10.8.1.1 dev tun1
128.0.0.0/1 via 10.8.1.1 dev tun1
但这里有一个可能不太明显的部分。如果你查看 tun1 的配置,你会发现它有一个端点,即 101.133.213.73。这个 IP 地址有一条特定的路由,它经过 tun0
101.133.213.73 via 10.8.3.1 dev tun0
同样,还有另一条路线
191.72.65.45 via 182.160.0.1 dev eth0 proto static metric 100
此路由使得通过 tun0 发送的流量可通过以太网接口直接访问。
由于这是一条非常具体的路线,到 101.133.213.73 的流量将通过 tun0。因此,所有流向互联网的流量(通过 tun1)都必须通过 101.133.213.73,而 101.133.213.73 本身就是一条隧道,所以是的,数据将会通过两个隧道流动。
跟踪路由不会显示此信息,因为数据包不知道它正在通过隧道传输。也就是说,您仍然可以通过查看较低级别来检查是否正在发生这种情况 - 在另一个窗口中执行“sudo tcpdump -n -i any”时生成流量。您将看到,每当将数据包发送到更广泛的互联网时,都会通过 eth0、tun0、tun1 发送一个数据包,返回的数据包也是如此。与 tun0 关联的数据包都将具有 101.133.213.73 的目标。