티스토리 뷰

지난 글에 이어서 일반 유저로 1024 미만의 포트(== privileged 포트)를 사용하는 것에 대해 정리해보려고 한다. 결과부터 얘기하면 커널 파라미터를 조정하는 방식으로 구성할 예정이다.

 

안되는거 알아요

 

 

 

1. 기본 설정으로 일반 유저가 privileged 포트를 사용할 경우

먼저 nginx 컨테이너의 포트를 privileged 포트 중 하나에 바인딩하면 어떤 문제가 발생하는지 알아보자. 테스트 환경은 Ubuntu 22.04.4 LTS이다.

 

먼저 nginx 이미지를 받고

$ podman pull docker.io/ngin

 

 

privileged 포트 중 하나인 443 포트에 컨테이너의 80번 포트를 바인딩하면

$ podman run --rm -d --name nginx -p 443:80 docker.io/library/nginx

 

 

다음과 같은 메세지와 함께 컨테이너가 뜨지 않는 것을 확인할 수 있다.

Error: rootlessport cannot expose privileged port 443,
you can add 'net.ipv4.ip_unprivileged_port_start=443' to /etc/sysctl.conf (currently 1024), 
or choose a larger port number (>= 1024): listen tcp 0.0.0.0:443: bind: permission denied

 

 

에러 메세지를 보면 알 수 있듯이 net.ipv4.ip_unprivileged_port_start 값을 /etc/sysctl.conf에 추가하거나, 1024 이상 포트를 사용해야 한다.

 

 

 

2. 커널 파라미터 조정

커널 라파미터란 커널의 작동 방식을 제어하는 방법으로, 커널 파라미터를 핸들링하기 위해 sysctl 커맨드를 활용하고 설정 값은 /etc/sysctl.conf에서 수정 및 확인할 수 있다.


1024 이상의 포트를 사용하는게 우리의 목적이 아니므로, 에러 메세지에서 나온 것처럼 커널 파라미터(net.ipv4.ip_unprivileged_port_start)를 추가하는 방식으로 문제를 해결해보자.

 

먼저 privileged 포트가 아닌 포트는 몇 번부터인지 설정하는 net.ipv4.ip_unprivileged_port_start 파라미터부터 확인해보면 1024로 나오는 것을 알 수 있는데, 이는 일반 계정은 1024 포트부터 사용할 수 있다는 뜻이다.

$ sysctl net.ipv4.ip_unprivileged_port_start
net.ipv4.ip_unprivileged_port_start = 1024

 

 

해당 커널 파라미터을 어떻게 설정하냐에 따라 일반 유저가 사용할 수 있는 포트의 범위가 정해지는데, 443 포트를 바인딩할 예정이므로 설정 파일(/etc/sysctl.conf)에 443으로 설정하면 된다. 참고로 해당 설정 파일은 기본적으로 root만 수정할 수 있다.

 

 

net.ipv4.ip_unprivileged_port_start 파라미터를 이전에 설정했는지 확인한 뒤에, 설정된 값이 없으면 443으로 설정한다. → 당연하지만 기존에 설정된 값이 있으면 그 값을 수정한다.

$ cat /etc/sysctl.conf | grep net.ipv4.ip_unprivileged_port_start

# 아래 커맨드는 root 권한으로 수행해야 한다
$ echo 'net.ipv4.ip_unprivileged_port_start=443' >> /etc/sysctl.conf

 

 

그리고 root 권한으로 수정된 커널 파라미터를 로드한다.

$ sysctl -p
net.ipv4.ip_unprivileged_port_start = 443

 

 

 

3. 일반 유저로 privileged 포트 사용하기

이전 단계를 통해 unprivileged 대상이 되는 포트의 시작점이 443으로 바뀐 것을 알 수 있다.

$ sysctl net.ipv4.ip_unprivileged_port_start
net.ipv4.ip_unprivileged_port_start = 443

 

 

그러므로 일반 계정이 443 포트를 사용해도 된다는 것을 확인할 수 있다!

 

 

당연하지만 설정한 커널 파라미터보다 낮은 포트는 privileged 포트가 되므로, 일반 계정으론 사용할 수 없다.

 

 

 


참고 자료 🙇‍♂️

댓글