为什么启动openvpn客户端,然后dhcpcd给出不同的路由表而不是相反的顺序?

网络工程 虚拟专用网 dhcp
2022-03-05 03:19:53

我通过家中的路由器进行连接,并通过远程服务器通过 openvpn 隧道传输所有流量。当我第一次连接 dhcpcd,然后启动 openvpn 时,我的路由看起来像这样(在 linux 机器上)

$ ip route
0.0.0.0/1 via 10.8.0.1 dev tun0 
default via 192.168.1.1 dev wlp4s0  metric 303 
10.8.0.1 dev tun0  proto kernel  scope link  src 10.8.0.2 
<my.vpn.server's.ip> via 192.168.1.1 dev wlp4s0 
128.0.0.0/1 via 10.8.0.1 dev tun0
192.168.1.0/24 dev wlp4s0  proto kernel  scope link  src    192.168.1.114  metric 303 

但是,如果我然后重新启动 dhcpcd 服务,路由看起来像这样

$ ip route
0.0.0.0/1 via 10.8.0.1 dev tun0 
default via 192.168.1.1 dev wlp4s0  metric 303 
10.8.0.1 dev tun0  proto kernel  scope link  src 10.8.0.2 
128.0.0.0/1 via 10.8.0.1 dev tun0 
192.168.1.0/24 dev wlp4s0  proto kernel  scope link  src 192.168.1.114  metric 303 

不同的是这条线不再存在

<my.vpn.server's.ip> via 192.168.1.1 dev wlp4s0 

结果是我无法再访问互联网。该行的意义是什么,为什么重新启动 dhcpcd 会删除它?

请注意,我的 openvpn 客户端配置包含

        remote <my.vpn.server's.hostname>
        dev tun0
        ifconfig 10.8.0.2 10.8.0.1
        secret /root/static.key
        mtu-test
        redirect-gateway def1
2个回答

线索在于启动 VPN 隧道后和重新启动 dhcpd 之前路由表中的路由:

$ ip route
0.0.0.0/1 via 10.8.0.1 dev tun0 
default via 192.168.1.1 dev wlp4s0  metric 303 
10.8.0.1 dev tun0  proto kernel  scope link  src 10.8.0.2 
<my.vpn.server's.ip> via 192.168.1.1 dev wlp4s0 
128.0.0.0/1 via 10.8.0.1 dev tun0
192.168.1.0/24 dev wlp4s0  proto kernel  scope link  src    192.168.1.114  metric 303 

您有两个默认路由。首先,您可能会通过 DHCP 从您的家庭路由器接收到一个,这个:default via 192.168.1.1 dev wlp4s0 metric 303. 这使您可以在没有 VPN 的情况下访问 Internet(否则您的 Linux 机器将如何知道连接到 VPN 隧道远端的路径)。

您还有第二个默认路由,可能是在您建立 VPN 隧道时由 openvpn 安装的,这个:(0.0.0.0/1 via 10.8.0.1 dev tun0从技术上讲,这不是默认路由,它应该是 0.0.0.0/0)

请注意,该default via 192...路由的度量为 303,因此它不如通过隧道的默认路由优先。这会导致一个问题:

  1. 首选默认路由导致所有流量都被强制通过连接到接口 tun0 的 10.0.8.1 发送
  2. tun0 是连接到远程 VPN 对等体的逻辑接口而不是物理接口
  3. 要访问您的远程 VPN 对等点 (10.18.0.1),您需要在本地子网之外建立连接(dev wlp4s0 上的 192.168.1.0/24)
  4. 如果没有到远程对等点的更具体的路由,您将使用具有最低度量的默认路由,即路由0.0.0.0/1...,因此您将在无限循环中返回步骤 1

看来您的 openvpn 客户端也插入了以下路线:<my.vpn.server's.ip> via 192.168.1.1 dev wlp4s0

因此,现在所有流量都通过指向 vpn 隧道的默认路由进行路由,然后执行第二次查找以查看 VPN 的远端<my.vpn.server's.ip>可通过 192.168.1.1 访问,这可能是您的路由器。流量(理论上)应发送到 tun0,然后将其加密并发送到路由器以到达 VPN 远端。这一切都很好。

现在我们已经设置好了场景,没有看到你的 dhcpd 和路由器配置我会冒险猜测并说 dhcpd 会刷新你的路由表,以便清除 openvpn 安装的重要额外路由,然后你进入我描述的无限递归状态上面编号的步骤 1 到 4。

每次 dhcp 重置接口时,您的 VPN 主机路由都会被破坏。即当 192.168.1.114(你的 dhcp 分配的地址)被删除时,所有到 192.168.1.0/24 的路由都将被清除。

要么你的 dhcp 设置需要被教导来处理这个(添加路由),要么你的 VPN 需要在接口重置时重置。