使用 iptables 實作全域代理

使用 iptables 實作全域代理

我在 Windows 環境中運行 Linux 盒子(Lubuntu 12.04),其中 pac 檔案用於配置網路存取。

proxy.pac 檔:

function FindProxyForURL(url, host){
  var proxy_yes = "PROXY xxx.xxx.xxx.xxx:8000";
  var proxy_no = "DIRECT";
  if (shExpMatch(url, "*//yyy.*")) { return proxy_no; }
  if (shExpMatch(url, "*//zzz.zzz.*")) { return proxy_no; }
  if (shExpMatch(url, "*foo.com*")) { return proxy_no; }
  //Proxy anything else
  return proxy_yes;
}

據我所知,Lubuntu 沒有全域代理系統。

我沒有試圖搞亂像 HTTP_PROXY 這樣只有某些程式尊重的 shell 變數(例如,不是 Chromium),而是認為 iptables 可以用於透過代理透明地重定向所有流量,從而有效地實現全域代理。

這可能嗎?

編輯:我應該澄清我不是管理員,也不是試圖設定代理。代理程式已經設定完畢,要讓機器連接到互聯網,需要啟用自動代理設定並將其指向上面的 pac 檔案。直接連線被阻止。

我希望使用 iptables 透過代理程式自動路由流量,而不是單獨配置每個應用程式。

答案1

我承認我以前從未使用過Lubuntu,但我懷疑它只是Ubuntu在虛擬機器中運行的衍生版本。依賴 javascript 進行代理是一件非常愚蠢的事情,因為在許多情況下它很容易被繞過或完全被忽略......這最終破壞了使用代理的優勢。

我首先使用設定適當的代理系統squid。對於衍生產品,儲存庫中ubuntu有一個可以使用或輕鬆安裝的套件。安裝後,先編輯並新增或修改以下您認為合適的設定:squidaptsynaptic/etc/squid/squid.conf

httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
acl lan src 192.168.1.1 192.168.2.0/24
http_access allow localhost
http_access allow lan

您可以使用更多配置選項,但這些對於大多數用途來說都是一個很好的開始。之後,下一步只需在預設路由器中設定 iptables 並將DNAT流量重定向到squid代理即可。

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 192.168.1.1:3128
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128

當然,您希望將其放入某種啟動腳本中,以便每次路由器啟動時都套用規則。此外,請記住,這不會影響https流量,因為https其故意設計為不允許流量被代理(或被中間人攔截/解密等)。如果您想過濾掉流量(到可疑網站),您也可以拋出SquidGuard混合。

可以代理 https 流量,但強烈不建議這樣做。如果您確實想實現該功能,這裡有一個很好的指南這裡

答案2

這就是我最終所做的:

  • 設定環境變數ALL_PROXYHTTP_PROXYHTTPS_PROXYFTP_PROXYNO_PROXY中的/etc/environment
  • 為 apt in 設定 http、https 和 ftp 代理程式/etc/apt/apt.conf.d/80proxy(使用語法Acquire::http::proxy "http://xxx.xxx.xxx.xxx:8000";
  • 使用代理鏈對於任何不尊重環境變數並且沒有內建代理支援的程式。

相關內容