Ubuntu

用於欺騙 DNS 請求的 Squid HTTP 透明代理

  • March 6, 2021

我正在開發一個需要可遠端訪問的透明代理的安全項目。我已經設置了一個執行 Ubuntu 18.04 的 Azure VM,魷魚作為透明代理執行。我只關心通過代理路由外部 HTTP 流量。將連接到代理的客戶端配置了一個 DNS 伺服器,該伺服器將所有請求欺騙到 VM 的 IP。

配置的問題是squid 沒有根據 HTTP 請求的Host標頭透明地代理 HTTP 請求,而是嘗試連接到它們的原始目標 IP 地址(即返回到自身)。結果,在客戶端訪問HTTP網站(以http://scratchpads.org為例)時,出現如下錯誤:

The following error was encountered while trying to retrieve the URL: http://scratchpads.org/

   Connection to 10.0.1.4 failed

The system returned: (111) Connection refused

其中 10.0.1.4 是 VM 的內部 IP。

出於測試目的,squid 配置保持最小:

http_access allow all
http_port 3129
http_port 3128 intercept

VM上通過squid轉發外部流量的iptables配置如下:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128

嘗試訪問網站時的 squid 訪問日誌如下所示:

1614856056.293      0 [request source IP] TCP_MISS/503 4310 GET http://scratchpads.org/ - ORIGINAL_DST/10.0.1.4 text/html
1614856056.619      0 [request source IP] TCP_MISS/503 4218 GET http://scratchpads.org/favicon.ico - ORIGINAL_DST/10.0.1.4 text/html

我檢查了 DNS 請求是否在 VM 上正確解析,並且來自機器的流量沒有通過 squid 路由(如需要),因此沒有轉發循環。squid 啟動日誌、記憶體日誌或訪問日誌中也沒有錯誤。我還嘗試了各種 squid ACL 和 iptables 配置(設置 DNAT 和偽裝規則),但均無效。

有誰知道我怎樣才能根據標頭將 HTTP 請求代理到其原始目的地Host,而不是返回到透明代理的 IP?

事實證明,由於某些充分的原因,這是不可能使用 squid的。我通過在“攔截”模式下設置 Privoxy 解決了這個問題,這正是我需要的。

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