권한 있는 포트 매핑을 갖춘 루트리스 Podman 컨테이너

권한 있는 포트 매핑을 갖춘 루트리스 Podman 컨테이너

매핑된 권한 있는 포트를 사용하여 루트 없는 Podman 컨테이너를 시작하는 방법이 있습니까(컨테이너 서비스는 호스트의 포트 1023 이하를 통해 노출됨)?

달리기

$ podman run --rm -it  -p 80:80 nginx:stable-alpine 
Error: rootlessport cannot expose privileged port 80, you can add 'net.ipv4.ip_unprivileged_port_start=80' to /etc/sysctl.conf (currently 1024), or choose a larger port number (>= 1024): listen tcp 0.0.0.0:80: bind: permission denied

당연히 권한이 부족하여 실패합니다.

$ sudo capsh --caps=CAP_NET_BIND_SERVICE+eip  -- -c 'podman run --rm -it  -p 80:80 nginx:stable-alpine'

root사용자로 Podman 실행

$ sudo capsh --caps=CAP_NET_BIND_SERVICE+eip --user=$USER -- -c 'podman run --rm -it  -p 80:80 nginx:stable-alpine'
Unable to set group list for user: Operation not permitted

권한 으로 인해 실패했습니다 su.

지금까지 나는 모든 프로세스가 몇 초 동안 권한 있는 포트를 바인딩할 수 있도록 일시적으로 허용하는 차선책 솔루션을 찾았습니다.

sudo sysctl net.ipv4.ip_unprivileged_port_start=80 ;\
( sleep 5 ; sudo sysctl net.ipv4.ip_unprivileged_port_start=1024 ) &\
podman run --rm -it  -p 80:80 nginx:stable-alpine 

답변1

systemd 서비스의 Rootless Podman은 User=다음 명령을 사용하여 nginx 컨테이너를 시작할 수 있습니다.소켓 활성화권한 있는 포트를 사용하십시오.

  1. 사용자 생성시험아직 존재하지 않는 경우.
    $ sudo useradd test
    
  2. 사용자의 UID 확인시험
    $ id -u test
    1000
    
  3. 파일 만들기/etc/systemd/system/example3.service내용이 있는
    [Unit]
    Wants=network-online.target
    After=network-online.target
    [email protected]
    [email protected]
    RequiresMountsFor=/run/user/1000/containers
    
    [Service]
    User=test
    Environment=PODMAN_SYSTEMD_UNIT=%n
    KillMode=mixed
    ExecStop=/usr/bin/podman rm -f -i --cidfile=/run/user/1000/%N.cid
    ExecStopPost=-/usr/bin/podman rm -f -i --cidfile=/run/user/1000/%N.cid
    Delegate=yes
    Type=notify
    NotifyAccess=all
    SyslogIdentifier=%N
    ExecStart=/usr/bin/podman run \
         --cidfile=/run/user/1000/%N.cid \
         --cgroups=split \
         --rm \
         --env "NGINX=3;" \
          -d \
         --replace \
         --name systemd-%N \
         --sdnotify=conmon \
         docker.io/library/nginx
    
    (파일을 시스템에 맞게 조정하려면 10002단계에서 찾은 UID로 바꾸세요)
  4. 보안 강화를 위한 선택적 단계: 파일 편집/etc/systemd/system/example3.service명령 --network none에 옵션을 추가합니다 . podman run자세한 내용은 섹션을 참조하세요.컨테이너의 네트워킹 가능성 제한
  5. 파일 만들기/etc/systemd/system/example3.socket내용이 있는
    [Unit]
    Description=Example 3 socket
    
    [Socket]
    ListenStream=0.0.0.0:80
    
    [Install]
    WantedBy=sockets.target
    
  6. 시스템 구성 다시 로드
    $ sudo systemctl daemon-reload
    
  7. 소켓 시작
    $ sudo systemctl start example3.socket
    
  8. 웹 서버 테스트
    $ curl localhost:80 | head -4
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    

이 예시에서 사용된 방법을 사용하려면 컨테이너 이미지가 지원해야 합니다.소켓 활성화. 예를 들어docker.io/library/mariadb그리고docker.io/library/nginx지원하다소켓 활성화하지만 다른 많은 컨테이너 이미지는 지원하지 않습니다.소켓 활성화.

위 단계는 내가 작성한 데모에서 가져온 것입니다. https://github.com/eriksjolund/podman-nginx-socket-activation/tree/main/examples/example3

방금 이것을 시도했기 때문에 이 솔루션이 얼마나 잘 작동하는지 파악해야 합니다.

하나 있다Podman 기능 요청User=systemd 시스템 서비스에 대한 Podman 지원을 추가하는 데 사용됩니다 . 이 기능 요청은 GitHub 토론으로 이동되었습니다.

관련 정보