我希望能够以最简单、最通用和最安全的方式在我的服务器中控制哪些程序连接到常规互联网,哪些程序只能通过 VPN 进行通信。
当前设置
我有一台服务器,一台带有 1 Gb RAM 的 Raspberry Pi 4B,连接到我的路由器。我转发到 RPI 的端口是 Wireguard 接口,工作组0,我将其用于我的所有个人设备和传输对等点的端口。
我在 RPI 上运行一些服务,其中一些服务我希望路由到 VPN,除了(例如:Searx、Transmission),其他服务则保持绑定到工作组0接口(例如:Jellyfin)以及将来我希望通过将端口暴露给我的 RPI 来公开的一些接口(例如:Minecraft 服务器)。
目前我正在使用超细纤维束作为我的防火墙,它不会阻止任何来自工作组0以及同一 Wireguard 接口的端口以及传输的对等端口。
我的目标
我希望能够找到一个优雅的解决方案,允许我配置哪些程序走哪条路,以便我可以从我的服务器连接到我的服务器工作组0我在任何地方都有接口,但有些程序会使用 VPN 与外部通信
研究完成
到目前为止我知道 Mulvad VPN 可以用作简单的 Wireguard 接口 -来源:Archwiki- 我想这同样适用于任何其他 VPN 提供商。
我还知道,对于某些程序,例如 Searx,提供了将传出请求绑定到给定接口的可能性 - 通过配置source_ips
- 而且还绑定地址以侦听不同的接口 - 通过配置bind_address
- 这意味着我可以通过 VPN 重定向传出请求并从我的工作组0网络。
似乎大多数 VPN 客户端已经支持任意程序的这种分割隧道功能,这意味着它们可以以某种方式执行此类操作(将给定程序从 VPN 连接中删除)!而且因为它们是开源的,所以解决方案应该是已知的。
我的问题/疑虑
现在假设我会这样做,将出站 Searx 绑定到 VPN,将 Web 界面绑定到工作组0。这引出了问题 1,在这种情况下 DNS 将如何工作? Searchx 完成的所有 DNS 请求都会通过 VPN 路由吗?这是自动的、手动配置的还是什至可能不被支持的东西?
我还知道 Docker 是城里最酷的孩子,它允许用户在预先配置的环境中沙箱应用程序,这将允许我强制给定容器的网络连接。这引出了问题 2,即使我有 RPI,在这种情况下我是否应该使用 docker?
由于性能原因,并且出于极简主义的考虑,我希望将 Docker 排除在外,除非我真的必须这样做,这引出了我的问题 3,如果程序不允许任何配置,是否仍然可以路由该问题编程到给定的接口?这似乎是 Linux 在幕后做的事情,如果我们有多个连接到互联网的接口,我想是操作系统决定程序使用哪个接口,而不是程序本身。谁对此负责?
显然知道 VPN 客户端会这样做,问题 3 没有多大意义,它似乎确实可能,我只是不确定如何实现。
最后,问题 4 是一个更普遍的问题,程序是否必须知道其 IP 地址?因为 Searx 要求您指定传出 IP,而不是传出接口。我想大多数 VPN 都有固定的 IP,因此这无论如何都不会成为问题,对吧?
小笔记
正如我所说,我听说过 Docker,但我正在努力避免使用它。
我也听说过iptables,但是不知道怎么用,而且知道和UFW有冲突。
答案1
我有类似的问题。最初我用它解决了本指南它使用 iptables。此方法需要创建一个用户,其流量强制使用 VPN,因为 iptables 不支持按应用程序过滤。
当我迁移到 Fedora 时,我担心它的 firewalld 可能会与 iptables 的这种低级使用发生冲突,我最终发现了一种使用网络命名空间来管理分割隧道的替代方法。基本上,您设置一个网络命名空间,将 VPN 隧道设为默认/唯一路由,并运行您想要在命名空间中保持私有的应用程序。我认为不必保留特定用户是一个很大的优势。
有一个命名空间-openvpn python 脚本它可以方便地创建一个命名空间并在其中运行 openvpn。该存储库的文档非常技术性,但是有一个使用 namespaced-openvpn 进行 rtorrent 的指南。其中的大部分信息适用于任何应用程序,一旦我仔细阅读它,我发现它比每用户/iptables 方法更容易设置。