只对选定的应用程序使用VPN连接
我有一个VPN的访问权限,并且希望只对某些应用程序使用,而不是所有的应用程序。
例如: 如果我连接到VPN,我只想让Opera和Newsbin这两个应用程序使用VPN连接。所有其他的应用程序,比如Outlook,应该使用正常的互联网连接(当VPN连接/打开时)。
Afaik这是不可能的,但我不完全确定。因此,我的问题是:它是可行的吗?
我有一个VPN的访问权限,并且希望只对某些应用程序使用,而不是所有的应用程序。
例如: 如果我连接到VPN,我只想让Opera和Newsbin这两个应用程序使用VPN连接。所有其他的应用程序,比如Outlook,应该使用正常的互联网连接(当VPN连接/打开时)。
Afaik这是不可能的,但我不完全确定。因此,我的问题是:它是可行的吗?
至少在Linux上是可以做到这一点的(我想在BSD和OS X上也可以)。你可以通过以下方式实现:
这里有一个详细指南通过VPN进行路由传输(使用你自己的VPN服务器。
你可以使用Windows防火墙来完成这个任务(前提是你使用的是Win 7或Vista) - 我写了一个指南
像平常一样连接到你的VPN。
打开网络和共享中心–右击任务栏中的互联网连接图标,选择 “打开网络和共享中心"(见下图)
3.你应该看到(至少)两个网络列在 "查看你的活动网络 "下–你的VPN连接和一个叫做 "网络 "的网络–也就是你的ISP连接。确保你的VPN是 "公共网络",而你的ISP连接是 "家庭网络"。如果你需要改变任何一个连接,点击它,一个选项窗口将出现(见下文)。
- 进入 "控制面板",点击 "系统和安全"(见下文)。
5.在出现的窗口中,单击 Windows 防火墙(见下图)。
- 在 Windows 防火墙窗口中,单击左侧窗格中的 "高级设置"(见下图)。注意:您必须以管理员身份登录才能对防火墙设置进行更改。您应该看到一个名为 "Windows Firewall with Advanced Security "的窗口。在该窗口中,单击 "入站规则"(见下文)。
8.在右侧窗格中,您将看到名为 "Windows 防火墙与高级安全 "的窗口。在右侧窗格中,您将看到一个新建规则的选项。单击该选项(见下图)。
9.在 "新入站规则 "向导中,您将看到 "新规则 "选项。在 "新建入站规则向导"(应该会出现)中,执行以下操作。
- 对出站规则重复步骤 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'
route-nopull
来忽略服务器推送的路由。在你的情况下,你可能需要注释掉 redirect-gateway。
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
down
script:
taskkill /f /im 3proxy.exe
因此,当你使用这个配置连接到VPN后,3proxy.exe
进程将被启动,并且在1080
端口上运行一个具有DNS解析能力的localhost限定的SOCKS5代理,现在只需配置你的应用程序使用localhost:1080
SOCKS代理。
你可以用GNU/Linux上的网络命名空间来实现。
下面是如何在一个单独的命名空间中运行OpenVPN和一个单独的应用程序:
创建net网络命名空间。
ip netns add myvpn
在命名空间中启动环回接口(否则很多事情不能如期进行……)
ip netns exec myvpn ip addr add 127.0.0.1/8 dev lo
ip netns exec myvpn ip link set lo up
创建虚拟网络接口,让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
为命名空间内的接口启用IPv4路由和NAT。由于我的默认接口是无线接口,所以我在iptables中使用wl+(可以匹配wlan0、wlp3s0等。 )在iptables中为出线接口设置。如果你使用的是有线接口,你可能应该使用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
配置命名空间里面使用的命名服务器
mkdir -p /etc/netns/myvpn
echo 'nameserver 8.8.8.8' > /etc/netns/myvpn/resolv.conf
差不多完成了。现在我们应该在命名空间
ip netns exec myvpn ping www.google.com
最后在命名空间
ip netns exec myvpn openvpn --config /etc/openvpn/myvpn.conf
启动OpenVPN,一旦tun0在命名空间启动,你就可以启动你想要的程序了!
while ! ip netns exec myvpn ip a show dev tun0 up; do sleep .5; done
ip netns exec myvpn sudo -u $MYSELF popcorntime
另外,在源代码中还有一个包装脚本,你可以根据自己的需要进行调整。
我知道这是我刚碰到的一个迟到的回复,但如果它曾经与某人相关,我有同样的情况,我想通过VPN运行我的工作流量,但不希望我的个人流量通过他们的代理服务器等路由。所以我当时运行的是Win7,但他们的很多系统上还在运行WinXP。最后,他们只是给了我一个第二台电脑运行的工作,解决了这个问题(一个交换机连接到两台电脑,可以只是跳来跳去),但在此之前,我跑了一个虚拟的XP,我设置为我的工作操作系统。我会从所述虚拟机VPN连接到工作,这将使我的个人操作系统流量不受工作限制和监视。
不,它不是。嗯,不是用正常的手段。路由就是路由。路由是在OSI模型的下层操作。你需要发生的是让它在applicaion级别(更高的级别)意识到,这样它就可以检测你使用的是什么程序等。正常的路由器不允许你根据应用程序或端口号来配置路由。
我认为这是可能的,虽然。路由器可以看到端口,所以你可以通过端口号过滤,并将流量发送不同的路线。我敢肯定,我读到的东西前一段时间与思科路由器,可以做到这一点。不过它们的价格并不便宜,而且它们是商业路由器,需要大量的配置,我猜你想要一些简单的家庭使用的东西。
总而言之,就是路由器会需要这个功能,而你的家庭用的bog标准的路由器,甚至是商用的都不支持这些功能。只有思科和Sonicwalls的高级系列才提供这些功能。