CentOS Stream 10 Docker 容器无法访问外网:xt_addrtype 内核模块缺失解决方法

一、问题背景

CentOS Stream 10 上安装 Docker 后,发现 Docker 服务可以正常启动,但是部分 Docker 容器无法访问外网。

例如:

复制代码
docker exec alpine1 ping -c 3 8.8.8.8

出现:

复制代码
3 packets transmitted, 0 packets received, 100% packet loss

而新创建的默认 bridge 网络容器却可以正常访问:

复制代码
docker run -d --name alpine-test alpine sleep 3600

docker exec alpine-test ping -c 3 8.8.8.8

结果:

复制代码
3 packets transmitted, 3 packets received, 0% packet loss

说明 Docker 本身、宿主机网络以及 NAT 基本正常,问题集中在原来的 Docker 自定义网络。


二、排查 iptables 的 addrtype 模块

首先检查:

复制代码
sudo modprobe xt_addrtype

提示:

复制代码
modprobe: FATAL: Module xt_addrtype not found

继续检查:

复制代码
sudo iptables -m addrtype --help

出现:

复制代码
Warning: Extension addrtype revision 0 not supported, missing kernel module?

再检查:

复制代码
sudo modinfo xt_addrtype

结果:

复制代码
modinfo: ERROR: Module xt_addrtype not found.

确认当前内核:

复制代码
uname -r

例如:

复制代码
6.12.0-254.el10.x86_64

三、确认 xt_addrtype 属于哪个软件包

使用 DNF 查询:

复制代码
dnf provides '*/xt_addrtype.ko*'

发现:

复制代码
kernel-modules-extra-6.12.0-254.el10.x86_64

也就是说,xt_addrtype 并不在当前已经安装的基础内核模块中,而是在:

复制代码
kernel-modules-extra

四、安装 kernel-modules-extra

直接安装与当前内核版本对应的软件包:

复制代码
sudo dnf install kernel-modules-extra-$(uname -r)

安装完成后检查:

复制代码
find /lib/modules/$(uname -r) -type f | grep xt_addrtype

应该能够看到:

复制代码
/lib/modules/6.12.0-254.el10.x86_64/kernel/net/netfilter/xt_addrtype.ko.xz

然后加载模块:

复制代码
sudo modprobe xt_addrtype

确认:

复制代码
lsmod | grep xt_addrtype

正常结果类似:

复制代码
xt_addrtype  12288  0

至此,xt_addrtype 内核模块缺失问题解决。


五、重启 Docker

重新加载模块后重启 Docker:

复制代码
sudo systemctl reset-failed docker
sudo systemctl restart docker
sudo systemctl status docker --no-pager -l

确认:

复制代码
Active: active (running)

说明 Docker 服务正常。


六、重新创建 Docker 测试容器

为了排除原有容器网络配置问题,建议重新创建两个测试容器。

先删除旧容器:

复制代码
docker rm -f alpine1 alpine2 2>/dev/null

删除旧的自定义网络:

复制代码
docker network rm ssc_net 2>/dev/null

重新创建网络:

复制代码
docker network create --driver bridge ssc_net

创建两个 Alpine 容器:

复制代码
docker run -d \
  --name alpine1 \
  --network ssc_net \
  alpine sleep 3600

docker run -d \
  --name alpine2 \
  --network ssc_net \
  alpine sleep 3600

查看:

复制代码
docker ps

应该看到:

复制代码
alpine1
alpine2

七、检查容器网络

查看 alpine1

复制代码
docker exec alpine1 ip addr
docker exec alpine1 ip route

正常情况下:

复制代码
inet 172.18.0.2/16
default via 172.18.0.1 dev eth0

alpine2 通常会获得:

复制代码
172.18.0.3/16

测试 Docker 网关:

复制代码
docker exec alpine1 ping -c 3 172.18.0.1

测试外网:

复制代码
docker exec alpine1 ping -c 3 8.8.8.8

然后测试第二个容器:

复制代码
docker exec alpine2 ping -c 3 8.8.8.8

如果均出现:

复制代码
3 packets transmitted, 3 packets received, 0% packet loss

说明 Docker 自定义 bridge 网络已经恢复正常。


八、进一步测试 DNS 和 HTTP

测试 DNS:

复制代码
docker exec alpine1 ping -c 3 www.baidu.com

或者:

复制代码
docker exec alpine1 nslookup www.baidu.com

测试 HTTP/HTTPS:

复制代码
docker exec alpine1 wget -O- -T 5 https://www.baidu.com

如果能够正常返回百度网页 HTML,说明:

复制代码
容器
  ↓
Docker bridge
  ↓
Docker NAT
  ↓
宿主机
  ↓
外网

整条网络链路已经正常。


九、问题原因总结

本次问题的核心不是 Docker 服务本身,也不是宿主机无法联网,而是:

复制代码
CentOS Stream 10
        ↓
当前内核 6.12.0-254.el10
        ↓
缺少 kernel-modules-extra
        ↓
缺少 xt_addrtype.ko
        ↓
iptables addrtype 模块无法加载
        ↓
Docker 网络相关规则无法正常工作

通过安装:

复制代码
kernel-modules-extra-$(uname -r)

即可获得:

复制代码
xt_addrtype.ko.xz

然后:

复制代码
sudo modprobe xt_addrtype

即可加载。


十、完整解决命令

如果遇到同样的问题,可以直接按照下面的顺序执行:

复制代码
# 1. 查看当前内核
uname -r

# 2. 安装额外内核模块
sudo dnf install kernel-modules-extra-$(uname -r)

# 3. 加载 xt_addrtype
sudo modprobe xt_addrtype

# 4. 确认模块
lsmod | grep xt_addrtype

# 5. 重启 Docker
sudo systemctl reset-failed docker
sudo systemctl restart docker

# 6. 删除旧测试容器和网络
docker rm -f alpine1 alpine2 2>/dev/null
docker network rm ssc_net 2>/dev/null

# 7. 创建新的 Docker 网络
docker network create --driver bridge ssc_net

# 8. 创建测试容器
docker run -d --name alpine1 --network ssc_net alpine sleep 3600
docker run -d --name alpine2 --network ssc_net alpine sleep 3600

# 9. 测试外网
docker exec alpine1 ping -c 3 8.8.8.8
docker exec alpine2 ping -c 3 8.8.8.8

# 10. 测试 HTTPS
docker exec alpine1 wget -O- -T 5 https://www.baidu.com

总结

CentOS Stream 10 上 Docker 网络异常时,如果发现:

复制代码
modprobe xt_addrtype

提示:

复制代码
Module xt_addrtype not found

首先不要急着修改 Docker 的 NAT 规则。

先检查:

复制代码
dnf provides '*/xt_addrtype.ko*'

如果发现该模块属于:

复制代码
kernel-modules-extra

直接安装:

复制代码
sudo dnf install kernel-modules-extra-$(uname -r)

再执行:

复制代码
sudo modprobe xt_addrtype

最后重新创建 Docker 网络和容器进行测试。

关键点:内核版本和 kernel-modules-extra 必须匹配。

例如当前内核:

复制代码
6.12.0-254.el10.x86_64

就应该安装:

复制代码
kernel-modules-extra-6.12.0-254.el10.x86_64

而不是随便安装其他版本。

相关推荐
x17388062731 小时前
Linux
linux
加油码1 小时前
探秘 volatile关键字:编译器的过度优化
linux·bug·信号处理
怦怦蓝1 小时前
Windows 安装 Docker Desktop 踩坑完整实战指南(WSL2 故障排错实录)
windows·docker·容器
行业研究员1 小时前
TDSQL-C:云原生架构与AI能力解析
人工智能·云原生·架构·云原生数据库·ai能力解析
Delite8022 小时前
磷酸酯抗燃油矿物油检测技术及多行业应用场景解析
网络·安全
聚美智数2 小时前
SSL证书信息查询-SSL域名解析-SSL证书查询服务-SSL证书解析服务API接口介绍
网络·网络协议·ssl
瓦学妹2 小时前
美国住宅IP如何选?不同平台配置选择标准与教程指南
网络·网络协议·tcp/ip
人间凡尔赛2 小时前
当 AI Agent 攻陷网关:Istio agentgateway 与 Gateway API Inference Extension 实战解析
后端·云原生·架构