如何在单个 Linux 机器上同时容纳 VPN 客户端、VPN 服务器和常规流量

如何在单个 Linux 机器上同时容纳 VPN 客户端、VPN 服务器和常规流量

我想要实现什么

我正在考虑在我的 Linux 机器上进行以下设置(最近发布的 Raspberry Pi OS 下的 Raspberry Pi v3):

  1. 默认情况下,所有传出连接的 VPN 客户端
  2. 一个 VPN 服务器,用于容纳从互联网到我的盒子的传入连接
  3. 一个“普通”接口(这里是 eth0),能够绕过 deafutl VPN 客户端,摆脱我的束缚

我使用接口 #3 获取 ISP 提供的公共 IP,即我的家庭网络的 IP。例如,它允许我使用我的“真实”(读取非 VPN 客户端)IP 成功更新我的 DNS 提供商帐户:

curl https://my.dns.provider/refresh_my_account_id_query --interface etho

                                                                                                                                                
                                                                                                                                                
                                                                                                                                                
+---------------------------------------------------------------+    +-----------------+    +---------+                                         
|                         My Linux box                          |    |                 |    |         |                                         
|                                                               |    | My home network |    | My ISP  |                                         
|                                                               |    |                 |    |         |                                         
|  +------------+                                               |    |                 |    |         |     +------------------+                
|  | VPN Client |  Dev: tun0 | IP:<pre-defined by VPN provider> |    |                 |    |         |     |  VPN Provider's  |                
|  | (default   <------------------------------------------------------------------------------------------->  Servers         <---------+      
|  | outgoing)  |                                               |    |                 |    |         |     |                  |         |      
|  +------------+                                               |    |                 |    |         |     +------------------+         |      
|                                                               |    |                 |    |         |                           +------v-----+
|  +------------+                                               |    |                 |    |         |                           |            |
|  |            |  Dev: tun1 | IP:10.8.0.1                      |    |                 |    |         |                           |  Internet  |
|  | VPN Server <----------------------------------------------------------------------------------------------------------------->            |
|  |            |                                               |    |                 |    |         |                           |            |
|  +------------+                                               |    |                 |    |         |                           |            |
|                                                               |    |                 |    |         |                           |            |
|  +------------+                                               |    |                 |    |         |                           |            |
|  |Only for    |   Dev eth0 | IP:192.168.0.200                 |    |    -------------------------------------------------------->            |
|  |explicit VPN<--------------------------------------------------------/             |    |         |                           |            |
|  |bypass      |                                               |    |                 |    |         |                           |            |
|  +------------+                                               |    |                 |    |         |                           +------------+
|                                                               |    |                 |    |         |                                         
|                                                               |    |                 |    |         |                                         
+---------------------------------------------------------------+    +-----------------+    +---------+                                         

我面临的问题

我无法让两个 VPN(接口 tun0 和 tun1)同时工作:当它们都启动并配置后,我无法再从互联网连接我的 VPN 服务器。其余的一切都很好。在我看来,当接口 tun0 和 tun1 的路由和规则都设置好时,所有传入流量都只在一个默认接口上进行,或者被丢弃,我不确定。

我当前对每个界面的设置

按照我的设置描述中的接口列表:

  1. 我已经使用一个普通的 openvpn 配置文件设置了我的 VPN 客户端,该文件用于systemctl将客户端作为服务运行。这本身就可以很好地工作,即tun0默认情况下所有流量都通过该接口。
  2. 我已经使用设置了我的 VPN 服务器PiVPN。这真的很简单,只需一次尝试就可以工作。
  3. 我正在手动添加ip route default via 192.168.0.1 dev eth0 proto dhcp src 192.168.0.200 metric 202,这按预期工作。

启动盒子时,所有 3 个接口都会出现(在 的顶部lo)并ip route给出:

0.0.0.0/1 via 172.94.109.161 dev tun0 
default via 172.94.109.161 dev tun0 
default via 192.168.0.1 dev eth0 proto dhcp src 192.168.0.200 metric 202 
10.8.0.0/24 dev tun1 proto kernel scope link src 10.8.0.1 
128.0.0.0/1 via 172.94.109.161 dev tun0 
172.94.109.4 via 192.168.0.1 dev eth0 
172.94.109.160/28 dev tun0 proto kernel scope link src 172.94.109.163 
192.168.0.0/24 dev eth0 proto dhcp scope link src 192.168.0.200 metric 202 

从上面我的理解是:

  • 第 1 行和第 2 行是相同的,旨在按照我的意图通过我的 VPN 客户端获取所有默认传出流量,但我应该删除其中之一。
  • 第 3 行是我手动添加的,当我打算直接以 eth0 接口为目标时,我打算绕过我的 VPN 客户端,但它是否会破坏其他内容?
  • 第 4 行的目的是让 VPN 服务器 IP 上收到的任何内容都由我的 VPN 服务器 tun1 管理
  • 第 5 行到第 8 行我不知道,似乎我的 VPN 客户端需要正常工作

我要什么

我需要另一个大脑来检查我对当前 IP 路由的理解。然后我正在寻找任何指向实现此处描述的设置的正确方法的指针。

到目前为止,我已经尝试了根据我的研究建立的许多规则和路线设置,但没有成功。我还阅读了一些有关通过mangleip 规则或路由选项标记传出和传入 paquet 的内容,但现有文献相当难以消化,我想在进一步尝试之前了解我实际需要的工具。

任何帮助将不胜感激,我很乐意提供配置的任何细节或尝试任何新的配置,只需询问即可。

答案1

为了补充马丁的答案:

您通过 VPN 的默认路由会损害您的本地 VPN 服务器,因为对其 VPN 客户端的应答是通过您的远程 VPN 服务器发送的。这样,远程客户端 VPN 将不再工作,因为答案来自不同的 IP 地址。

您必须使用策略路由限制到本地网络的默认路由。也许这个快速介绍可以帮助您进行设置。这向超级用户提问也可能有帮助。

您不会使用 OpenVPN 设置默认路由。

然后,您可以将来自传入 VPN 的路由添加到同一路由表中,它应该按照您想要的方式工作。

答案2

以下是对路由表的一些了解:

default via 172.94.109.161 dev tun0

这是您的默认路线。所有与更具体的路线不匹配的流量都将走该路径。该路由默认由 dhcp 设置。

0.0.0.0/1 via 172.94.109.161 dev tun0
128.0.0.0/1 via 172.94.109.161 dev tun0 

这两条路由可能来自 openvpn - 来自 openvpn 的手册页:

def1 -- 使用此标志通过使用 0.0.0.0/1 和 128.0.0.0/1 而不是 0.0.0.0/0 来覆盖默认网关。这样做的好处是可以覆盖但不会清除原始默认网关。

因此,基本上,这会使您的默认网关失效并用新网关替换它 - 而不删除它。如果没有此选项,一旦 DHCP 租约到期,通过 VPN 隧道重定向所有流量的默认网关就会被覆盖。

172.94.109.4 via 192.168.0.1 dev eth0

每当您使用“redirect_gateway”选项启动 openvpn 时,vpn 软件必须为 vpn 网关添加一条路由(remoteopenvpn 配置中带有该选项的行),该路由绕过 vpn 隧道并直接通过连接到的主接口发送您的 ISP - 否则您会在建立隧道后立即失去连接,这就是这里最有可能发生的情况。

172.94.109.160/28 dev tun0 proto kernel scope link src 172.94.109.163 
192.168.0.0/24 dev eth0 proto dhcp scope link src 192.168.0.200 metric 202 

这些路由是系统设置的路由 - 每当您配置网络接口时,都会自动创建这样的路由 - 这样您就可以到达同一子网中的所有邻居主机。建议:千万不要碰这些路线!

从路由的外观来看,似乎使用了错误的 IP...禁用“tun1”openvpn 服务器,仅启动您的 vpn-client 实例,并将路由与上表进行比较。我的猜测是,通过这个比较,您会发现为什么您的设置不起作用......

此外,您不应该手动添加默认路由(第 3 点),而应该让 openvpn 为您完成此操作。

希望能帮助到你!

相关内容