Wenn ich eine Verbindung zu https://www.google.co.uk herstelle, ändert sich dies zu 216.58.198.228:443. Dann öffnet sich eine Verbindung zu mir unter [Meine IP-Adresse]: 63998.
Meine Frage ist, wie 63998 Port gewählt wird und gibt es eine Möglichkeit, ihn zu 63999 zu zwingen.
networking
port
tcp
TheGathron
quelle
quelle
Antworten:
Wie werden lokale Ports bestimmt?
Die Portnummer wird von der TCP-Implementierungssoftware aus einem Bereich von Portnummern ausgewählt, die als Ephemere Ports bezeichnet werden .
Der genaue Mechanismus zur Auswahl der Portnummer und des zu verwendenden Bereichs hängt vom Betriebssystem ab.
Gibt es eine Möglichkeit, 63999 zu erzwingen?
Dies kann durch Ändern der Konfiguration der TCP-Implementierungssoftware erfolgen.
Anweisungen zum Konfigurieren des Bereichs für kurzlebige Ports für eine Vielzahl verschiedener Betriebssysteme finden Sie unter Ändern des Bereichs für kurzlebige Ports .
Es ist jedoch keine gute Idee, den Bereich beispielsweise auf einen einzelnen Port zu beschränken
63999
.Tatsächlich ist dies unter Windows nicht möglich, da:
Die kurzlebige Port Range
Quelle Die kurzlebige Port Range
Ändern des kurzlebigen Anschlussbereichs
Linux:
Windows Vista / Windows Server 2008 und neuer:
Quelle Ändern des kurzlebigen Portbereichs
Quell-Microsoft Knowledgebase-Artikel 929851 :
Windows XP und älter:
Quelle Ändern des kurzlebigen Portbereichs
quelle
bind
Systemaufruf aufruft, bevor er aufruftconnect
. Einige Anwendungen haben die Möglichkeit, dies zu tun, andere nicht.Die Antwort von David Postill ist vollkommen richtig. Ich möchte nur hinzufügen, indem ich betone, dass das Ändern des kurzlebigen Portbereichs unter Linux so einfach ist, dass das OP eine positive Antwort hat.
Sie ändern den EPR wie folgt:
und Sie können Port 50000 (als Beispiel) mit dem folgenden Skript auswählen:
Eine Einschränkung hier: Da es einen einzelnen Port in dem Bereich gibt, könnte eine andere Anwendung ihn zwischen der Ausführung der dritten und der vierten Zeile oben von Ihnen wegreißen. Auch wenn keine Racebedingung vorliegt, werden Sie alle anderen Anwendungen lahmlegen, bis Sie einen großen EPR wiederherstellen. Aus diesem Grund habe ich den ursprünglichen Bereich so schnell wie möglich wiederhergestellt.
So , wenn das Betriebssystem OPs hatte Linux gewesen, wäre die Antwort gewesen , dass es leicht getan werden könnte.
Erstaunlicherweise ist dies nicht so einfach für BSDs, von denen einige nicht einmal eine Laufzeit-Kernel-Einstellung für den EPR haben. Für MacOS X, FreeBSD und OpenBSD muss die Datei /etc/sysctl.conf geändert werden , für den EPR stehen jedoch unterschiedliche Optionen zur Verfügung.
Unabhängig von der von oben und von der OS, die Tatsache , dass etwas kann getan werden , bedeutet nicht , es sollte getan werden: warum auf der Erde brauchen Sie das? Mir fällt kein einziger Anwendungsfall ein.
quelle
BIND_PORT
optional zu machen , so dass der Code immer noch genauso wie das Original verwendet werden kann. Ich denke, ichhtons(bind_port_env ? atoi(bind_port_env) : 0)
würde das Richtige tun.Es lohnt sich hinzuzufügen, dass der Linux-Kernel auch hat
net.ipv4.ip_local_reserved_ports
Knopf, der etwas entgegengesetzt funktioniert, aber dennoch sehr nützlich sein kann, da Sie auf diese Weise ein Loch für Dienste schlagen können, die bestimmte Ports in einem ansonsten kurzlebigen Bereich von Ports öffnen.
Kurzer Auszug aus den Dokumenten :
quelle