仅对选定的应用程序使用 VPN 连接

72 networking windows vpn internet privacy

我可以访问 VPN,并且只想将它用于某些应用程序,而不是所有应用程序。

例如:
如果我连接到 VPN,我只希望 Opera 和 Newsbin 应用程序使用该 VPN 连接。所有其他应用程序,如 fe Outlook,应使用正常的互联网连接(当 VPN 已连接/打开时)。

Afaik 这是不可能的,但我不完全确定。所以我的问题是:它可行吗?

小智 50

至少在 Linux 上可以做到这一点(我也在考虑 BSD 和 OS X)。你可以这样做:

  • 为所有 VPN 流量创建一个 exra 用户。
  • 通过 VPN 创建一个带有 1 个默认路由的额外路由表。
  • 通过 Iptables 配置 Netfilter,以将其他路由表用于源自特定用户 ID 的所有流量。
  • 运行应该在他们自己的用户下使用 VPN 的应用程序。例如“sudo”。

有用于实现上述步骤的脚本在这里或有另一位导游在这里

这是通过 VPN 路由传输的详细指南(使用您拥有的 VPN 服务器。

  • 在 Linux 上更容易:创建网络命名空间,将 VPN 连接到该命名空间,运行应使用 VPN 中的命名空间的应用程序。您甚至可以运行同一应用程序的两个副本,一个使用 VPN,另一个使用直接连接。 (5认同)
  • 我很欣赏这个答案,但问题是关于 Windows 的。 (4认同)

小智 22

您可以使用 Windows 防火墙来完成此操作(前提是您使用的是 Win 7 或 Vista)-我为此编写了一份指南

  1. 像往常一样连接到您的 VPN。

  2. 打开网络和共享中心 - 右键单击​​任务栏中的 Internet 连接图标,然后选择“打开网络和共享中心”(见下文)

  3. 您应该(至少)看到“查看您的活动网络”下列出的两个网络 - 您的 VPN 连接和一个称为“网络”的网络 - 也就是您的 ISP 连接。确保您的 VPN 是“公共网络”,并且您的 ISP 连接是“家庭网络”。如果您需要更改任一连接,请单击它,将出现一个选项窗口(见下文)。

  4. 转到控制面板并单击系统和安全(见下文)。

  5. 在出现的窗口中,单击 Windows 防火墙(见下文)。

  6. 在 Windows 防火墙窗口中,单击左窗格中的高级设置(见下文)。注意:您必须以管理员身份登录才能更改防火墙设置。

  7. 您应该会看到一个标题为具有高级安全性的 Windows 防火墙的窗口。在此窗口中,单击入站规则(见下文)。

  8. 在右侧窗格中,您将看到一个新规则选项。单击它(见下文)。

  9. 在新建入站规则向导(应该会出现)中,执行以下操作:

    • 选择程序并单击下一步。

    • 选择您希望阻止除 VPN 连接之外的所有流量的程序,然后单击下一步。

    • 选择阻止连接。

    • 勾选域和私有。确保公共未被选中。

  10. 对出站规则重复步骤 9。

  • 这真的回答了这个问题吗?是的,如果它不在 VPN 上,这会阻止应用程序工作,但所有流量仍然通过 VPN,不是吗? (13认同)
  • 是的,这个答案与OP的要求相反。我只需要允许特定应用程序使用 VPN 网络。 (5认同)
  • @pramble 那么所有流量是否仍然通过 vpn? (3认同)

use*_*ser 9

我已经在 Windows 上做到了这一点。这个想法是将传出的网络包绑定到 VPN 的接口。人们为此建议使用ForceBindIP,但多亏了这个答案,我有了使用代理的想法。这种方法的缺点是您的应用程序必须具有代理支持,或者您必须使用代理程序(请参阅此处此处)。好处是这样你就可以使用 FoxyProxy 或类似的附加组件将浏览器中 VPN 的使用限制到特定域。

我在 SOCKS 模式下使用3proxy并将其外部接口绑定到 VPN 的 IP。OpenVPN 用于 VPN 连接。

在我的 .ovpn 文件 ( client, dev tun) 中,我添加了以下几行:

route-nopull
route 0.0.0.0 0.0.0.0 vpn_gateway
pull-filter ignore "dhcp-option DNS "
script-security 2
up 'c:\path\to\up.cmd'
down 'c:\path\to\down.cmd'
Run Code Online (Sandbox Code Playgroud)

route-nopull忽略从服务器推送的路由。在您的情况下,您可能需要注释掉重定向网关。

route 为此接口添加路由,如果没有此行,即使应用程序绑定到它也不会使用它。

pull-filter保留推送的 DNS,否则将route-nopull与推送的路由一起丢弃。从 OpenVPN 2.4 开始支持此选项,如果您必须坚持使用 OpenVPN 2.3(Windows XP 的最新版本),则必须添加两dhcp-option DNS x.x.x.x行硬编码 IP。

script-security 2 允许编写脚本。

up 脚本:

cd %~dp0
echo auth none> 3proxy-openvpn.conf
echo internal 127.0.0.1>> 3proxy-openvpn.conf
echo external %4>> 3proxy-openvpn.conf
echo socks>> 3proxy-openvpn.conf
start /b 3proxy.exe 3proxy-openvpn.conf
Run Code Online (Sandbox Code Playgroud)

down 脚本:

taskkill /f /im 3proxy.exe
Run Code Online (Sandbox Code Playgroud)

因此,在您使用此配置连接到 VPN 后,3proxy.exe进程将启动,并且具有 DNS 解析功能的本地主机限制的 SOCKS5 代理将在1080端口上运行,现在只需将您的应用程序配置为使用localhost:1080SOCKS 代理。


小智 8

您可以使用 GNU/Linux 上的网络名称空间来实现。

以下是在单独的命名空间中运行 OpenVPN 和单个应用程序的方法:

创建网络命名空间:

ip netns add myvpn
Run Code Online (Sandbox Code Playgroud)

启动namespace中的loopback接口(不然很多东西不能按预期运行……)

ip netns exec myvpn ip addr add 127.0.0.1/8 dev lo
ip netns exec myvpn ip link set lo up
Run Code Online (Sandbox Code Playgroud)

创建虚拟网络接口,让 OpenVPN(在命名空间中)访问真实网络,并将命名空间(vpn1)中的接口配置为使用命名空间(vpn0)外的接口作为其默认网关

ip link add vpn0 type veth peer name vpn1
ip link set vpn0 up
ip link set vpn1 netns myvpn up
ip addr add 10.200.200.1/24 dev vpn0
ip netns exec myvpn ip addr add 10.200.200.2/24 dev vpn1
ip netns exec myvpn ip route add default via 10.200.200.1 dev vpn1
Run Code Online (Sandbox Code Playgroud)

为命名空间中的接口启用 IPv4 路由和 NAT。由于我的默认接口是无线接口,我在 iptables 中使用 wl+(可能匹配 wlan0、wlp3s0 等)作为传出接口;如果您使用有线接口,您可能应该使用 en+(或 br+ 用于桥接接口)

iptables -A INPUT \! -i vpn0 -s 10.200.200.0/24 -j DROP
iptables -t nat -A POSTROUTING -s 10.200.200.0/24 -o wl+ -j MASQUERADE
sysctl -q net.ipv4.ip_forward=1
Run Code Online (Sandbox Code Playgroud)

配置名称服务器以在命名空间内使用

mkdir -p /etc/netns/myvpn
echo 'nameserver 8.8.8.8' > /etc/netns/myvpn/resolv.conf
Run Code Online (Sandbox Code Playgroud)

差不多完成了,现在我们应该在命名空间中拥有完整的网络访问权限

ip netns exec myvpn ping www.google.com
Run Code Online (Sandbox Code Playgroud)

最后在命名空间中启动 OpenVPN

ip netns exec myvpn openvpn --config /etc/openvpn/myvpn.conf
Run Code Online (Sandbox Code Playgroud)

一旦 tun0 在命名空间中启动,您就可以启动您想要的程序了!

while ! ip netns exec myvpn ip a show dev tun0 up; do sleep .5; done
ip netns exec myvpn sudo -u $MYSELF popcorntime
Run Code Online (Sandbox Code Playgroud)

来源文章。

源文章中还有一个包装脚本,您可以根据自己的需要进行调整。


小智 6

在 Windows 上,您可以使用支持“拆分隧道”的 VPN。

一种是 Proton VPN(提供免费版本,允许您选择想要或不想要访问 VPN 的应用程序)。

否则只需谷歌:带有分割隧道的VPN,就会出现很多。


dro*_*owa 5

只需通过虚拟机访问 VPN。

  1. 创建一个虚拟机,然后从虚拟机内部...
  2. 安装“选定”的应用程序
  3. 配置 VPN

使用 VM 中的“选定”应用程序,而不是使用主机中的应用程序。

PS 当然,您需要通过主机为 VM 提供网络访问权限。

  • @fixer1234:没有人提到虚拟机。 (2认同)

小智 5

如果您使用的是 Linux,并且使用 openVPN,则VPNShift可以完美地工作。

  • “对多个问题的相同答案”*这一事实真的那么重要吗?问题存在,它(尚未)被标记为重复,并且它是一个很好的答案,所以它应该存在。谢谢@thouliha。 (12认同)

pig*_*ger 5

现在有一个更简单的 Linux 解决方案,在编写这些答案时还没有,但它绝对值得放在这里。这是一个名为Vopono的程序。

它的工作原理是在您的 PC 上创建临时网络命名空间以供运行特定命令。一旦程序完成运行,它将摆脱命名空间。

它直接支持 Mullvad、AzireVPN、MozillaVPN、TigerVPN、ProtonVPN、iVPN、NordVPN 和 PIA 等 VPN,但也可以支持 Wireguard、OpenVPN、OpenConnect 和 OpenFortiVPN 协议的自定义配置文件。

自定义配置文件的用法示例:

vopono exec --custom vpn_config.ovpn --protocol openvpn "command"
Run Code Online (Sandbox Code Playgroud)

更详细的使用信息可以在这里找到。


小智 -9

不,不是。好吧,不使用正常手段。路由就是路由。路由在 OSI 模型的较低层运行。您需要做的是让它在应用程序级别(更高)上有所了解,以便它可以检测您正在使用什么程序等。普通路由器不允许您根据应用程序或端口号配置路由。

我认为这是可能的。路由器可以看到端口,因此您可以按端口号过滤它们并将流量发送到不同的路由。我确信我不久前读过一些有关思科路由器的内容,可以做到这一点。不过它们的价格并不便宜,而且它们是需要大量配置的商业路由器,我猜你想要一些简单的家用路由器。

总之,路由器需要此功能,而家庭使用的标准路由器则需要此功能,即使企业不支持这些功能。只有 Cisco 和 Sonicwalls 的高级产品线才能提供这些功能。