Docker丢弃net_bind_service失效 非root用户可绑定1024以下端口问题问询
问题1解答
Linux内核的能力是绑定到进程而非用户身份的。Docker默认会给所有容器授予NET_BIND_SERVICE能力,该能力对容器内所有进程生效,不受进程运行用户身份限制。因此哪怕你切换到nobody非root用户启动Java进程,进程仍然持有NET_BIND_SERVICE能力,可正常绑定1024以下的端口。
问题2解答
显式移除NET_BIND_SERVICE后仍然能绑定80端口,核心原因是容器内内核参数net.ipv4.ip_unprivileged_port_start被设置为了0:
Linux 4.11及以上内核引入了该参数,用于指定非特权用户可绑定的最小端口号,原生默认值为1024。但现在绝大多数容器运行时为了降低非root用户运行容器的门槛,会默认将该参数值调整为0,意味着所有用户都可以绑定0-65535范围内的任意端口,完全不需要NET_BIND_SERVICE能力。
你可以进入运行中的容器执行sysctl net.ipv4.ip_unprivileged_port_start验证参数值。
问题3解答
Moby源码中列出的默认授予能力,是授予整个容器的允许能力集合,对容器内所有用户(包括root和非root)的进程都生效,不是仅针对root用户。
非root用户启动的进程不是完全没有能力,会从容器的允许能力集合中继承可继承的能力项,默认配置下非root进程也能拿到NET_BIND_SERVICE等默认授予的能力。
内容的提问来源于stack exchange,提问作者samshers
相关产品推荐
相关产品推荐

