网络宝典
第二套高阶模板 · 更大气的阅读体验

网络容器防火墙配置:Docker 和 Podman 里怎么拦住不该进来的流量?

发布时间:2026-04-28 19:30:54 阅读:0 次

你在本地跑了个 Web 应用,用 ref="/tag/2019/" style="color:#C468A7;font-weight:bold;">Docker 启动后发现浏览器能访问,手机连同一 Wi-Fi 也能直接打开——这听着方便,但其实挺危险。默认情况下,Docker 把容器端口映射到宿主机后,只要宿主机防火墙没设限,局域网内谁都能碰你的服务。

别让容器变成“裸奔”的入口

很多人以为“容器自带隔离”,就放松了网络防护。其实容器共享宿主机内核,网络层面仍依赖宿主机的 iptables/nftables 规则。Docker 启动时会自动往 iptables 的 FORWARD 链里加规则,允许桥接网络通信;Podman(rootless 模式除外)也会类似操作。但这些默认规则不区分来源 IP、不控制协议类型,更不会主动屏蔽扫描行为。

从宿主机防火墙下手最实在

推荐优先用宿主机的 ufwfirewalld 管理入站规则,而不是在容器里装个 iptables 再折腾。比如 Ubuntu 上用 ufw:

sudo ufw default deny incoming
sudo ufw allow OpenSSH
sudo ufw allow from 192.168.1.100 to any port 8080
sudo ufw enable

这样,只有你指定的那台设备(192.168.1.100)能访问宿主机的 8080 端口,其他人都被挡在外面。即使容器映射了 -p 8080:80,也没用。

遇到 Docker 覆盖规则?加个钩子就行

Docker 重启时可能清掉你手动加的 iptables 规则。解决办法是把自定义规则写进 ufw 的 before.rules:

sudo nano /etc/ufw/before.rules
# 在 *filter 上方添加:
-A ufw-before-input -i docker0 -j DROP
-A ufw-before-input -s 192.168.1.0/24 -d 172.17.0.2 -p tcp --dport 22 -j ACCEPT

保存后 sudo ufw reload,就能限制特定容器 IP 只响应指定来源的 SSH 请求。

Podman 用户注意:rootless 模式不走 iptables

如果你用 podman run --userns=keep-id 启的容器,它默认不修改宿主机网络规则,端口映射靠 slirp4netns 实现,天然隔离性更强。这时候想开放访问,得显式加 --publish 0.0.0.0:8080:80,否则只监听 127.0.0.1。顺手一关,局域网就摸不到你的容器了。

小技巧:临时测试别开全端口

开发调试时,与其写 -p 8080:80,不如改成 -p 127.0.0.1:8080:80。这样只有本机 curl 或浏览器能连,隔壁工位同事扫到你的 IP 也打不开。上线前再改回来,心里踏实些。