Linux,Unix,BSD

[linux] 일반 계정으로 80 포트로 웹 서비스하는 방법들

채윤아빠 2022. 6. 24. 13:23
728x90
반응형

개요

파이썬 Flask를 이용하여 웹 서비스를 개발하였고, 기본적으로 일반 사용자 계정에서 5000번 포트로 정상적으로 잘 운영이 되었습니다.
하지만, 실제 고객에게 전달하려다 보니, 일반 http 포트가 아닌 5000번 포트로 서비스를 운영하다 보니, URL 마지막에 ":5000/"을 붙여야 하는 불편함이 생길 수밖에 없었습니다.

이런 불편을 해소하기 위하여 일반 사용자 계정으로 80포트로 웹 서비스를 구동하는 방법들을 정리해 두고, 실제 적용한 방법을 살펴 보겠습니다.


일반 계정으로 80 포트로 웹 서비스 운영하는 방법들

대부분의 방법들이 바로 적용이 어렵고, 특정한 패키지를 설치해야만 적용이 가능합니다.

iptables

80 포트를 사용하지 않고 있다면 가장 간단한 방법이 아닐까 싶습니다.

dnat 설정을 하여 80 포트로 들어오는 모든 트래픽을 PREROUTING 처리하여 해당 포트로 모두 전달하는 방법입니다.
이런 것은 웹 서비스가 단 1개만 운영될때만 가능한 방법입니다.

authbind

"authbind" 패키지를 설치하고, 80 포트에 대한 설정한 후, 웹 서비스를 구동하면 됩니다.

sudo apt install authbind

# Configure access to port 80
sudo touch /etc/authbind/byport/80
sudo chmod 777 /etc/authbind/byport/80
And to run the app:

# The deep argument enables port binding permissions for the program being executed, as well as any other child programs spawned from it
authbind --deep python3 app.py


libcap2-bin

"libcap2-bin" 패키지를 설치하여 진행하는 방법은 다음과 같습니다.

sudo apt-get install libcap2-bin 
sudo setcap 'cap_net_bind_service=+ep' /usr/bin/python3

위와 같이 "python3" 명령 자체에 줄 수도 있는데, 이런 경우에는 특정 포트가 아닌 특정 프로그램("python3")에 모든 포트들에 대한 권한을 부여하는 방식이라 조금은 위험할 수 있습니다.

reverse proxy

nginx, haproxy, apache 등을 이용한 reverse proxy를 적용하는 방법이 있습니다.

앞서 iptables와 유사하게 80 포트로 들어오는 트래픽을 조건에 맞게 뒷단에서 서비스 중인 다른 웹 서비스로 전달하는 방식입니다.
iptables에서는 하나의 웹 서비스(포트)로 전달이 가능하나, reverse proxy의 경우 조금 더 유연성이 있어서 여러 웹 서비스를 운영 지원할 수 있습니다.


실제 적용한 방법 - iptables

개발 환경에 iptables, netfilter-persistent 패키지가 기본으로 설치되어 있어서, iptables로 다음과 같이 간단하게 dnat 설정을 통하여 웹 서비스를 80로 접속이 가능하도록 설정하였습니다.

pi@raspberrypi:~ $ sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 5000
pi@raspberrypi:~ $ sudo netfilter-persistent save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables save

결론

웹 서비스를 단독으로 1개만 운영할 경우에는 iptables를 이용하는 방법이 가장 깔끔할 것 같습니다.
이미 운영 중인 웹 서비스가 있는 경우이거나, 두 개 이상의 웹 서비스를 동시에 운영해야할 경우라면 "reverse proxy"가 답입니다. ^^


참고자료