如何使IPTables规则允许访问DOCKER_HOST:PUBLISHED_PORT

75次阅读
没有评论

问题描述

在使用 docker-compose 时,将容器端口9300发布到主机端口9307。通过 docker-compose ps 命令确认主机端口9307在0.0.0.0上处于打开状态。通过 netstat -tulpan | grep LISTEN 命令确认主机正在监听0.0.0.0:9307。然而,尝试访问该端口时,IPTables 阻止了访问(使用 telnet 连接时会出现 “connection refused” 错误)。

当发布的端口也是9300时,不会出现这个问题。但在这种情况下,用户必须发布到另一个端口,因为9300已被占用。用户观察到 Docker 和 IPTables 之间有一种”通信”,因为如果更改容器的 CIDR,IPTables 规则会反映这种更改。然而,对于发布的端口,情况并非如此。

用户想知道,为了使 IPTables 规则允许访问 DOCKER_HOST:PUBLISHED_PORT,应该采取什么措施?

解决方案

请注意以下操作可能涉及对网络配置进行更改,确保在操作前备份并了解可能的风险。

检查防火墙规则

首先,确保检查并更新防火墙规则,以便允许流量通过发布的端口。以下是可能的步骤:

  1. 查看当前的 IPTables 规则,以确认是否存在针对9307端口的阻止规则。使用以下命令查看规则列表:

bash
sudo iptables -L -n

  1. 如果存在针对9307端口的拒绝规则,您需要删除它。使用以下命令删除规则,将其中的 rule_number 替换为实际规则的编号:

bash
sudo iptables -D INPUT rule_number

更新 Docker 配置

如果您更改了容器的 CIDR,您可能需要更新 Docker 的配置,以确保 Docker 和 IPTables 之间的通信得以正确反映。您可以尝试以下步骤:

  1. 停止正在运行的容器和服务:

bash
docker-compose down

  1. 修改您的 Docker 配置文件(通常是 /etc/docker/daemon.json),添加或更新 "iptables": false 配置,以禁用 Docker 自己的 IPTables 规则管理。

json
{
"iptables": false
}

  1. 重新启动 Docker 服务:

bash
sudo systemctl restart docker

检查端口映射配置

确保在您的 docker-compose.yml 文件中正确配置了端口映射。确认容器端口9300正确映射到了主机端口9307。

示例 docker-compose.yml 文件片段:

version: '3'
services:
  your_service:
    image: your_image_name
    ports:
      - "9307:9300"
    # 其他配置项

检查网络模式

确保您的容器使用了正确的网络模式。在某些情况下,使用 bridge 网络模式可能会导致端口访问问题。您可以尝试将网络模式更改为 host 或者其他适合您需求的模式。

验证连接

在完成以上步骤后,您可以尝试重新启动容器并验证访问主机端口9307是否正常:

  1. 启动容器:

bash
docker-compose up -d

  1. 尝试使用 telnet 命令连接到 DOCKER_HOST:9307,确认连接是否成功:

bash
telnet DOCKER_HOST 9307

如果一切正常,您应该能够成功连接到主机端口9307,而不再遇到 “connection refused” 错误。

请根据您的实际情况逐步执行上述操作,并确保在每个步骤之后进行测试。如果问题仍然存在,您可能需要进一步检查防火墙规则、Docker 配置和容器设置,以排除可能的问题。

正文完