VPN 服务器/客户端如何避免通过自身路由自己的远程连接数据包?

VPN 服务器/客户端如何避免通过自身路由自己的远程连接数据包?

我正在尝试概念化使用 TUN 接口的 Linux VPN 的网络底层工作原理。

我目前最好的猜测如下(请纠正我):

  1. 与远程客户端/服务器建立连接。
  2. TUN 接口已创建并启动
  3. 路由表已更新,将默认网关设置为 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 程序。

相关内容