我正在尝试概念化使用 TUN 接口的 Linux VPN 的网络底层工作原理。
我目前最好的猜测如下(请纠正我):
- 与远程客户端/服务器建立连接。
- TUN 接口已创建并启动
- 路由表已更新,将默认网关设置为 TUN 接口
但是,发往远程客户端/服务器的数据包最终会不会进入 TUN 接口并形成某种循环?VPN 系统如何解决这个问题?我的理解有什么差距?
答案1
您说得对,纯粹基于目的地的路由会出现问题,如果您通过隧道到达的目的地与建立隧道所需的路由重叠等……
我通常看到的完成此操作的方式,以及我自己在各种路由器上完成的方式,是使用策略路由:
- 作为 VPN 端点的路由器保持其通过 ISP 链路指向互联网的默认路由
- 它还有一个带有基于源的规则的策略路由,规定来自其后面子网的流量,无论其目的地是哪里,都应该通过隧道发送。
答案2
使用基于目的地的路由也不难。
我通常看到的方式是将路由加载到 VPN 服务器,指定预先存在的网关和接口以及设置为 1 的距离(真正的路由优先级)。VPN 的默认路由的距离始终至少为 2。
答案3
想象一个具有 1 个物理适配器的系统:enp2s0。
当所有流量都出自 enp2s0 时,它的路由表可能就开始了。
一旦系统连接到 VPN,TUN 接口 (tun0) 就会初始化,VPN 会更新路由表:所有发往端口 X(VPN 服务器地址和端口)上的 VPN 服务器地址的流量都会从 enp2s0 发出。所有其他流量都会通过 tun0。
当然,VPN 不必路由所有流量。例如,我之前设置过 VPN,只有发往特定私有子网的流量会通过 VPN,因此正常的互联网流量不会改变。具体如何实现这一点取决于 VPN 程序。