我想要达到的目标
我有一个 CentOS (6.8) 盒子 1.1.1.1 和一个远程鱿鱼代理服务器 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
我在这里遗漏了一些明显的东西吗?
答案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 规则中删除了接口标志,现在工作正常
答案2
DNAT 不适用于当前的 Squid 版本。
它会产生以下错误:
TCP_MISS/403 ... ORIGINAL_DST/<proxy-ip>
WARNING: Forwarding loop detected for...
NAT 配置仅在鱿鱼盒上使用时才有效。这是准确、安全地执行拦截所必需的。要从网关计算机拦截并在单独的鱿鱼盒中引导流量,请使用策略路由
来源:https://wiki.squid-cache.org/ConfigExamples/Intercept/AtSource#outline
可能的解决方案是: