我在 Debian 服务器上安装了 IPTables 防火墙,防火墙后面有一堆伪装的主机。在上游网络中,我无法直接访问互联网,我需要通过代理服务器才能访问网站。
我希望防火墙后面的主机自动通过代理服务器,而无需每个主机都自行设置代理(主要是因为我希望能够在单点更改代理地址,因为我针对不同的网络场景使用了不同的代理)。
有没有办法让 IPTables 强制端口 80 和 443 上的所有传出流量都通过代理?如果没有,我可以使用其他现成的软件来获得我需要的行为吗?
答案1
至少有两种方法可以做到这一点:
- 通过 DHCP 代理自动配置 URL
- 使用 iptables 进行透明代理重定向
第一个选项使用WPAD机制:
在您的 DHCP 服务器配置中,您必须包含选项 252(例如对于 dhcpd):
option local-proxy-config code 252 = text;
...
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.20 192.168.0.30;
...
option local-proxy-config "http://your_http_server/proxy.pac";
}
你的 proxy.pac 只是一小段 JS,它告诉浏览器要代理什么(例如):
function FindProxyForURL(url, host) {
var proxy = "PROXY your_proxy_server:3128; DIRECT";
var direct = "DIRECT";
// no proxy for local hosts without domain:
if(isPlainHostName(host)) return direct;
// proxy everything else:
return proxy;
}
第二种选择是使用iptables透明地重定向 http 流量(例如):
iptables -t nat -A PREROUTING -i eth0 -s ! your_proxy_server -p tcp --dport 80 -j DNAT --to your_proxy_server:3128
iptables -t nat -A POSTROUTING -o eth0 -s local-network -d your_proxy_server -j SNAT --to iptables-box
iptables -A FORWARD -s local-network -d your_proxy_server -i eth0 -o eth0 -p tcp --dport 3128 -j ACCEPT
答案2
是的,你可以,它被称为透明拦截代理。只需将流量重定向到 squid 并将其配置为透明代理即可。
顺便说一句,在客户端上手动部署代理配置是有好处的。如果有任何东西直接与你的代理通信,你就知道有什么不对劲。你可以用主机名而不是 IP 来定义代理,因此你可以参考这个主机名来更改 IP。