1

我在 RedHat 8 中运行 docker 容器。在我的 docker 容器中,我暴露了端口 8080 以便从外部访问。我可以从其他服务器远程登录 8080,但我无法通过 IP 地址从主机服务器远程登录 8080。

[root@redhat1 biz]# cat docker-compose.yml 
version: '3'  
services:
  web:
    image: nginx:latest
    ports:
     - "8080:80"
    links:
     - php
  php:
    image: php:7-fpm

在此处输入图像描述

使用 IP 地址无法从主机服务器访问暴露的端口 8080。它可以通过 localhost 或 127.0.0.1 远程登录 8080。

主机服务器上的 telnet IP_Address 8080 有问题。

通过 IP 地址从其他服务器 Telnet 8080 是可以的。

来自其他服务器的 telnet IP_Address 8080 正常

4

2 回答 2

0

本地生成的数据包不通过 NAT PREROUTING,这是大多数“转发端口”(DNAT)实现添加规则的地方。这解释了为什么您尝试使用来自不同服务器的公共 IP 地址有效。

可以使用 NAT OUTPUT 链使 localhost 案例工作。我希望 docker 也会为这种情况添加一条规则。

例如 docker 可能有这样的规则:

# iptables -t nat -A OUTPUT -p tcp --dst 127.0.0.1 --dport 8080 -j REDIRECT --to-ports 80

可能缺少的是与您的公共 IP 地址匹配的类似规则。这是有问题的,因为该规则需要知道您的公共 IP。这或许可以解释为什么 docker 不生成此规则。

# iptables -t nat -A OUTPUT -p tcp --dst a.b.c.d --dport 8080 -j DNAT --to-destination 127.0.0.1:80

默认情况下,Firewalld 不会阻止 OUTPUT 数据包。除非您自己进行了更改,否则我认为这不太可能是原因。暂时禁用它是一种快速验证的方法。

于 2021-10-25T15:17:45.403 回答
0

在 firewalld 上检查主机服务器的防火墙设置以获取端口 8080 传入。

您可能需要修改主机上的 iptables 规则以允许来自 Docker 容器的连接。像这样的东西可以解决问题:

iptables -A INPUT -i docker0 -j ACCEPT 这将允许从 Docker 容器访问主机上的任何端口。

iptables 规则是有序的,此规则可能会或可能不会执行您想要执行的操作,具体取决于在此之前的其他规则。

您将只能访问正在侦听 INADDR_ANY 例如 0.0.0.0 或明确侦听 docker0 接口的主机服务。

于 2021-06-07T11:47:27.513 回答