루트가 아닌 사용자가 포트 tcp/80에서 수신 대기하는 서버를 실행하도록 허용해야 합니다.
이를 수행할 수 있는 방법이 있습니까?
답변1
setcap 'cap_net_bind_service=+ep' /path/to/program
이는 특정 프로세스에 적용됩니다. 그러나 특정 사용자가 1024 미만의 포트에 바인딩할 수 있도록 허용하려면 해당 사용자를 sudoers에 추가해야 합니다.
확인 해봐논의하다더 알아보기.
답변2
(이러한 접근 방식 중 일부는 다른 답변에서 언급되었으며 대략적인 선호도에 따라 몇 가지 가능한 옵션을 제공했습니다.)
낮은 포트를 높은 포트로 리디렉션하고 높은 포트에서 수신 대기할 수 있습니다.
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 1080
서버를 루트로 시작하고 서버가 권한 있는 포트에서 수신 대기를 시작하면 권한을 제거할 수 있습니다. 직접 코딩하는 것이 아니라 작업을 수행하는 래퍼에서 서버를 시작하는 것이 좋습니다. 서버가 연결별로 인스턴스를 시작하는 경우 다음 위치에서 시작하세요.inetd
(또는 다음과 같은 유사한 프로그램xinetd
). 의 경우 inetd
다음과 같은 줄을 사용합니다 /etc/inetd.conf
.
http stream tcp nowait username:groupname /path/to/server/executable argv[0] argv[1]…
서버가 단일 인스턴스를 수신하는 경우 다음 위치에서 시작하세요.authbind
. 빈 파일을 생성 /etc/authbind/byport/80
하고 서버를 실행하는 사용자로 실행 가능하도록 만들거나 create 를 생성합니다. /etc/authbind/byuid/1234
여기서 1234는 서버가 실행 중인 UID이며 행을 포함합니다 0.0.0.0/0:80,80
.
서버 실행 파일이 해당 기능을 지원하는 파일 시스템에 저장된 경우 다음을 지정할 수 있습니다.cap_net_bind_service
능력. 이러한 기능은 아직 비교적 새로운 기능이며아직 몇 가지 질문이 있습니다..
setcap cap_net_bind_service=ep /path/to/server/executable
답변3
서비스가 systemd에 의해 실행되는 경우,
- 서비스 구성에서 필요한 포트를 설정하세요.
- 유닛 파일을 열고(보통) 해당 섹션으로 이동하여 새 줄을 추가하고 파일을 저장합니다.
/etc/systemd/system/something.service
[Service]
AmbientCapabilities=CAP_NET_BIND_SERVICE
- 파일을 다시 로드합니다.
systemctl daemon-reload
- (다시) 서비스 시작: 또는
systemctl start something
systemctl restart something
답변4
당신이 사용할 수있는netcat 또는 xinetd또는 iptables 포트 전달을 사용하거나 Apache를 프런트 엔드 프록시로 사용하고 권한이 없는 포트에서 프로세스를 실행하세요.