近期,多位 Red Hat Enterprise Linux 9 用户反映,在使用 Docker 或 Podman 容器引擎时,容器内部与外部 HTTPS 服务之间的网络连接出现间歇性中断现象。该问题已在多个社区论坛和 Red Hat Bugzilla 中得到确认,影响范围涵盖生产环境中的关键业务容器化部署。本文将详细梳理该问题的表现、技术成因及当前已知的缓解措施。

问题表现

用户在 RHEL 9 系统上运行 Docker 容器或 Podman 容器时,发现容器进程无法稳定访问外部的 HTTPS 端点(例如 API 服务、数据库连接或云服务网关)。具体症状包括:

  • 容器内 curlwget 请求 HTTPS URL 时,有时成功,有时返回“Connection timed out”或“Connection refused”。
  • 高频请求下,失败比例可达 10%–30%。
  • 问题仅在 RHEL 9 上复现,同一容器镜像在 RHEL 8 或 Ubuntu 22.04 上工作正常。
  • 使用 HTTP(而非 HTTPS)协议时,连接正常。
  • 问题与容器网络模式(bridge、host、macvlan)无关,但桥接模式下影响更为显著。

值得注意的是,该问题并非持续性的完全断连,而是“间歇性丢失”,这给故障排查带来了极大难度。

技术背景与成因分析

RHEL 9 相比上一代版本在网络栈上做出了重要调整,其中最核心的变化是默认启用了 nftables 作为防火墙后端,替代了传统的 iptables。虽然 nftables 在语法和性能上更优,但 Docker 和 Podman 的网络实现长期以来高度依赖 iptables 的 NAT 和过滤规则。

两者之间的兼容性问题正是此次故障的导火索。

1. 连接跟踪与 conntrack 表冲突

内核中的连接跟踪(conntrack)模块负责维护网络连接的状态,以确保 NAT 和状态防火墙的正确运作。当容器发起 HTTPS 连接时,需要经过宿主机的 conntrack 表记录。在 RHEL 9 中,nftables 的默认规则集与 Docker 通过 iptables 插入的规则在 conntrack 表上可能产生冲突,导致某些 SYN 包被错误地标记为“无效”并直接丢弃。由于 HTTPS 基于 TLS 握手,其连接建立流程对丢包极为敏感,一旦 SYN 被丢弃,客户端会重试,但 conntrack 表可能将重试包关联到错误的状态,从而造成间歇性超时。

2. 内核参数与 TCP 拥塞控制

部分用户发现,将 TCP 拥塞控制算法从默认的 cubic 切换为 bbr 后,故障频率有所下降。这暗示问题可能也与内核的网络栈行为有关,尤其是在高并发连接场景下,连接跟踪表的压力增大,错误丢弃的概率上升。

3. DNS 解析与 HTTPS 的耦合

还有观点认为,RHEL 9 的 systemd-resolved 在某些配置下会通过本地回环地址(127.0.0.53)进行 DNS 解析,而 Docker 的默认 DNS 服务器(127.0.0.11)与系统 DNS 之间的转发延迟或冲突,可能导致 HTTPS 证书验证阶段的域名解析延迟,进而被上层应用判定为超时。

官方响应与临时方案

Red Hat 已在 Bugzilla(编号 #2254321 和 #2256389)中确认该问题,并将优先级标记为“高”。官方工程团队正致力于从内核模块和容器网络驱动两个层面修复。目前,以下临时方案已被社区验证为有效:

  1. 切换防火墙后端为 iptables:在 /etc/firewalld/firewalld.conf 中设置 FirewallBackend=iptables,然后重启 firewalld 和 Docker/Podman 服务。此做法可绕过 nftables 与 iptables 的规则冲突,但需注意未来 RHEL 9 更新可能将 iptables 列为废弃。

  2. 调整 conntrack 参数:增大 conntrack 表容量并缩短超时时间,减少表满导致的丢包。
    echo 65536 > /proc/sys/net/netfilter/nf_conntrack_max
    echo 30 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established

  3. 使用 host 网络模式:对于非隔离需求的容器,可使用 --network host 直接共享宿主网络栈,完全绕过容器的 NAT 和 conntrack 问题(注意安全风险)。

  4. 临时禁用 IPv6:部分用户报告,在内核启动参数中添加 ipv6.disable=1 后,HTTPS 连接恢复稳定。但这不适合依赖 IPv6 的环境。

对生产环境的影响与建议

该问题已对多个使用 RHEL 9 作为容器宿主机的企业造成直接影响,尤其是那些运行微服务架构、依赖外部 HTTPS API 的部署。建议运维人员:

  • 在 Red Hat 发布正式补丁前,优先采用“切换 iptables 后端”方案,以最小改动换取高可用性。
  • 密切监控 Docker/Podman 日志(journalctl -u docker -f)以及 conntrack 统计信息(conntrack -S),以便快速定位异常。
  • 考虑将关键 HTTPS 请求的客户端的超时时间从默认的 30 秒适当延长,降低因瞬间丢包导致的应用层错误。

Red Hat 预计将在未来数周内通过 kernel-5.14.0-284.25.1.el9_2 或更高版本的更新中提供修复,届时将同步更新 containernetworking-plugins 包。在此之前,上述临时方案应能帮助大部分用户度过不稳定的时期。

容器化部署的稳定性依赖于底层操作系统与容器运行时之间的紧密协作,这次事件再次提醒我们,即使是成熟的企业级发行版,在引入重大网络栈变更时也需谨慎验证与容器生态的兼容性。