Ubuntu
用於欺騙 DNS 請求的 Squid HTTP 透明代理
我正在開發一個需要可遠端訪問的透明代理的安全項目。我已經設置了一個執行 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 解決了這個問題,這正是我需要的。