非 root 用户如何监听特权端口

非 root 用户如何监听特权端口

我应该得到一个绑定异常,但它绑定在特权端口上

% docker run --rm -u nobody  alpine  nc -l 0.0.0.0 443
% docker exec -it b2b471d05398 sh
~ $ id
uid=65534(nobody) gid=65534(nobody)
~ $ ps
PID   USER     TIME  COMMAND
    1 nobody    0:00 nc -l 0.0.0.0 443
    8 nobody    0:00 sh
   15 nobody    0:00 ps
~ $ %

甚至尝试了另一种方法,通过构建Dockerfile

FROM python:latest
COPY index.html /
EXPOSE 80
USER nobody
CMD python -m http.server 80
docker build -t test .
docker run --rm -u nobody  test
~ % docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
b40c6c33a187   test      "/bin/sh -c 'python …"   28 seconds ago   Up 27 seconds   80/tcp    practical_lumiere

我也试过这个,仍然可以绑定小于 1024 的端口

docker run --rm -u nobody --cap-drop=SETUID --cap-drop=NET_BIND_SERVICE --cap-drop=SETFCAP --cap-drop=NET_RAW  alpine  nc -l 0.0.0.0 443

答案1

容器的默认内核调整参数 net.ipv4.ip_unprivileged_port_start设置为0,这使得docker容器中的所有端口都无特权。

即使作为非特权用户,容器内的所有进程都可以绑定到(容器的)任何端口。

关于在主机操作系统上以非特权用户身份公开特权端口,请参阅https://docs.docker.com/engine/security/rootless/#exposing-privileged-ports

相关内容