我正在尝试将 Squid 设置为我的 OpenVPN 网络内的透明代理:
__________ ________________ _____________
| Client | | OpenVPN server | | Squid Proxy |
| 10.8.0.3 |-------------| 10.8.0.1 |------------------| 10.8.0.2 |
|__________| |________________| |_____________|
基本上我想要实现的是来自客户端的所有 HTTP 流量都通过 Squid 代理;我遵循官方指南(https://wiki.squid-cache.org/ConfigExamples/Intercept/IptablesPolicyRoute)建议标记所有 80 端口流量,然后将其重定向到代理:
# mark everything on port 80 to be routed to the Squid box
iptables -t mangle -A PREROUTING -i tun0 -p tcp --dport 80 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -m mark --mark 2 -j ACCEPT
ip rule add fwmark 2 table proxy
ip route add default via 10.8.0.2 table proxy
所以我这么做了并且ip route get 8.8.8.8 mark 2
返回
8.8.8.8 via 10.8.0.2 dev tun0 table proxy src 10.8.0.1 mark 2 uid 1000
我检查了一下iptables
,发现 80 端口请求已标记。但没有流量到达10.8.0.2
- 就像我的路由被忽略了一样(tcpdump port 80 -i tun0
处为空10.8.0.2
)。
是否有不同的解决方案来在 OpenVPN 网络内部路由 HTTP 流量?
答案1
首先,网关实际上不会对tun
路由做任何事情。要使客户端成为(子)网络的网关,您需要iroute
在其 CCD(client-config-dir
)文件中包含(s)。文件名应该是其通用名称(CN)。
假设您client-config-dir /etc/openvpn/ccd/
在 openvpn 服务器 conf 中,并且代理服务器的 CN 是squid
,则有:
iroute 0.0.0.0 0.0.0.0
在/etc/openvpn/ccd/squid
。
(注意:您可能需要避免推送redirect-gateway
或route 0.0.0.0 0.0.0.0
使用服务器配置,因为您不希望通过tun
代理服务器上自己的默认路由。/etc/openvpn/ccd/DEFAULT
如果您不能/不想在客户端配置中拥有它,您应该能够通过使用该指令来解决这个问题。但您确实需要在其他客户端上添加默认路由,这样才重要iroute
。)
由于您只希望某些流量使用代理服务器作为“网关”,请确保您没有client-to-client
在 openvpn 服务器配置中,否则tun
客户端将直接将流量路由到代理服务器(例如,当它们到达 openvpn 服务器时,它们不会离开隧道,这样您就可以在 IP 级别有选择地转发它们,但由 openvpn 在内部转发)。
由于您在 IP 级别进行转发,因此请确保 IP 转发已启用与sysctl
,和允许在您的防火墙(例如 iptables)中。如果您(或您使用的任何程序)没有另行指示,则后者应为默认设置。
然后在服务器上:
ip route add default dev tun0 table proxy
对于您的用例,您可能甚至不需要fwmark
(和相应的iptables
规则),但是:
ip rule add iif tun0 ipproto tcp dport 80 table proxy
(注意:AFAICRiroute 0.0.0.0 0.0.0.0
不会阻止任何客户端通过tun
服务器进行联系。这就是为什么上述路由和规则也应该允许代理服务器的回复到达客户端。)
编辑:如果您希望 openvpn 服务器本身的 tcp 80 流量也转到代理服务器,则应该这样做:
ip rule add iif lo ippproto tcp dport 80 table proxy