권한이없는 사용자는 권한이있는 포트 (1024 미만의 포트 번호)에 바인딩 할 수없는 표준 동작입니다. 따라서 포트 80에 바인드하려는 응용 프로그램은이 포트에 바인드하기 위해 특권 (일반적으로 루트로 실행 됨)을 실행해야합니다.
일반적인 접근 방식은 권한있는 사용자로 작은 "청취자"프로세스를 실행하여 연결을 수락 한 다음 권한이없는 프로세스를 생성하여 요청을 처리하는 것입니다. 요청 처리에 대한 권한 삭제는 보안상의 이유로 수행됩니다. 누군가 요청을 처리하는 프로세스를 이용할 수있는 경우 일반적으로 침입자는 처리 프로세스와 동일한 권한을 사용하여 명령을 실행할 수 있습니다. 따라서 권한있는 프로세스를 사용하여 전체 요청을 처리하는 것은 좋지 않습니다.
그러나 오늘날 많은 응용 프로그램에서 루트가 아닌 것으로 실행되는 것이 일반적입니다. 그러나 이러한 프로세스는 물론 표준 구성에서 권한있는 포트에 바인딩 할 수 없습니다. 따라서 Tomcat 또는 JBoss와 같은 서버는 8080과 같은 하이 포트에 바인딩하는 데 사용 되었기 때문에 권한이있는 리스너가 필요하지 않습니다.
물론 이러한 프로세스를 인터넷에 노출하면 HTTP 프로토콜을 사용할 때 각 브라우저가 먼저 포트 80에 연결하려고 시도하므로 포트 80에 대한 액세스를 제공 할 수 있습니다. 이를 제공하는 일반적인 해결 방법은 응용 프로그램과 공용 인터넷 사이에 방화벽 또는 포트 변환기를 사용하는 것입니다. 따라서 요청은 포트 80을 요청하는 방화벽에 도달하지만 방화벽은 요청을 포트 8080의 일부 내부 호스트로 전달합니다. 이렇게하면 실제 웹 서버가 포트 80에서 공개적으로 사용 가능한 상태에서 높은 포트에서 작동 할 수 있습니다.
- (internet request) ----> (port 80)[Firewall] ------> (port 8080)[Webserver]
때때로이 리디렉션은 단순히 iptables
NAT 규칙을 사용하여 수행됩니다 .
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
이렇게하면 포트 8080에서 수신 대기중인 권한이없는 응용 프로그램을 실행할 수 있으며 포트 80에 대한 모든 수신 요청은 포트 8080으로 리디렉션됩니다.
그러나 최신 Linux 커널을 사용하면 또 다른 가능성이 있습니다. 기능 사용.
setcap CAP_NET_BIND_SERVICE=+ep /some/webserver/binary
이렇게하면 binary
루트가 아닌 사용자로 시작한 경우에도 권한있는 포트에 바인딩 할 수 있습니다. 자세한 내용 man capabilities
은 참조하십시오.