是否可以配置(Squid)代理以便浏览器可以绕过 VPN?

是否可以配置(Squid)代理以便浏览器可以绕过 VPN?

我想做以下事情(如果可能的话):

正常情况下,使用 1 个浏览器(例如 Firefox)- 所有流量都使用我的 VPN。使用另一个浏览器(例如 Chrome),所有流量都会绕过 VPN。

我已经使用 OpenVPN 设置了带有 VPN 的 PC,并且我知道如何添加静态路由,以便对特定 IP 地址的访问将绕过 VPN。

我认为我想要做的事情可能是通过设置一个(Squid)代理服务器来实现的,该代理服务器将所有流量路由到 VPN 之外,然后配置 Chrome 浏览器以使用该代理服务器。除非有更好/更简单的方法?

但是尽管我阅读了大量资料并进行了大量的实验(我不是网络专家),但我不知道如何实现这一点并配置 Squid/routes,也没有找到任何资源来告诉我如何做(或者是否可能)。

任何帮助或信息链接均将不胜感激。

答案1

我认为最好的方法是不要改变你当前的设置,而是利用Linux 命名空间相反。为了方便起见,您可以使用 nsjail 或 Firejail 之类的工具。

这个想法是为应该绕过 VPN 的其他浏览器设置一个专用的命名空间,并设置自己的路由规则。这就是您所需要的,更改路由规则,使其使用常规以太网接口,而不是 OpenVPN 创建的 tun 接口。

另一个好处是隔离应用程序。通过限制它们的范围和它们能够看到的资源,您可以有效地将它们彼此隔离。

这里我粗略地介绍了如何使用 Firejail - 我鼓励您阅读文档以微调配置以获得所需的结果。Firejail 附带了适用于常见应用程序的现成配置文件,因此它可以立即开始对您的浏览器和其他应用程序进行沙盒处理。

还有一个 GUI 配置工具(firetools),但我的建议是只使用一个应用程序尝试 Firejail,而不是重新配置整个环境。

下面是使用Python(假设你有网络接口包已安装)。

firejail --net=enp4s0 --noprofile python3

>>> 导入 netfaces
>>> netifaces.interfaces()
['lo','eth0-11182']

如你所见,Python 只看到一个接口(除了环回接口)。eth0-11182 当然是一个虚拟接口,它只存在于当前命名空间内。

建议阅读:Firefox 沙盒指南

答案2

我没有使用过squid,但据我所知它只是一个常规代理,因此通过将其安装在您的计算机上,它仍然遵循您的操作系统路由规则。

我将尝试以下设置:

  1. 配置 OpenVPN 以不是更改默认网关
  2. 在运行 OpenVPN 服务器的同一台机器上安装 squid 或其他代理服务

配置此设置后,您的浏览器将默认不使用 VPN,您可以将其中一个浏览器配置为使用服务器的 OpenVPN 子网地址通过代理服务器进行访问。

注1:您必须通过 OpenVPN 子网地址而不是其公共 IP 使用代理。

笔记2:不允许从 OpenVPN 子网外部访问代理服务器端口,可以使用 iptables 来实现,或者通过使用云提供商规则不打开端口来实现

更新:

当使用外部 VPN 服务(例如:nordVPN)时,您无法访问运行 OpenVPN 服务器的机器,这使得上述解决方案无效,因为您无法在运行 OpenVPN 服务器的机器上安装任何东西。

可以在本地子网中的另一台设备和某些路由器上安装代理服务(例如:微罗蒂克) 提供此功能。但这将使解决方案仅在具有此设置的特定位置上起作用。

答案3

感谢大家到目前为止提出的所有想法和评论。我还没有开始firejail使用 VPN(@Anonymous 的建议)。但我专门跟进了 @ofirule 链接的建议这个答案使用控制组。

该答案有一个指向完整 shell 脚本的链接,可以自动完成所有操作,但我想至少先手动执行操作,这样我就可以跟着做,并确保我确切地知道我在改变什么。因此,按照那里的手册操作方法,我将在下面发布我为其他人所做的确切操作。

请注意,我的网络接口名为enp0s31f6我的网关 IP 是192.168.0.1我认为,对于其他跟随此事件的人来说,这两个具体的事情可能需要改变:

# Install required tools
sudo apt-get install cgroup-lite cgroup-tools

sudo su

# Define a control group named novpn with a classid of 11:11
cd /sys/fs/cgroup/net_cls
mkdir novpn
cd novpn
echo 0x00110011 > net_cls.classid

# Add mark 11 on packets of classid 0x00110011
iptables -t mangle -A OUTPUT -m cgroup --cgroup 0x00110011 -j MARK --set-mark 11

# Force the packets to exit through my interface (enp0s31f6) with NAT
iptables -t nat -A POSTROUTING -m cgroup --cgroup 0x00110011 -o enp0s31f6 -j MASQUERADE

# Define a new "novpn" routing table
echo 11 novpn >> /etc/iproute2/rt_tables

# Packets with mark 11 will use novpn
ip rule add fwmark 11 table novpn

# Add a route for default gateway for novpn
ip route add default via 192.168.0.1 table novpn

# Unset reverse path filtering for all interfaces
# My PREVIOUS VALUES: lo was 0, others (all, default, enp0s31f6) were 2 in case I need to revert back.
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $i; done

exit

# Create control group    
sudo cgcreate -t $USER:$USER -a $USER:$USER -g net_cls:novpn

# Run app on specific novpn interface (close all browser windows first)
killall firefox
cgexec -g net_cls:novpn firefox

我(还)没有完全理解上述所有内容,但它确实有效!:-) 通过命令运行 Firefox,cgexec我可以在 VPN 处于活动状态的情况下在 Firefox 中检查我的 IP,并可以看到它报告的是我的实际公共 IP 而不是 VPN IP。我还通过运行一个在使用 VPN 时出现问题的广播流媒体服务证明了此方法的有效性 - 现在它可以完全绕过 VPN 正常运行。

相关内容