iptablesredirect到docker容器中的不同host / tproxy

我开始怀疑这是不是可以做iptables,但我想透明地将httpsredirect到redsocks(proxyish)服务器。

设置是这样的。 我在boot2docker中,并且想要使用需要validation的上游代理。 我在一个docker集装箱里运行CNTLM,还有一个munkyboy / redsocks的图像。 Redsocks将一切交给cntlm,然后再上游。

然后我用了一条线

iptables -t nat -A PREROUTING -p tcp '!' -s $CNTLM --dport 443 -j DNAT --to $REDSOCKS:12346 

这对任何正在NAT的任何东西都很有用。 它经历了redsocks和cntlm,然后是互联网,它不知道它是使用代理。 然而,因为它是prerouting表,这只适用于主机以外的其他东西。 我希望它也能在主机上工作。 到处谈论使用输出表,就像

 iptables -t nat -A OUTPUT -p tcp --dport 443 -j DNAT --to $REDSOCKS:12346 

这似乎是奇怪的https。 看着日志,redsocks获取连接,将它传递给CNTLM,但是然后cntlm打印这个

cntlm[1]: 172.17.0.9 CONNECT 172.17.0.9:12346

作为curl https://google.com的结果

我认为DNAT正在改变数据包的IP dst? 做DNAT,我认为https通过代理使用。 有趣的是,它在PREROUTING表和OUTPUT表中的工作方式不同。

我也尝试了使用TPROXY的MANGLE表,但是这只在PREROUTING上才可用。 我也看到有人在DNAT使用REDIRECT ,但似乎只是把它redirect到这台机器上的一个端口。 所以不是特别有用,除非我可以使用REDIRECT把它指向veth设备上的端口。

我对iptables有些不好意思,上师知道这是可能的吗?

你应该可以用Docker来做到这一点,而不必惹上iptables。