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

我想概念化如何networking在使用TUN接口的Linux VPN的底层工作。

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

  1. build立到远程客户端/服务器的连接。
  2. TUN界面创build并提出
  3. 更新路由表以将默认网关设置为TUN接口

但是,到远程客户端/服务器的数据包不会进入TUN接口并形成一个循环? VPN系统如何解决这个问题? 我的理解有什么差距?

你是正确的,纯粹的目的地为基础的路由这是一个问题,如果通过隧道到达的目的地与隧道build立所需的路由重叠等….

我经常看到这样做的方式,并且在各种路由器上自己完成,就是使用策略路由:

  • 作为VPN端点的路由器通过其ISP链路保持其默认路由指向Internet
  • 它还有一条策略路由,其中​​有一个基于源的规则,表示来自其后面的子网的stream量,不pipe它们的目的地是什么,都应该通过隧道发送。

使用基于目标的路由也不难。

我通常看到的方式是加载到VPN服务器的路由,指定预先存在的网关和接口和距离(真正的路由优先级)设置为1. VPN的默认路由总是有至less2的距离。

想象一下带有1个物理适配器的系统:enp2s0。

它的路由表可能会开始,因为所有的stream量都出去了enp2s0。

一旦系统连接到一个VPN,一个TUN接口(tun0)被初始化,并且VPN更新路由表:在端口X(VPN服务器地址和端口)去往VPN服务器地址的所有通信stream出enp2s0。 所有其他stream量都通过tun0。

当然一个VPN不必路由所有的stream量。 例如,我已经build立VPN之前,只有通往某个私有子网的stream量才通过VPN,因此正常的互联网stream量将不会改变。 你如何做这个基于VPN程序的变化。