我應該得到一個綁定異常,而不是它綁定在特權連接埠上
% 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/#exusing-privileged-ports