Binden eines Sockets an Port 80 in ansic

8

Wenn ich versuche, Port 80 an einen Socket in c zu binden, erhalte ich immer den Fehler, dass ich keine Erlaubnis habe, diesen Port zu benutzen. Gibt es einen einfachen Weg, diese Erlaubnis zu bekommen?

    
Nino 03.10.2008, 22:21
quelle

9 Antworten

17

Normalerweise kann nur der Superuser (root) an 'privilegierte' Ports (d. h. diese Portnummern unter 1024) binden.

Dies bedeutet, dass Sie entweder Ihr Programm als root ausführen müssen oder Ihre ausführbare Datei suid root machen müssen.

Beide haben Sicherheitskonsequenzen, daher sollten Sie in Erwägung ziehen, den suid-Ansatz zu verwenden und Superuser-Privilegien aufzugeben, sobald der Bind-Aufruf erfolgt ist.

    
Charles Bailey 03.10.2008, 22:25
quelle
4

Sie finden dieses Tutorial sehr hilfreich bei der Netzwerkprogrammierung mit C / C ++.

Und übrigens, ANSI C hat keine Möglichkeit, auf das Netzwerk zuzugreifen. Es sind die vom Betriebssystem bereitgestellten Bibliotheken (die BSD-Socket-API, auch portiert nach Windows als winsock ), die diese Fähigkeit bereitstellen.

    
Eli Bendersky 03.10.2008 22:28
quelle
3

Die Ports 1024 und darunter heißen privilegierte Ports . Für die Bindung an diese Ports ist eine erhöhte Berechtigung erforderlich.

Ports über 1024 heißen Emphemeral Ports . Die Bindung an diese erfordert keine besonderen Berechtigungen.

Der einfachste Weg, um Zugang zu priviligierten Ports zu erhalten, ist der Root-Benutzer.

    
paxos1977 03.10.2008 22:38
quelle
0

Wenn Sie sich auf einem gemeinsam genutzten System (wie einem Universitätscomputer) befinden und nicht root, dann gibt es keine "einfache" Möglichkeit, diese Berechtigung zu erhalten.

    
Jeff 03.10.2008 22:27
quelle
0

Es ist genau so, wie @Charles Bailey es ausdrückt ... und ich möchte hinzufügen, dass dies der Grund ist, warum man die HTTP-Serveradressen auf 8080 nach Portspezifikation in der URL als Ссылка : 8080 /

    
epatel 03.10.2008 22:30
quelle
0

Traditionell kann nur root Sockets an Ports unter 1024 binden.

    
quelle
0

S. Lotts Antwort mag sehr negative Reaktionen ausgelöst haben, aber seine Idee ist alles andere als dumm: Wenn die ursprüngliche Frage für ein echtes Programm (keine Schulaufgabe) ist, ist es oft sinnvoll, sie als Anwendung hinter einem HTTP-Server zu entwickeln Wahl. Auf diese Weise können Sie viele Details auf niedriger Ebene einem guten und gut debuggten Programm, Apache, überlassen.

Die Anwendung muss kein CGI sein, sie kann ein Apache-Modul sein. Apache, ab Version 2, ist nicht mehr nur ein HTTP-Server. Es ist jetzt eine Plattform, um Netzwerkprogramme zu entwickeln. Das Schreiben eines Apache-Moduls ist möglicherweise die richtige Antwort auf die ursprüngliche Frage (siehe Apache-Dokumentation )

    
bortzmeyer 04.10.2008 20:38
quelle
0

Normale Programme können keine "privilegierten" Ports binden - solche unter 1024. Dies ist eine meist veraltete Sicherheitsfunktion von UNIX-ähnlichen Betriebssystemen.

Die Ausführung als Superuser ist, obwohl von vielen anderen hier vorgeschlagen, eine schlechte Lösung für dieses Problem. Wenn Sie auf einem Debian- oder Ubuntu-System laufen, empfehle ich, das Paket authbind zu installieren, mit dem Sie Ihr Programm gewähren können Berechtigung zum Öffnen von privilegierten Ports, ohne dass Sie Ihrem Programm spezielle Berechtigungen erteilen müssen.

Wenn Sie auf einem anderen System laufen, empfehle ich, debian oder ubuntu zu installieren; -).

    
Glyph 16.10.2008 12:11
quelle
-3

Ja, Sie können problemlos an Port 80 binden. Verwenden Sie Apache. Schreiben Sie eine Webanwendung. Apache bindet sich an Port 80 und führt Ihre Webanwendung aus.

Versuchen Sie, den nächsten Apache zu schreiben? Wenn dies der Fall ist, müssen Sie sich in Ihrem Betriebssystem über den setuid API-Aufruf informieren.

Wenn Sie keine neue Version von Apache schreiben, verwenden die meisten Leute einen nicht-privilegierten Port. 8000 ist beliebt, ebenso wie 8080.

    
S.Lott 03.10.2008 23:22
quelle

Tags und Links