我应该得到绑定异常,而不是绑定端口
% 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
~ $ %
我也试过这个,仍然可以绑定小于 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
这是设计使然。请参阅以下文档: 特权端口未在容器内映射。
1024 以下的 TCP/IP 端口号被视为特权端口。出于各种安全原因,普通用户和进程不得使用它们。但是,Docker 允许将容器端口映射到特权端口。
[...]
但是,如果用户明确声明,Docker 允许将容器端口映射到主机上的特权端口。这是因为容器是使用 NET_BIND_SERVICE Linux 内核功能执行的,该功能不限制特权端口映射。特权端口接收和传输各种安全敏感的数据,允许容器使用它们不符合良好的安全实践。
Docker 使用允许绑定的 Linux 内核功能执行。因此,即使与正常使用相冲突,绑定也适用于 Docker。