我要达到的目标
我有一个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
我是否在这里遗漏了一些明显的东西?
解决
使用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规则中删除了接口标志,现在可以正常工作
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句