强制 LAN 主机通过代理

强制 LAN 主机通过代理

我在 Debian 服务器上安装了 IPTables 防火墙,防火墙后面有一堆伪装的主机。在上游网络中,我无法直接访问互联网,我需要通过代理服务器才能访问网站。

我希望防火墙后面的主机自动通过代理服务器,而无需每个主机都自行设置代理(主要是因为我希望能够在单点更改代理地址,因为我针对不同的网络场景使用了不同的代理)。

有没有办法让 IPTables 强制端口 80 和 443 上的所有传出流量都通过代理?如果没有,我可以使用其他现成的软件来获得我需要的行为吗?

答案1

至少有两种方法可以做到这一点:

  1. 通过 DHCP 代理自动配置 URL
  2. 使用 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。

相关内容