Centos

如何配置代理伺服器遠端的透明代理?

  • October 5, 2016

我想要達到的目標

我有一個 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 規則中刪除了介面標誌並且現在可以正常工作

引用自:https://unix.stackexchange.com/questions/314262