我有一个 Linux VPS,并且只想路由单身的通过商业 VPN(Mullvad)访问应用程序。我不想将 VPN 作为网络接口连接并通过它路由所有流量。该应用程序支持本地 SOCKS5 代理。如何在不使用虚拟机或单独服务器等昂贵且繁琐的解决方案的情况下实现这一点?
答案1
您不能使用 SOCKS,因为它在与 VPN 不同的 OSI 级别上工作(即在 TCP 级别)。根据其帮助页面,Mullvad VPN“仅”通过 Wireguard 和 OpenVPN 提供 VPN 服务(这没什么不对,但说明它有助于定义我们正在处理的限制)。
处理此问题的最简单方法 - 如果您的应用程序允许 - 是设置 VPN,使其不遵守默认网关,并且您只通过它推送与应用程序关联的 IP 地址。
如果您无法基于 IP 地址进行路由,则替代方案会复杂得多,并且取决于相关应用程序的具体情况/实现 - 而您不想要的虚拟机可能是最简单的方法,并且未来出现故障的可能性最小。要在没有 VM 或类似设备的情况下执行此操作,您需要进入基于策略的路由,并找出如何识别要通过 VPN 网关路由的数据包,例如,您可以使用基于策略的路由和 NAT 以及 iptables 中的“所有者”模块 - 这显然可以让您根据 UID、GID、PID、SID 命令选择规则。这是相当高级的路由。(我是一名经验丰富的 Linux 系统管理员,我相信我可以做到,但我预计我需要一段时间才能“做到”)https://stackoverflow.com/questions/4314163/create-iptables-rule-per-process-service#4314473提供了一些有用的提示,但并没有深入问题的策略路由方面。 https://serverfault.com/questions/699481/route-ip-traffic-based-on-process-to-different-default-routes-interfaces还暗示了通过使用命名空间或策略路由来解决路由方面问题的可能方法。
答案2
对于 Cisco AnyConnect、Juniper SSL VPN 和一些其他专有协议OpenConnect和代理服务器/通索克斯支持,将 VPN 公开为 SOCKS/HTTP 代理。
对于 WireGuard,有韓國語言學家,工作组-http-代理,有线代理,奥内顿
对于 OpenVPN,有一个修补为 ocproxy 支持,但它已经过时了(对于 2.3.x 分支)。我已将其移植到最近 2.5,但这是 PoC(尚不支持 Windows)。
在 Linux 上,您可以使用网络命名空间,启动 VPN 并在每个命名空间中设置代理服务器。这是一种通用方法,但维护起来有点麻烦。