允许桥接网络上的 docker 容器使用 iptables 连接到主机

允许桥接网络上的 docker 容器使用 iptables 连接到主机

我最近尝试部署 iptables 以仅公开相关端口。我使用 删除每个传入连接 iptables -P INPUT DROP ,然后允许访问相关端口。这确实有效,但会破坏我在 docker 容器中运行的 web 服务器的 haproxy 设置。容器现在无法连接到主机网络。我尝试使用 允许 docker 容器连接到主机

Iptables -A INPUT -i docker0 -j Accept

但这并不奏效,Web 服务器仍然无法响应 haproxy。如果您能提供任何关于如何修复此问题并允许容器再次连接到主机的想法,我将不胜感激。

答案1

我不太了解 Web 服务器或 HAProxy,但我可以给你一些 IPtables 建议,然后回答你的问题。

  1. IPtables 自上而下读取规则,当遇到 DROP、REJECT 或 ACCEPT 时停止读取规则。
  2. IPtables 区分大小写。AcceptACCEPT
  3. -P当表中没有其他规则适用于给定的数据包时,使用IPtables 策略。
  4. iptables -t filter -F确保在添加新的 IPtables 规则时,通过输入和清除旧规则iptables -t filter -X。这两个命令将清除过滤表(默认表)并清除表中的任何子链。
  5. 确保客户端上的规则反映在主机上,并确保主机上的规则反映在客户端上。

回答你的问题...

首先,尝试通过运行以下命令来彻底清除防火墙,以清除 IPtables 中的所有表:

iptables -t raw -F
iptables -t mangle -F
iptables -t nat -F
iptables -t filter -F
iptables -t raw -X
iptables -t mangle -X
iptables -t nat -X
iptables -t filter -X

然后确保没有其他防火墙正在运行。

CentOS/Fedora/Rhel:

systemctl stop firewalld

Debian / Ubuntu:

systemctl stop ufw

然后,进行一些测试。HAProxy 能正常工作吗?如果能正常工作,则问题出在防火墙上。如果不能正常工作,则问题出在防火墙上。不是工作,那么你需要修改你的 IPtables 规则。也许从让你的 IPtables 规则尽可能不具体开始,然后变得越来越具体。以下是我建议的开始方式:

确保服务器上启用了环回流量。环回流量永远不会离开服务器:

iptables -t filter -A INPUT -i lo -j ACCEPT

尝试将 HAProxy 服务器的 IP 而不是端口列入白名单:

iptables -t filter -A INPUT -s ${HAPROXY_IP} -j ACCEPT

允许ESTABLISHEDRELATED连接:

iptables -t filter -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

相关内容