我的家用路由器是定制的 Arch Linux 盒子。为了获得额外的隐私/安全性,我将其设置为 OpenVPN 客户端,连接到 OpenVPN 服务器,在我运营的 VPS 上运行。我家的所有流量全天候通过此 VPN 隧道。此设置运行良好。
有时,我希望一些流量绕过 VPN 隧道并使用我的常规非 VPN 连接。目标 IP 地址众多且多种多样,因此简单地硬编码静态路由是不可行的。
相反,我打算在路由器上设置一个 openvpn 服务器实例,供 LAN 上的客户端使用,然后使用基于策略的路由将来自该 vpn 子网(连接的客户端)的所有流量直接路由到我的互联网连接,绕过所有其他互联网流量经过的隧道。这样,我家庭网络上的客户端就可以连接到这个内部 vpn 并访问互联网,而无需通过路由器的 vpn 隧道。
这听起来可行吗?我是否正确地认为我可以通过单独的路由表使用基于源的路由来绕过路由器的客户端 VPN 隧道?为了实现这一点,需要注意哪些陷阱或细节(与 iptables 或路由表相关)?
提前致谢。
答案1
如果我理解正确的话,您网络上的主机的正常运行只是使用其 DHCP 或类似提供的 LAN 配置的 Internet,并且其默认路由是通过 VPN 服务发出的,例如接口tun0
但是,有时,您不想tun0
在一台或多台主机上使用默认路由进行网络活动。您不想关闭整个网络的 VPN 服务,而是打算从 LAN 主机到 Linux 服务器(例如)建立一个 VPN 隧道,该隧道tun1
具有自己的子网(例如)subnetB
,不同于普通的 LAN 主机网络(例如)subnetA
。您希望默认将来自 的流量subnetA
路由到tun0
,但来自本地 VPN 的流量subnetB
不通过隧道流出,而是通过 离开eth0
,不采用隧道。
我建议,不要基于 subnetA
或制定基于源的策略路由subnetB
,而是使用入站接口来分配策略: 入站流量在eth1
离开tun0
。 入站流量在tun1
离开eth0
。
答案2
因此,按照我的初步计划,我成功地完成了任务。
我在路由器上设置了一个 openvpn 服务器,只能从家庭 LAN 访问。如果我家庭 LAN 上的客户端想要访问互联网并绕过路由器通常将所有内部流量路由到互联网的 vpn 连接,它会连接到这个内部 VPN。此 vpn 服务器设置为根据客户端证书分发静态 IP 地址。然后,cl-connect.sh 脚本创建一个单独的路由表和路由规则,以便分配给内部 vpn 上的客户端的特定、预定的 IP 地址通过备用路由表进行路由,该路由表告诉所有这些连接不使用路由器范围的 tun0 接口而是使用直接连接到我的 ISP 的 unvpn-d eth0 接口来连接到互联网。当 LAN 客户端断开连接时,cl-disconnect.sh 脚本也会删除路由。
这样,默认情况下,我家的所有 LAN 流量仍会通过路由器及其 tun0 接口发送到路由器范围的 VPN,从而到达更广泛的互联网。但连接到此新的内部 VPN 服务器的客户端的流量会绕过路由器范围的 VPN,并使用我的 ISP 分配的 IP 地址路由到互联网。
我想知道使用 openvpn 是否有点过头了,而简单的代理服务器设置(squid?)可能会减少路由器的开销。但无论如何,这是可行的。感谢所有参与的人。