如何在代理服务器位于远程的情况下配置透明代理?

如何在代理服务器位于远程的情况下配置透明代理?

我想要达到的目标

我有一个 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

可能的解决方案是:

相关内容