Centos
如何配置代理伺服器遠端的透明代理?
我想要達到的目標
我有一個 CentOS (6.8) 盒子 1.1.1.1 和一個遠端 squid 代理伺服器 2.2.2.2
我正在嘗試
curl http://google.com -x 2.2.2.2:3128
使用沒有 HTTP 代理選項且不尊重http_proxy
變數(例如 telegraf)的應用程序來模擬結果到目前為止我嘗試過的
我嘗試設置 iptables 規則以將流量轉發到代理:
iptables -t nat -A PREROUTING -i eth0 ! -s 2.2.2.2 -p tcp --dport 80 -j DNAT --to 2.2.2.2:3128 iptables -t nat -A POSTROUTING -o eth0 -s 1.1.1.1 -d 2.2.2.2 -j SNAT --to 1.1.1.1 iptables -A FORWARD -s 1.1.1.1 -d 2.2.2.2 -i eth0 -o eth0 -p tcp --dport 3128 -j ACCEPT
然後我發現如果將流量發送到遠端盒子,DNAT 將無法正常工作,因為返回流量無法正確路由。基於此,我將應用程序移動到 CentOS 機器上的 docker 容器(172.17.0.9),併計劃將 iptables 配置保留在主機上,從而修改 iptables 配置:
iptables -t nat -A PREROUTING -i eth0 ! -s 2.2.2.2 -p tcp --dport 80 -j DNAT --to 2.2.2.2:3128 iptables -t nat -A POSTROUTING -o eth0 -s 172.17.0.0/16 -d 2.2.2.2 -j SNAT --to 1.1.1.1 iptables -A FORWARD -s 172.17.0.0/16 -d 2.2.2.2 -i eth0 -o eth0 -p tcp --dport 3128 -j ACCEPT
我還嘗試了以下規則集:
iptables -t nat -A PREROUTING -i eth0 -s 172.17.0.0/16 -p tcp --dport 80 -j DNAT --to-destination 2.2.2.2:3128 iptables -t nat -A POSTROUTING -o eth0 -d 2.2.2.2/32 -j MASQUERADE
這兩個規則集的結果是 http 流量仍然試圖直接到達目的地,而不是通過代理。
[root@host ~]# tcpdump -nnn host 216.58.201.35 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 15:26:24.536668 IP 1.1.1.1.38566 > 216.58.201.35.80: Flags [S], seq 3885286223, win 14600, options [mss 1460,sackOK,TS val 2161333858 ecr 0,nop,wscale 9], length 0
docker 容器上的預設網關正確設置為主機,主機上啟用了 IP 轉發。
[root@docker /]# ip route default via 172.17.0.1 dev eth0 [root@host ~]# sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1
我在這裡遺漏了一些明顯的東西嗎?
解決
使用 iptables 規則集:
-A PREROUTING -p tcp -m tcp --dport 80 -j DNAT --to-destination 2.2.2.2:3128 -A POSTROUTING -s 172.17.0.0/16 -j SNAT --to-source 1.1.1.1
看起來這是因為介面設置不正確(應該是 docker0)——已經從 iptables 規則中刪除了介面標誌並且現在可以正常工作