将本地主机请求redirect到Linux容器

我在Ubuntu主机上运行了几个Linux容器,每个都运行一个webapp。 要访问webapps,我使用iptables转发端口:

 sudo iptables -t nat -A PREROUTING -p tcp --dport <port> -j DNAT --to-destination #<container_ip>:<port> 

如果stream量来自我的主机之外 ,这很好。 如果请求由本地主机完成,则不起作用:

  curl <host_ip>:<port> #works (from outside the host) curl <container_ip>:<port> #works (from inside the host) curl 127.0.0.1:<port> #doesn't work (from inside the host) 

我知道来自本地主机的数据包不经过iptables DNAT规则,这就是为什么它不起作用。 有没有办法得到这个工作?

如果你对不涉及iptables解决scheme开放,你可以运行一个简单的代理服务器(如平衡或haproxy或钢笔或其他东西)截获stream量到localhost ,并将其传递到您的容器。

@布里戈:这是不正确的。 nat表可以包含一个OUTPUT链。 问题是nat表的PREROUTING链没有应用到回送接口。

@rmonjo,除PREROUTING链之外还使用OUTPUT链:

 iptables -t nat -A OUTPUT -o lo -p tcp --dport <port> -j DNAT \ --to-destination #<container_ip>:<port> 

编辑:这不起作用。 我正在考虑REDIRECT的目标,这不会解决这个问题。

我花了很多时间试图让iptables做这个技巧,但是不知何故,如果你添加一个dnat目标到nat表的输出链,那么这个包的进一步处理似乎就停止了。

iptables的debugging可以用这个技巧来完成: http : //backreference.org/2010/06/11/iptables-debugging/

在Linux中的数据包stream的graphics概述也有帮助: http : //inai.de/images/nf-packet-flow.png

我使用了xinetd来解决我的问题,请参阅将SSH -L隧道的端点(在本地主机上)转发到另一台机器