Wie kann ich Port 80 öffnen, damit ein Prozess ohne Rootberechtigung daran gebunden werden kann?

46

Ich möchte einen Webserver auf meinem Mac als Nicht-Root-Prozess ausführen. Normalerweise können nur Root-Prozesse an Port 80 (oder an einen beliebigen Port unter 1024) gebunden werden.

Kann ich Port 80 gezielt öffnen, damit Nicht-Root-Prozesse darauf lauschen können?

Avner
quelle
Siehe auch : link1 , link2
Nathan Farrington
eher wie unix.stackexchange.com Frage, nicht wahr ?
Filip Bartuzi
1
Warum Unix, wenn es auf einem MacOS-System ist?
Donnerstag,

Antworten:

27

Dies ist konstruktionsbedingt schwierig. Wenn Sie keinen Root-Zugriff auf Ihren Computer haben, funktioniert keines der folgenden Verfahren, da für die Einrichtung der Änderungen Root erforderlich ist. Einmal geändert, haben Userspace-Programme jedoch Zugriff ohne root.

Um dies zu erreichen, gibt es zwei gängige Methoden. Welche Sie auswählen, hängt davon ab, warum Sie versuchen, die Einschränkung zu umgehen:

Zeigen Sie mit Port 80 auf einen anderen Port, z. B. 8080

Indem Sie Ihren Computer so konfigurieren, dass er den gesamten Datenverkehr von Port 80 an Port 8080 oder einen beliebigen Port Ihrer Wahl weiterleitet, können Sie den Benutzerbereichsservern erlauben, Root-Berechtigungsports in dem Bereich zu erhalten, auf den sie Zugriff haben.

Der Vorgang ist unkompliziert:

Schritt 1: Aktuelle Firewall-Regeln anzeigen.

sudo ipfw show

Schritt 2: Hinzufügen einer Portweiterleitungsregel (80 bis 8080)

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

Wenn Sie Ihre Firewall-Regeln entfernen möchten, führen Sie Folgendes aus:

sudo ipfw flush

( Quelle )

Dies ist eine vorübergehende Änderung und wird zurückgesetzt, sobald Sie neu starten oder wie in der letzten Zeile angegeben leeren.

Sie können die Änderung permanent machen oder den Befehl als Startzeile vor dem Starten des Servers hinzufügen, was aus Sicherheitsgründen wahrscheinlich sicherer ist.

Verwenden Sie Authbind

Authbind wurde speziell entwickelt, um einem Programm den Zugriff auf Ports niedrigerer Ebene zu ermöglichen, ohne ihm vollständigen Root-Zugriff zu gewähren.

Es gibt einen OS X-Port:

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

Möglicherweise ist es immer noch auf IPv4-Datenverkehr beschränkt. Möglicherweise müssen Sie jedoch zusätzliche Untersuchungen durchführen, um festzustellen, ob der Datenverkehr Ihren Anforderungen entspricht.

Adam Davis
quelle
LIEBE MacOSX-authbind ... Hiermit können Sie beispielsweise einen Webserver auf Port 80 ausführen - als "regulärer Administrator". dh in deinem 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 wird entfernt ipfw. Diese Übersicht beschreibt eine alternative Lösung mit pf.
Lyschoening
Beachten Sie, dass das Umleiten von Datenverkehr an einen nicht privilegierten Port unsicher sein kann, wenn Sie sich in einer gemeinsam genutzten Umgebung befinden. Ein anderer Prozess kann sich an diesen Port binden, bevor Ihr Programm dies tut, oder wenn Ihr Programm den Port für einen schnellen Neustart für einen Moment aufhebt.
Lie Ryan
authbind ist wirklich eine tolle lösung, danke!
Favoriten
7

Sie können ncatDatenverkehr von einem Webserver weiterleiten, der an einem anderen Port ausgeführt wird:

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

Dadurch wird der Datenverkehr auf Port 80 an localhost: 1234 weitergeleitet. Dies ist ein bisschen verwunderlich, aber ich würde es nirgendwo anders als beim schnellen Testen und definitiv nicht in der Produktion verwenden.

Beachten Sie, dass dies nicht zulässt, dass ein Nicht-Root-Prozess daran gebunden wird. Wenn Sie jedoch einen Port auswählen, an den der Prozess gebunden werden kann (in diesem Beispiel 1234), sieht es so aus, als wäre er an Port 80 gebunden Weiterleiten von Port 80 an Port 1234 mit einer Firewall, jedoch auf einer viel temporäreren Basis.

Mathew Hall
quelle
2
Dies ist eine gute Lösung. NB. ncatkommt mit nmapdem über Mac Ports mit installiert werden kann sudo port install nmap. MacPorts selbst kann über macports.org/install.php installiert werden .
William Denniss
Dies gibt mir nur binden: Adresse bereits in Gebrauch Fehler.
Matt Joiner
Gleiche hier - hat nicht funktioniert. Das hat den Trick gemacht: unix.stackexchange.com/a/187038
Sebastian J.
2

Sie können ssh auch für die Portweiterleitung verwenden. Wenn auf einem Server 8080 ausgeführt wird, können Sie den Datenverkehr von Port 80 weiterleiten. Ich verwende hier ein Skript, das den nativen Apache anhält, wenn dieser ausgeführt wird, und den Datenverkehr weiterleitet:

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 [email protected] -L 80:127.0.0.1:8080
bdombro
quelle
Die Weiterleitung von SSH-Ports kann eine recht geringe Leistung aufweisen, und die Sicherheitsfunktionen sind in einer lokalen Umgebung wenig sinnvoll. Verwenden Sie besser die in osx integrierte Portweiterleitung oder so etwas wie ncat.
Shayne
-3

Sie sollten in der Lage sein, Port 80 auf Ihrem Router zu öffnen und auf die lokale IP-Adresse Ihres Webservers zu verweisen. Aktivieren Sie dann auf Ihrem Mac die Webfreigabe in den Systemeinstellungen> Freigabeeinstellungen und zeigen Sie auf das Verzeichnis Ihrer Wahl. Dies hat bei mir in der Vergangenheit bis zur Umstellung auf 10.6 Server geklappt.

Matt Love
quelle
1
Ich suche dies als Lösung für meine eigene Entwicklungsmaschine. Da ich an Orten arbeiten muss, an denen ich keine Kontrolle über den Router habe, funktioniert diese Lösung bei mir nicht. Ich vermute, es sollte funktionieren, wenn Sie einen Server einrichten und aus irgendeinem Grund keinen Root-Zugriff haben.
Avner
Sie möchten also einen Webserver auf verschiedenen Client-Standorten einrichten, haben aber keinen Zugriff auf den offenen Port 80? Wie wird der Port auf dem Router geöffnet, wenn Sie keinen Zugriff haben? Verstehe ich richtig oder bin ich weit weg von der Basis?
Matt Love
Ich versuche nur, Port 80 auf meinem eigenen Entwicklungscomputer zu verwenden, nicht auf einem Produktionsserver. Ich setze sowieso auf Heroku ein.
Avner