Linux

強制 LAN 主機通過代理

  • October 7, 2013

我在 Debian 伺服器上有一個 IPTables 防火牆,後面有一堆主機偽裝。在上游網路中,我無法直接訪問網際網路,我需要通過代理伺服器才能訪問網站。

我希望防火牆後面的主機自動通過代理伺服器,而不需要每個主機自己設置代理(主要是因為我希望能夠單點更改代理地址,因為我有不同的代理用於不同的網路場景)。

有沒有辦法讓 IPTables 強制埠 80 和 443 上的所有傳出流量通過代理?如果沒有,我可以使用其他一些現成的軟體來獲得我需要的行為嗎?

至少有兩種方法可以做到這一點:

  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

引用自:https://serverfault.com/questions/544348