在网络命名空间中将 SQUID 代理与 VPN 绑定

在网络命名空间中将 SQUID 代理与 VPN 绑定

我的 ubuntu 服务器上安装了 squid 代理,它在默认配置下工作。我还有一个网络命名空间 proxy1,里面运行着 openvpn(我使用类似这个脚本来设置网络命名空间,http://www.naju.se/articles/openvpn-netns.html,然后运行ip netns exec proxy1 openvpn --daemon..

是否可以运行 squid 以便它使用在指定网络命名空间中运行的 vpn 连接作为 tcp_outgoing_something?

理想情况下,我希望在不同的命名空间中同时拥有多个 vpn 连接,例如 usaNamespace 中的 usa vpn 和 germanyNamespace 中的 germany vpn,并为每个连接定义特定的端口,以便 myproxyserver:usaPort 将使用 usa vpn,而 myproxyserver:germanyPort 将使用 germany vpn。这可能吗?

答案1

如果 systemd 允许在命名网络命名空间中运行进程,则可以在网络命名空间中运行 squid。请参阅https://github.com/systemd/systemd/issues/2741,看起来这是无法修复的。但是,那里列出了一些解决方法。

或者,您可以在默认网络命名空间中运行 squid,并使用 tcp_outgoing_address 设置为进入网络命名空间的隧道的 IP 地址。然后使用策略路由(ip 规则)通过 vpn/网络命名空间为来自该 IP 地址的流量设置默认路由。

你实际上根本不需要网络命名空间;只要你的 vpn 有不是替换主默认路由,您可以使用策略路由通过 VPN 为来自 VPN 上 IP 地址的流量设置默认路由。如果您每次在 VPN 上都有相同的 IP 地址,这种方法很有效。

例如

systemctl 启动 openvpn

编辑/etc/iproute2/rt_tables:

...
101     vpn1 

然后

ip route add default via 192.168.0.1 table vpn1 (# where 192.168.0.1 is the remote gateway IP on the VPN)
ip rule add from 192.168.0.99 lookup vpn1 (# where 192.168.0.99 is the local IP address on the VPN)

编辑/etc/squid3/squid.conf:

...
tcp_outgoing_address 192.168.0.99 [[!]aclname] ...
...

(使用 squid acls 选择您想要通过 VPN 传输的流量)。

您可以将相同的技术与命名网络命名空间结合使用,这样即使 VPN 上的本地和远程 IP 地址发生变化,它也能正常工作。在这种情况下,您需要在命名空间中设置 nat/masquerading,并在默认命名空间和 VPN 命名空间之间设置隧道。在这种情况下,隧道将具有您分配的静态 IP 地址,因此这将绕过 VPN 分配的动态 IP 地址。

相关内容