将本地主机请求重定向到 Linux 容器

将本地主机请求重定向到 Linux 容器

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

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

如果流量来自外部我的主机。如果请求是由 localhost 发出的,则不起作用:

 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 规则,这就是它无法正常工作的原因。有什么办法可以让它正常工作吗?

答案1

如果你愿意接受不涉及的解决方案iptables,你可以运行一个简单的代理服务器(如平衡或者哈普罗西或者或其他东西)来拦截流量localhost并将其传递给您的容器。

答案2

@Brigo:这是不正确的。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 目标,但它无法解决这个问题。

答案3

我花了很多时间尝试让 iptables 完成这个技巧,但不知何故如果你将 dnat 目标添加到 nat 表的输出链中,数据包的进一步处理似乎会停止。

可以使用以下技巧来调试 iptables:http://backreference.org/2010/06/11/iptables-debugging/

Linux 中数据包流的图形概览也有帮助:http://inai.de/images/nf-packet-flow.png

我已经求助于 xinetd 来解决我的问题,请参阅将 SSH -L 隧道的端点(在本地主机)转发到另一台机器

相关内容