现在很多玩 VPS 或者软路由的小伙伴,都习惯用 Docker 一键部署各种服务(如 3x-ui、Vaultwarden、Nextcloud、青龙脚本等)。

“复制一段 docker run 命令贴进终端,按回车服务就运行起来了,简直方便到爆!”

但是,90% 的新手在享受 Docker 带来便利的同时,都留下了极其致命的安全隐患:

  1. 盲目使用默认 root 权限运行容器:一旦容器内的开源软件暴露高危漏洞(如 RCE),黑客可以通过“容器逃逸”直接拿到你物理服务器的最高 root 控制权!
  2. Docker 自动绕过 Linux UFW / iptables 防火墙:很多新手在 VPS 上开启了 UFW 防火墙,以为安全了。殊不知 Docker 默认会在 iptables 顶层直接插入端口映射,直接将你没有设置密码的数据库暴露在了公网!

在 2026 年,针对未加固 Docker 服务(如开放 2375 端口、默认数据库端口)的自动自动化扫描脚本在公网上 24 小时不停歇。

本文用大白话带你理清 Docker 安全的四大避坑法则,手把手教你打造金汤城池般的容器防护!


一、一句话搞懂:Docker 为什么需要安全隔离?

我们先用租客与房东的比喻看懂它的底层风险:

PLAINTEXT
普通 Docker 容器 (默认 root 运行):相当于你把房间租给了一个陌生人,而且你直接把整个大门的“主钥匙”也给了他。
                                租客如果在房间里引火烧身(软件漏洞),随时能用钥匙打开大门把整个房子占为己有(物理机提权)。

安全加固后的容器:相当于给租客设置了严格的“防爆隔离间”。
               租客只有房间内部的普通权限(非 root),且不能走出防爆门;即使他在房间里折腾,物理主机的其他系统毫发无伤!

二、Docker 避坑与安全加固四大铁律

铁律一:警惕!Docker 默认绕过 UFW 防火墙

当你运行 docker run -p 8080:8080 时,Docker 会直接在 iptables 的 PREROUTING 链中注入规则。即使你的 UFW 显示 8080 端口禁用,外网依然能直接访问!

解法:在 /etc/docker/daemon.json 中禁止 Docker 自动修改 iptables,或者使用专门的 ufw-docker 修复工具:

JSON
{
  "iptables": false
}

(注意:禁用后需手动管理容器的网络 NAT 转换,或使用 ufw-docker 托管。)


铁律二:绝对禁止将 Docker daemon 2375 API 暴露在公网

某些教程为了方便远程管理 Docker,让新手开启 TCP 2375 未加密端口。这是全网黑客最喜欢的送分题! 任何扫描到 2375 端口的人,可以在 3 秒内向你的服务器注入挖矿脚本(如 XMRig)。

如果要远程管理 Docker,只允许通过 SSH 隧道 (docker -H ssh://root@your-vps) 连接!


铁律三:使用非 root 用户运行容器 (User Namespace & PUID/PGID)

在 docker-compose.yml 中,显式指定运行用户:

YAML
services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    user: "1000:1000" # 指定以普通的 1000 UID 运行,拒绝 root 权限
    security_opt:
      - no-new-privileges:true # 禁止容器内进程提升权限
    read_only: true # 容器根文件系统设为只读
    tmpfs:
      - /tmp # 仅允许临时内存目录可写

铁律四:容器网络隔离 (Bridge vs Macvlan)

不要把所有容器都挂载在默认的 bridge 网络上,防止容器间恶意内网扫描:

BASH
# 创建独立的私有 Docker 网络,禁止外部直接连通
docker network create --internal private_db_net

三、常见报错与故障排查速查表

现象 / 报错 大概率的原因 解决办法
设置 iptables: false 后容器连不上外网 Docker 失去了自动配置 NAT 伪装 (MASQUERADE) 的权限。 运行 iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE 手动补全转发。
容器启动报错 Permission denied 开启了非 root 运行 (user: 1000) 后,宿主机挂载目录的属主依然是 root。 运行 chown -R 1000:1000 /mnt/docker/data 赋予宿主机目录对应的读写权限。
主机重启后 Docker 容器挂载的 IP 变了 容器使用了默认的动态 IP 分配。 在 docker-compose 中使用 ipv4_address 指定固定静态 IP。

四、一句话总结

端口不乱暴露,运行切忌 root! 封死 2375 端口,配置防火墙防绕过,限制容器提权规则,让你的自建服务坚如磐石!

关注 易邦科学上网,及时获取最近更新:

X : https://x.com/rozmiarek760575

版权声明

作者: 易邦

链接: https://blog.e8k.net/posts/docker-security-network-hardening-2026/

许可证: 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。