我在 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
答案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 隧道的端点(在本地主机)转发到另一台机器