docker容器安全内核参数配置需区分namespaced(如net.,容器内可设)与non-namespaced(如vm.、fs.*,须宿主机预设)两类;前者用于单容器网络栈加固,后者影响全局且必须提前配置,严禁滥用--privileged或sys_admin权限。

配置 Docker 容器的安全内核参数,核心是分清两类参数:容器内可安全设置的 namespaced 参数(如 net.* 类),和必须在宿主机提前配置的 non-namespaced 参数(如 vm.*、fs.*)。盲目在容器里改全局参数会失败,甚至引发安全风险。
只配容器能管的网络命名空间参数
这类参数作用于单个容器的网络栈,不影响其他容器或宿主机,适合做细粒度安全加固:
-
net.ipv4.conf.all.rp_filter=1:启用反向路径过滤,防止 IP 欺骗;若用 lo 通信频繁,可单独设
net.ipv4.conf.lo.rp_filter=0 - net.ipv4.tcp_syncookies=1:开启 SYN Cookie,缓解 SYN Flood 攻击
- net.ipv4.icmp_echo_ignore_broadcasts=1:忽略广播 ping,防 Smurf 攻击
- net.core.netdev_max_backlog=5000:限制网卡接收队列深度,降低突发流量冲击面
宿主机必须提前设好的全局参数
这些参数不支持 per-container 隔离,容器启动前就得在宿主机上配好,否则应用可能启动失败或行为异常:
-
vm.max_map_count(Elasticsearch 等依赖):建议设为
262144或更高 - net.bridge.bridge-nf-call-iptables=1:确保 CNI 插件能正确处理桥接流量
-
fs.file-max:配合容器内
--ulimit nofile使用,避免文件描述符耗尽 - kernel.kptr_restrict=2 和 kernel.yama.ptrace_scope=1:防止容器内进程窥探或注入宿主机内核指针
启动时正确注入方式
用 --sysctl 只传 namespaced 参数,多个参数可重复使用,值必须是字符串格式:
docker run \ --sysctl net.ipv4.tcp_syncookies=1 \ --sysctl net.ipv4.conf.all.rp_filter=1 \ --sysctl net.core.netdev_max_backlog=5000 \ -d nginx
在 docker-compose.yml 中写法要更严格:
sysctls: - net.ipv4.tcp_syncookies=1 - net.ipv4.conf.all.rp_filter=1
避免高危权限滥用
不要为了“能改参数”就加 --privileged 或 --cap-add=SYS_ADMIN。绝大多数安全调优无需这些权限:
-
--privileged会绕过所有隔离机制,等于放弃容器安全边界 -
--cap-add=NET_ADMIN仅在需操作 iptables 或启用转发时才加,且应配合网络策略限制 - 真正需要
SYS_ADMIN的场景极少,比如运行自定义 cgroup 工具,普通服务完全不需要











