루트가 아닌 프로세스가 포트 80을 바인딩 할 수 있도록 포트 80을 어떻게 열 수 있습니까?


46

Mac에서 루트가 아닌 프로세스로 웹 서버를 실행하고 싶습니다. 일반적으로 루트 프로세스 만 포트 80 (또는 1024 미만의 포트)에 바인딩 할 수 있습니다.

루트가 아닌 프로세스가 포트를 청취 할 수 있도록 포트 80을 구체적으로 열 수 있습니까?



더 많은 unix.stackexchange.com 질문이 아닌가요?
Filip Bartuzi

1
왜 macOS 시스템에 있다면 유닉스입니까?
nhed

답변:


27

이것은 의도적으로 수행하기 어렵고 컴퓨터에 대한 루트 액세스 권한이 없으면 변경을 설정하기 위해 루트가 필요하므로 다음 중 어느 것도 작동하지 않습니다. 그러나 일단 변경되면, 사용자 공간 프로그램은 루트없이 액세스 할 수 있습니다.

이 작업을 수행하는 일반적인 두 가지 방법이 있으며 제한을 해결하려는 이유에 따라 선택할 수 있습니다.

포트 80을 다른 포트 (예 : 8080)를 가리 킵니다.

모든 포트 80 트래픽을 포트 8080 또는 선택한 포트로 전달하도록 시스템을 재구성하면 사용자 공간 서버가 액세스 권한이있는 영역에서 루트 권한 포트를 수신 할 수 있습니다.

과정은 간단합니다 :

1 단계 : 현재 방화벽 규칙을 봅니다.

sudo ipfw show

2 단계 : 포트 전달 규칙 추가 (80 ~ 8080)

sudo ipfw add 100 fwd 127.0.0.1,8080 tcp from any to any 80 in

방화벽 규칙을 제거하려면 다음을 실행하십시오.

sudo ipfw 플러시

( 소스 )

이는 일시적인 변경 사항이며 재부팅 한 후 되돌 리거나 마지막 줄에 표시된대로 플러시됩니다.

당신은 할 수 변경을 영구적으로 , 또는 당신은 보안의 관점에서 아마도 안전 서버를 시작하기 전에 시작 라인으로 명령을 추가 할 수 있습니다.

인증 사용

Authbind는 전체 루트 액세스 권한을 부여하지 않고 하나의 프로그램이 하위 포트에 액세스 할 수 있도록 특별히 설계되었습니다.

OS X 포트가 있습니다 :

https://github.com/Castaglia/MacOSX-authbind

여전히 IPv4 트래픽으로 제한 될 수 있지만 필요에 맞는지 추가 조사를 수행해야 할 수도 있습니다.


MacOSX 인증 사랑 ... 예를 들어 포트 80의 웹 서버를 "일반 관리자"로 실행할 수 있습니다. 즉 당신의 launchd .plist...` "ProgramArguments": [ "path/to/authbind", "/usr/bin/php", "-c", "/www/.router.ini", "-S", "0.0.0.0:80", "-t", "/www", "/www/.router.php"]Woohoo!
alex gray

13
OS X Yosemite가 제거합니다 ipfw. 이 요지는를 사용하는 대체 솔루션을 설명합니다 pf.
lyschoening

공유 환경에있는 경우 트래픽을 권한이없는 포트로 리디렉션하는 것은 안전하지 않을 수 있습니다. 다른 프로세스는 프로그램이 실행되기 전에 또는 포트가 빠른 재시작을 위해 순간적으로 포트를 바인딩 해제하기 전에 해당 포트에 바인딩 될 수 있습니다.
Lie Ryan

authbind는 정말 훌륭한 솔루션이 아닙니다. 감사합니다!
favo December

7

ncat다른 포트에서 실행되는 웹 서버에서 트래픽을 전달 하는 데 사용할 수 있습니다 .

sudo ncat -l -p 80 -c ' ncat -l -p 1234'

포트 80의 트래픽이 localhost : 1234로 전달됩니다. 그러나 이것은 약간의 문제이지만, 빠른 테스트 이외의 곳에서는 사용하지 않을 것이며 확실히 프로덕션에서는 사용하지 않을 것입니다.

루트가 아닌 프로세스가 바인딩 할 수는 없지만 프로세스가 바인딩 할 수있는 포트 (이 예에서는 1234)를 선택하면 포트 80에 바인딩 된 것처럼 보입니다. 방화벽을 사용하여 포트 80을 포트 1234로 전달하지만 훨씬 더 일시적입니다.


2
이것은 좋은 해결 방법입니다. NB. ncat와 함께 제공 nmap되는 Mac 포트를 통해 설치할 수 있습니다 sudo port install nmap. MacPorts 자체는 macports.org/install.php 에서 설치할 수 있습니다 .
William Denniss

이것은 단지 bind : address 이미 사용중인 오류를 제공합니다.
매트 결합 자

여기 동일-작동하지 않았습니다. 이 트릭을 수행했습니다 : unix.stackexchange.com/a/187038
Sebastian J.

2

ssh를 사용하여 포트 전달을 수행 할 수도 있습니다. 따라서 8080에서 서버를 실행중인 경우 포트 80에서 트래픽을 전달할 수 있습니다. 다음은 내가 사용하는 스크립트입니다. 실행중인 경우 기본 아파치를 중지하고 트래픽을 전달합니다.

forward8080to80. 명령 :

echo "You may close this terminal and the forwarding will continue."
echo "To stop, kill the ssh process found by `sudo lsof -i ':80' | grep LISTEN`"
sudo apachectl stop
sudo ssh user@127.0.0.1 -L 80:127.0.0.1:8080

SSH 포트 전달은 성능이 매우 낮을 수 있으며 보안 기능은 로컬-> 로컬 환경에서 의미가 없습니다. osx의 내장 포트 포워딩 또는 ncat과 같은 것을 사용하는 것이 좋습니다.
Shayne

-3

라우터에서 포트 80을 열고 웹 서버의 로컬 IP 주소를 가리켜 야합니다. 그런 다음 Mac의 시스템 환경 설정> 공유 환경 설정 패널에서 웹 공유를 활성화하고 원하는 디렉토리를 가리 킵니다. 이것은 10.6 서버로 전환 될 때까지 과거에는 효과가있었습니다.


1
나는 이것을 내 dev 시스템의 솔루션으로 찾고 있습니다. 라우터를 제어 할 수없는 곳에서 일해야하기 때문에이 솔루션은 효과가 없었습니다. 서버를 설정하고 어떤 이유로 루트 액세스 권한이 없으면 작동해야한다고 생각합니다.
Avner

분명히, 다른 클라이언트 사이트에 웹 서버를 설정하려고하는데 포트 80에 액세스 할 수 없습니까? 액세스 권한이없는 경우 라우터에서 포트를 어떻게 열 수 있습니까? 올바르게 이해하고 있습니까?
매트 사랑

프로덕션 서버가 아닌 자체 개발 컴퓨터에서 포트 80을 사용하려고합니다. 어쨌든 heroku에 배포합니다.
Avner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.