docker本身无客户端ip白名单机制,需通过tls认证(强制证书校验)结合iptables或nginx反向代理限制ip访问,并禁用2375等非安全端口,实现通信通道准入与身份验证双重白名单控制。
docker 客户端与守护进程之间本身没有内置的“客户端 ip 白名单”机制,但可通过组合网络层控制、tls 认证和代理策略,实现等效的安全白名单效果。核心思路是:**不靠 docker 自身鉴权,而靠通信通道准入 + 身份验证双重把关**。
启用 TLS 加密并强制证书校验
这是最基础也最关键的一步。Docker 守护进程默认不启用 TLS,远程连接明文传输极不安全。必须生成 CA、服务端证书(server-cert.pem)和客户端证书(cert.pem + key.pem),并在启动时强制校验:
- 修改 /lib/systemd/system/docker.service,在
ExecStart中加入:-H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock(注意端口改用 2376,官方推荐 TLS 端口) - 添加启动参数指定证书路径:
--tlsverify --tlscacert=/path/to/ca.pem --tlscert=/path/to/server-cert.pem --tlskey=/path/to/server-key.pem - 重启服务:
sudo systemctl daemon-reload && sudo systemctl restart docker
此时,任何客户端若未提供合法的 cert.pem 和 key.pem,连接将直接被拒绝——这相当于以证书为“准入凭证”,天然形成逻辑白名单。
在 TLS 基础上限制可连接的 IP 范围
TLS 解决了身份问题,但还需控制谁可以发起连接请求。推荐两种方式:
-
使用 iptables/firewalld 限制端口访问:
例如只允许公司内网段访问:sudo iptables -A INPUT -p tcp --dport 2376 -s 192.168.10.0/24 -j ACCEPTsudo iptables -A INPUT -p tcp --dport 2376 -j DROP -
通过反向代理(如 Nginx)做前置过滤:
监听 2376 端口,配置allow/deny规则,再将合法请求转发至本地127.0.0.1:2376;注意需透传 TLS 并保持证书链完整。
⚠️ 注意:不要仅依赖 subjectAltName=IP:xxx 在证书中硬编码 IP——它只影响证书校验阶段的主机名匹配,不控制网络可达性。
禁用非必要网络暴露,关闭默认宽松模式
避免因配置疏漏导致绕过:
- 确认未启用不安全的 HTTP 远程端口(如
2375),该端口无认证、无加密,一旦开放等于放弃白名单 - 检查 Docker 启动参数中是否含
--icc=false(容器间通信默认禁止),防止攻击者利用容器作为跳板探测宿主机 - 确保
/var/run/docker.sock文件权限为600,且仅 root 或 docker 组用户可读写
客户端调用时必须显式指定证书
白名单效果最终由客户端行为配合完成。合法用户需在每次调用时提供证书:
- 设置环境变量(推荐):
export DOCKER_HOST=tcp://your-server-ip:2376export DOCKER_TLS_VERIFY=1export DOCKER_CERT_PATH=/path/to/client/certs - 或命令行直接指定:
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://x.x.x.x:2376 info
缺少任一证书文件,或证书不被 CA 签发,连接立即失败——无需额外代码或插件,Docker 原生支持。











