docker run --rm --cap-drop=net_bind_service --publish 8080:80 --name nginx nginx
ps --forest -fC nginx
UID PID PPID C STIME TTY TIME CMD
root 449870 449847 0 12:38 ? 00:00:00 nginx: master process nginx -g daemon off;
101 449929 449870 0 12:38 ? 00:00:00 \_ nginx: worker process
101 449930 449870 0 12:38 ? 00:00:00 \_ nginx: worker process
101 449931 449870 0 12:38 ? 00:00:00 \_ nginx: worker process
101 449932 449870 0 12:38 ? 00:00:00 \_ nginx: worker process
101 449933 449870 0 12:38 ? 00:00:00 \_ nginx: worker process
101 449934 449870 0 12:38 ? 00:00:00 \_ nginx: worker process
101 449935 449870 0 12:38 ? 00:00:00 \_ nginx: worker process
101 449936 449870 0 12:38 ? 00:00:00 \_ nginx: worker process
101 449937 449870 0 12:38 ? 00:00:00 \_ nginx: worker process
101 449938 449870 0 12:38 ? 00:00:00 \_ nginx: worker process
101 449939 449870 0 12:38 ? 00:00:00 \_ nginx: worker process
101 449940 449870 0 12:38 ? 00:00:00 \_ nginx: worker process
따라서 이 과정은 그렇지 않습니다.네트워크 바인딩 서비스, 그러나 포트 80을 시작하고 바인딩할 수 있었습니다.
getpcaps 449870
449870: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep
이것 좀 봐:
docker run --rm --privileged --pid container:nginx --network container:nginx -it --volumes-from nginx --name debug nixery.dev/shell/gnugrep/ps/libcap/htop/lsof/iproute2 bash
bash-5.2# ps aufx
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
0 112 0.0 0.0 4936 4184 pts/0 Ss 19:55 0:00 bash
0 123 0.0 0.0 7240 2324 pts/0 R+ 19:56 0:00 \_ ps aufx
0 1 0.0 0.0 8940 6052 ? Ss 19:38 0:00 nginx: master process nginx -g daemon off;
101 29 0.0 0.0 9328 2564 ? S 19:38 0:00 nginx: worker process
101 30 0.0 0.0 9328 2564 ? S 19:38 0:00 nginx: worker process
101 31 0.0 0.0 9328 2564 ? S 19:38 0:00 nginx: worker process
101 32 0.0 0.0 9328 2564 ? S 19:38 0:00 nginx: worker process
101 33 0.0 0.0 9328 2564 ? S 19:38 0:00 nginx: worker process
101 34 0.0 0.0 9328 2564 ? S 19:38 0:00 nginx: worker process
101 35 0.0 0.0 9328 2564 ? S 19:38 0:00 nginx: worker process
101 36 0.0 0.0 9328 2564 ? S 19:38 0:00 nginx: worker process
101 37 0.0 0.0 9328 2564 ? S 19:38 0:00 nginx: worker process
101 38 0.0 0.0 9328 2564 ? S 19:38 0:00 nginx: worker process
101 39 0.0 0.0 9328 2564 ? S 19:38 0:00 nginx: worker process
101 40 0.0 0.0 9328 2568 ? S 19:38 0:00 nginx: worker process
bash-5.2# ss -ltnp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=40,fd=6),("nginx",pid=39,fd=6),("nginx",pid=38,fd=6),("nginx",pid=37,fd=6),("nginx",pid=36,fd=6),("nginx",pid=35,fd=6),("nginx",pid=34,fd=6),("nginx",pid=33,fd=6),("nginx",pid=32,fd=6),("nginx",pid=31,fd=6),("nginx",pid=30,fd=6),("nginx",pid=29,fd=6),("nginx",pid=1,fd=6))
LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=40,fd=7),("nginx",pid=39,fd=7),("nginx",pid=38,fd=7),("nginx",pid=37,fd=7),("nginx",pid=36,fd=7),("nginx",pid=35,fd=7),("nginx",pid=34,fd=7),("nginx",pid=33,fd=7),("nginx",pid=32,fd=7),("nginx",pid=31,fd=7),("nginx",pid=30,fd=7),("nginx",pid=29,fd=7),("nginx",pid=1,fd=7))
그렇다면 컨테이너가 포트 80을 시작하고 바인딩할 수 있지만 net_bind_service
프로세스가 나열되지 않는 이유는 무엇입니까?모자?
답변1
Docker는 낮은 포트(및 기타 기능)에 대한 권한 있는 바인딩을 활성화하는 대신 권한 있는 낮은 포트 값을 0으로 낮추어 장벽을 제거하고 권한 없는 프로세스가 모든 포트에 바인딩되도록 허용합니다.
// allow opening any port less than 1024 without CAP_NET_BIND_SERVICE if sysctlExists("net.ipv4.ip_unprivileged_port_start") { s.Linux.Sysctl["net.ipv4.ip_unprivileged_port_start"] = "0" }
호스트의 네트워크나 구성이 달리 지정하지 않는 한. 위의 줄과 유사하게 루트가 아닌 컨테이너에서 ping이 허용됩니다(권한을 요구하는 데 사용됨).