Jak mogę otworzyć port 80, aby proces inny niż root mógł się z nim połączyć?


46

Chcę uruchomić serwer WWW na komputerze Mac jako proces inny niż root. Zwykle tylko procesy root mogą łączyć się z portem 80 (lub dowolnym portem poniżej 1024).

Czy mogę otworzyć port 80 specjalnie, aby procesy inne niż root mogły nasłuchiwać?


Powiązane: link1 , link2
Nathan Farrington

bardziej jak pytanie unix.stackexchange.com , prawda?
Filip Bartuzi

1
dlaczego Unix, jeśli jest w systemie MacOS?
nhed

Odpowiedzi:


27

Jest to trudne z założenia i chyba że masz dostęp do roota na swoim komputerze, żadne z poniższych działań nie będzie działać, ponieważ wymagają rootowania do skonfigurowania zmian. Jednak po zmianie programy przestrzeni użytkownika będą miały dostęp bez rootowania.

Istnieją dwa typowe sposoby osiągnięcia tego, a wybór zależy od tego, dlaczego próbujesz obejść to ograniczenie:

Wskaż port 80 na inny port, na przykład 8080

Poprzez rekonfigurację komputera, aby przekazywał cały ruch z portu 80 do portu 8080 lub dowolnego wybranego portu, możesz zezwolić serwerom przestrzeni użytkownika na odbieranie portów uprawnień root w obszarze, do którego mają dostęp.

Proces jest prosty:

Krok 1: Wyświetl aktualne reguły zapory.

sudo ipfw show

Krok 2: Dodaj regułę przekierowania portów (od 80 do 8080)

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

Jeśli chcesz usunąć reguły zapory, uruchom:

sudo ipfw flush

( źródło )

Jest to zmiana tymczasowa i zostanie przywrócona po ponownym uruchomieniu lub spłukaniu, jak wskazano w ostatnim wierszu.

Możesz wprowadzić tę zmianę na stałe lub dodać polecenie jako linię startową przed uruchomieniem serwera, co jest prawdopodobnie bezpieczniejsze z punktu widzenia bezpieczeństwa.

Użyj Authbind

Authbind został zaprojektowany specjalnie w celu umożliwienia jednemu programowi dostępu do portów niższego poziomu bez zapewnienia pełnego dostępu do katalogu głównego.

Istnieje port OS X:

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

Nadal może być ograniczony do ruchu IPv4, jednak może być konieczne dodatkowe badanie, aby sprawdzić, czy spełnia twoje potrzeby.


LOVE MacOSX-authbind ... Pozwala uruchomić na przykład serwer WWW na porcie 80 - jako „zwykły administrator”. tj. w twoim 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 grey

13
OS X Yosemite usuwa ipfw. Ta lista opisuje użycie alternatywnego rozwiązania pf.
lizosening

Pamiętaj, że przekierowanie ruchu do nieuprzywilejowanego portu może być niepewne, jeśli korzystasz ze wspólnego środowiska; inny proces może się połączyć z tym portem, zanim zrobi to twój program lub jeśli twój program nawet chwilowo rozłączy port w celu szybkiego ponownego uruchomienia.
Lie Ryan

authbind jest naprawdę świetnym rozwiązaniem, dzięki!
favo,

7

Możesz użyć ncatdo przekazywania ruchu z serwera WWW działającego na innym porcie:

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

Spowoduje to przekierowanie ruchu na porcie 80 do localhost: 1234. Jest to jednak trochę kłopotliwe, nie użyłbym jej nigdzie poza szybkimi testami i zdecydowanie nie w produkcji.

Zauważ, że nie pozwoli to na połączenie z procesem innym niż root, ale wybierając port, z którym proces może się połączyć, 1234 w tym przykładzie będzie wyglądać, jakby był powiązany z portem 80. Robi to odpowiednik przekierowanie portu 80 na port 1234 z zaporą ogniową, ale o wiele bardziej tymczasowo.


2
To jest dobre obejście. NB. ncatpochodzi z, nmapktóry można zainstalować za pośrednictwem portów Mac z sudo port install nmap. Sam MacPorts można zainstalować z macports.org/install.php .
William Denniss,

To po prostu daje mi wiążące: adres już używane błędy.
Matt Joiner

To samo tutaj - nie działało. To załatwiło sprawę
Sebastian J.

2

Możesz także użyć ssh do przekierowania portów. Więc jeśli masz serwer działający na 8080, możesz przekierowywać ruch z portu 80. Oto skrypt, którego używam, który zatrzymuje natywny apache, jeśli jest uruchomiony i przekazuje ruch:

polecenie forward8080to80.command:

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

Przekierowywanie portów Ssh może mieć dość niską wydajność, a funkcje bezpieczeństwa nie mają większego sensu w środowisku lokalnym-> lokalnym. Lepiej używać wbudowanego przekierowania portów w osx lub czegoś takiego jak ncat.
Shayne

-3

Powinieneś być w stanie otworzyć port 80 na routerze i skierować go na lokalny adres IP twojego serwera WWW. Następnie na komputerze Mac włącz opcję Udostępnianie Internetu w panelu Preferencje systemowe> Preferencje udostępniania i wskaż wybrany katalog. W przeszłości działało to dla mnie do momentu przejścia na serwer 10.6.


1
Szukam tego jako rozwiązania dla mojej własnej maszyny deweloperskiej. Ponieważ muszę pracować w miejscach, w których nie mam kontroli nad routerem, to rozwiązanie dla mnie nie działa. Podejrzewam, że powinno to działać, jeśli konfigurujesz serwer i z jakiegoś powodu nie masz dostępu do konta root.
Avner,

Tak więc, żeby być jasnym, próbujesz skonfigurować serwer WWW w różnych witrynach klienckich, ale nie masz dostępu do otwartego portu 80? Jak otworzysz port na routerze, jeśli nie masz dostępu? Czy rozumiem poprawnie, czy jestem daleko od bazy?
Matt Love

Próbuję po prostu użyć portu 80 na moim własnym komputerze programistycznym, a nie na serwerze produkcyjnym. W każdym razie wdrażam na heroku.
Avner
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.