Debian 系统解决 Podman 容器无法连接外网
Debian 系统内的 Podman 容器无法连接外网,表现为 IP 通但是域名不通,确定了主机的 DNS 没有问题。但是禁用 UFW 防火墙之后又可以连接外网。启用 UFW 时查看日志发现:
1 | 2025-08-05T17:39:08.608253+08:00 * kernel: [UFW BLOCK] IN=podman1 OUT= MAC=* SRC=10.89.0.8 DST=10.89.0.1 LEN=70 TOS=0x00 PREC=0x00 TTL=64 ID=57601 DF PROTO=UDP SPT=60822 DPT=53 LEN=50 |
确定了是 UFW 阻止了容器的通信。
通过 podman info
查询,确定 Podman 使用的网络后端为 netavark
。
从日志可以看出:
1 | SRC=10.89.0.8 DST=10.89.0.1 LEN=70 ... PROTO=UDP SPT=60822 DPT=53 |
SRC=10.89.0.8
:容器的 IP 地址DST=10.89.0.1
:Podman 的内置 DNS 服务(由netavark
提供,监听在网关地址上)DPT=53
:目标端口是 DNSIN=podman1
:数据包从podman1
接口进入
这说明:容器尝试访问 10.89.0.1:53
做 DNS 解析,但被 UFW 拦截了。
🔍 问题本质
UFW 默认策略是 限制 FORWARD 链和 INPUT 链对非本机接口的访问。虽然 podman1
是一个虚拟网桥,UFW 会将其视为“外部”接口并默认阻止其流量。
UFW 的 DEFAULT_INPUT_POLICY
通常为 DROP
或 REJECT
,而容器访问 10.89.0.1:53
实际上是发往主机上的服务(即 netavark
内建 DNS),所以该请求需要经过主机的 INPUT 链,因此被拦截。
✅ 解决方案
方法一:允许 podman1
接口的 DNS 流量
1 | sudo ufw allow in on podman1 proto udp to 10.89.0.1 port 53 |
这条规则明确允许从 podman1
接口进入、目标为 10.89.0.1:53
的 UDP 和 TCP 流量(DNS)。
方法二:更宽松 —— 允许整个 podman1
子网的通信(适用于多个容器)
如果你有多个 Podman 网络或动态 IP 分配,可以允许整个子网:
1 | sudo ufw allow from 10.89.0.0/16 to any port 53 proto udp |
这样,如果存在使用 53 端口的容器,容器之间也可以互相通信。但是一般不会出现这样的情形,我还是建议使用方法一。
重启 UFW
1 | sudo ufw disable && sudo ufw enable |
🔧 验证方法
- 在容器中测试 DNS:
1 | podman exec -it <container> ping www.baidu.com |
- 查看 UFW 日志是否还有
podman1
被 block:
1 | sudo tail -f /var/log/ufw.log | grep podman1 |
🛡️ 安全建议
- 不要完全禁用 UFW 来解决此问题。
- 不要使用
ufw default allow
,会降低安全性。 - 使用 最小权限原则:只放行必要的端口(如 53 DNS)。
- 如果你使用多个 Podman 网络(如
podman2
,podman3
),需对每个接口重复规则或使用子网范围。
❓ 常见疑问
非 Root 下的 Podman 就没有这个问题……?
Root 模式下的 Podman 使用 CNI
(4.x 及之前版本) 或者 netavark
(从 Podman 5 开始),它创建 podman0
这样的网桥。而非 Root 模式下的 slirp4netns
基于用户态网络,一般不走防火墙,所以可能不会遇到这样的问题。
Fedora 和 RHEL 系(CentOS / Rocky Linux / AlmaLinux 等)也没有这样的问题……?
Podman 在创建容器的时候,会自动调整 nftables
规则,以确保容器能够正常访问外网。
Fedora 和 RHEL 系(CentOS / Rocky Linux / AlmaLinux 等)一般使用 firewalld
而不是 ufw
,firewalld
是基于 nftables
的防火墙,所以不会出现此类问题。而 UFW 是基于 iptables
的防火墙。
同样地,如果在 Fedora 和 RHEL 系(CentOS / Rocky Linux / AlmaLinux 等)上使用 Docker,如果不做调整,容器也会无法访问外网。这是因为 Docker 使用 iptables
而不是 nftables
。
- 标题: Debian 系统解决 Podman 容器无法连接外网
- 作者: GT610
- 创建于 : 2025-08-07 11:11:33
- 更新于 : 2025-09-23 15:09:18
- 链接: https://gt-610.dpdns.org/2025/08/07/solve-podman-ufw-dns-issue/
- 版权声明: 本文章采用 CC BY 4.0 进行许可。