使用 Docker 进行 iptables 端口重定向

使用 Docker 进行 iptables 端口重定向

我有一个在端口 8080 上运行的 Web 服务,该服务可通过 iptables 在端口 80 上使用,如下所示:

iptables -t nat -A OUTPUT -p tcp -d 127.0.0.0/8 --dport 80 -j REDIRECT --to-port 8080

这有效,但是尝试进入127.0.0.1:80Docker 容器内部失败。我认为这是因为lo容器内是网络命名空间内的单独设备。因此我尝试执行以下操作:

iptables -t nat -A OUTPUT -p tcp -d 172.17.0.0/16 --dport 80 -j REDIRECT --to-port 8080

其中172.17.0.0/26是分配给桥接接口的范围。容器内与(分配给 的 IP )docker0的连接仍然失败。172.17.42.1:80docker0

除了 Docker 创建的标准规则外,没有其他防火墙规则。

为什么这个转发规则仍然失败?

版本:

  • Ubuntu 14.04(3.13.0-36-通用)
  • Docker 1.2.0

答案1

最后,我通过使用稍微不同的范围并在 docker 之前插入 PREROUTING 规则解决了这个问题。

iptables -t nat -I PREROUTING 1 -p tcp -d 172.16.0.0/16 --dport 80 -j REDIRECT --to-port 8080

答案2

您的第一条规则将 127.0.0.0/8 网络中的任何内容重定向到本地 Web 服务,而不是您可能想要重定向到 lo 的内容。

假设你的 lo 接口有 IP 127.0.0.1(几乎可以肯定是这样的)请尝试这个:

iptables -t nat -A OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-port 8080

相关内容