在 Ubuntu 上绕过 VPN 进行 HTTP/HTTPS 流量?

在 Ubuntu 上绕过 VPN 进行 HTTP/HTTPS 流量?

我有一台 Ubuntu 14.04 机器,它的所有传出流量都通过 VPN,我需要确保 HTTP 和 HTTPS 流量不通过 VPN。
我研究过静态路由,但它似乎只能处理第 3 层。
我应该如何处理这个设置?谢谢。

答案1

为了通过不同的默认网关路由发往特定端口的数据包,您需要使用 iptables 标记这些数据包,然后通过不同的路由表对其进行路由。

因此,首先创建一个新的路由表,其默认网关是您的本地网关(而不是您的 VPN 网关)

ip route add table 4 default via 192.168.0.1

然后根据目标端口标记您需要的数据包。

iptables -t mangle -A PREROUTING -p tcp --dport 80  -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -p tcp --dport 443 -j MARK --set-mark 4

最后通过新创建的路由表来路由那些标记的数据包。

ip rule add fwmark 4 table 4

我还没有测试上述命令,因此可能需要进行一些调整。

答案2

一种方法是使用ip ruleiptables。例如,标记您要路由的流量

iptables -I OUTPUT -m tcp -p tcp -m multiport --dports 80,443 -j MARK --set-mark 0x0001

然后创建一个新的路由表:

echo 101 r_http >> /etc/iproute2/rt_tables
ip route add default via 10.0.0.1 dev eth0 table r_http
ip route flush cache

现在您已经标记了 HTTP 和 HTTPS 流量,您可以创建规则来应用新的路由表

ip rule fwmark 0x0001 table 101

这应该可行。作为给读者的练习,如何使其永久化以及如何创建默认路线 :-)

答案3

最近我遇到了与 OP 类似的情况。感谢 @Cha0s 和 @Pablo Martinez 提供的答案,我能够让它适应我的情况。

首先,正如他们两人所说,我们必须有 iptables 规则来标记那些不应通过 VPN 的数据包。@Cha0s 将规则放入 mangle 表中是正确的。根据 iptables 手册页,您必须使用 mangle 表来执行 -j MARK 目标。

另一方面,@Pablo Martinez 将它们放入 OUTPUT 链中是正确的,尽管 iptables 手册页说您应该在 PREROUTING 链中使用 -j MARK。这些数据包是在本地主机上生成的,然后发出去。它们不会被 PREROUTING 链处理。但 OUTPUT 链是有意义的,它还有一个 mangle 表。所以这是我使用的 iptables 规则:

iptables -t mangle -I OUTPUT -p tcp -m multiport --dports 80,443 -j MARK --set-mark 0x101

然后创建一个新的路由表并向其中添加一条路由,如@Pablo Martinez 所述:

echo 101 r_http > /etc/iproute2/rt_tables.d/r_http.conf
ip route add table r_http default via 192.168.0.1 dev enp2s0
ip route flush cache

将 192.168.0.1 替换为您的网关或路由器(不是 VPN)的 IP,将 enp2s0 替换为您的网络接口名称。您可以使用“ip addr”来检查接口名称。

最后,添加一个ip规则让iproute2检查标记并使用我们的新路由表。

ip rule add fwmark 0x101 table 101

您可以添加一个 iptables 规则来记录那些发往端口 80 和 443 的数据包。请注意,该规则被添加到过滤表中 OUTPUT 链的顶部,因为过滤表是在 mangle 表之后处理的,并且它必须是第一个规则以避免被忽略。

iptables -I OUTPUT -p tcp -m multiport --dports 80,443 -j LOG --log-prefix "<HTTP/S>" --log-level info

日志条目应该显示在 /var/log/kern.log 中(在 Debian 系统上)。您可以检查它们是否都包含 MARK=0x101。收集到足够的条目后,不要忘记删除日志记录规则。

cat /var/log/kern.log | grep '<HTTP/S>' | less

一旦您确定数据包被正确标记,您可以检查 iproute2 是否会为标记的数据包选择正确的路由。

ip route get to 8.8.8.8
ip route get to 8.8.8.8 mark 0x101

第一行的结果应该告诉你数据包将通过 VPN 网关和隧道设备。第二行应该显示数据包将通过你自己的网关和网络设备。

参考:

答案4

您可以尝试配置您的浏览器以使用代理。
- 您可以在 DNS 中指定代理,但我不熟悉这种技术。(在 IE 中使用 HTTP 代理(或不使用)时 DNS 查找如何工作) - 这也可以通过组策略完成(http://social.technet.microsoft.com/wiki/contents/articles/5156.how-to-force-proxy-settings-via-group-policy.aspx),如果相关浏览器遵守 Internet Explorer 中的设置,您可以轻松地将其部署到整个网络中。

不过,你需要一个 HTTP 代理服务器才能实现此功能(https://stackoverflow.com/questions/1994846/open-source-http-or-https-proxy

这样可以让网络浏览器流量远离 VPN,但其他一切都应该没问题。设置代理服务器,使任何流量都不通过 VPN。

相关内容