容器启动时用--sysctl配置namespaced网络参数是防御ip欺骗最轻量隔离的手段,需设net.ipv4.conf.all.accept_source_route=0、rp_filter=2、accept_redirects/send_redirects=0及lo.rp_filter=0,所有值须为字符串格式且参数名完整。

在容器启动阶段用 --sysctl 收紧网络协议栈,是防御 IP 欺骗最轻量、最隔离的手段——不改宿主机,每个容器按需加固,且参数生效快、无残留。
只设可 namespaced 的关键防护参数
Docker 仅允许容器级修改已隔离(namespaced)的网络参数。以下参数既安全又有效,直接堵住 IP 欺骗常见入口:
-
禁用源路由接收:
net.ipv4.conf.all.accept_source_route = 0—— 内核在网络栈入口丢弃所有含源路由选项的 IPv4 包,不进协议栈、不耗资源 -
启用宽松反向路径过滤:
net.ipv4.conf.all.rp_filter = 2—— 允许回程路由存在任意接口,既防伪造源 IP,又兼容多网卡、NAT 或云环境 -
关闭 ICMP 重定向收发:
net.ipv4.conf.all.accept_redirects = 0和net.ipv4.conf.all.send_redirects = 0—— 防止攻击者篡改容器路由表 -
关闭回环接口路径校验:
net.ipv4.conf.lo.rp_filter = 0—— 解决同主机容器间通信因严格校验导致的 RTT 异常升高问题
正确写法与启动示例
所有值必须为字符串格式(数字也要加引号),参数名必须完整,不能简写:
docker run -d \ --sysctl "net.ipv4.conf.all.accept_source_route=0" \ --sysctl "net.ipv4.conf.all.rp_filter=2" \ --sysctl "net.ipv4.conf.all.accept_redirects=0" \ --sysctl "net.ipv4.conf.all.send_redirects=0" \ --sysctl "net.ipv4.conf.lo.rp_filter=0" \ --name myapi nginx:alpine
注意:--sysctl 不需要 privileged: true 或 SYS_ADMIN 能力,纯网络参数在默认容器能力下即可生效。
为什么不能只靠宿主机全局设置
宿主机上设 accept_source_route = 0 并不能保证容器继承该行为——Docker 容器使用自己的网络命名空间,其初始值来自内核默认或镜像初始化逻辑,可能被覆盖。尤其在 Kubernetes 或自定义 CNI 环境中,新创建的虚拟接口(如 cni0、vethxxx)会沿用 default 接口策略,若未显式配置,仍可能开启源路由。因此,容器启动时注入才是确定性最强的方式。
验证是否真正生效
进入容器后执行:
sysctl net.ipv4.conf.all.accept_source_route \
net.ipv4.conf.all.rp_filter \
net.ipv4.conf.all.accept_redirects
全部应返回 = 0 或 = 2。也可直接读取:
cat /proc/sys/net/ipv4/conf/all/accept_source_route
返回 0 即表示已禁用。若某项仍为 1,说明参数未成功注入,检查引号、拼写及 Docker 版本兼容性(需 Docker 1.12+)。











