Erschöpfung des Linux-Netzwerkports

10

Ich habe so viel wie möglich darüber recherchiert, ohne direkt in der Kernelquelle zu graben. Es scheint eine große Menge an Desinformation / falschen Informationen zu diesem Thema zu geben, daher hoffe ich, dass dies die Frage für mich und andere ein für alle Mal beantwortet.

Streng genommen ist eine IPv4-Erschöpfung tatsächlich möglich? Lassen Sie mich erklären:

  • Anscheinend stehen 65535 Ports zur Verfügung. 0 ist nicht verfügbar.
  • Ich habe gelesen, dass für die Port-Erschöpfung das Tupel (src ip, src port, dst ip, dst port) eindeutig sein muss.
  • Um klar zu sein und davon auszugehen, dass ich 100% der kurzlebigen Ports über die Einstellung sysctl net.ipv4.ip_local_port_range verwenden kann

Und das ist die Frage: Funktioniert das so?

  • Ich könnte 65k Verbindungen von 127.0.0.1:(x) bis 127.0.0.1:80 haben
  • Ich könnte 65k Verbindungen von 127.0.0.1:(x) bis 127.0.0.1:555 haben
  • Grundsätzlich ist die Frage (srcip, srcport, dstip, dstport) noch einmal eindeutig, richtig?
  • Ich konnte nicht mehr als 65.000 Verbindungen von IP "A" zu IP "B", Port "N" öffnen.
  • Ebenso konnte eine einzelne IP unter xxxx: 80 nicht mehr als 65.000 Verbindungen zu meinem Webserver öffnen. Ich konnte jedoch insgesamt viel mehr als 65.000 unterstützen, solange sie von verschiedenen Quell-IPs stammen .

Schließlich bin ich ein wenig verwirrt über (ausgehende) kurzlebige Ports und eingehende Ports, die abhören. Sobald die Verbindung hergestellt ist, ist mir klar, dass jede Seite der Verbindung gleichrangig und gleich ist, aber bevor dies geschieht:

Wenn zum Beispiel das Tupel (srcip, srcport, dstip, dstport) eindeutig sein muss, warum ist es dann so, wenn ich es aktiviere?

net.ipv4.ip_local_port_range = 1024 65535

Dies ermöglicht die Verwendung von kurzlebigen Ports von 1024-65535. Wenn ich Dienste habe, die an Port 3306 gebunden sind (z. B. mySQL), können diese manchmal nicht gestartet werden, da der Port verwendet wird.

Bezieht sich dies auf die Tatsache, dass: (Und dies ist eine Aussage, die ich um Bestätigung bitte):

  • (srcip, srcport, dstip, dstport) müssen für jede Verbindung mit dem Portbereich von 1-65535 eindeutig sein (ohne Berücksichtigung der Verwendung kurzlebiger Ports durch das Betriebssystem).
  • Damit ein Socket gebunden werden kann, kann er als (srcip, srcport, *, *) angesehen werden. Oder anders ausgedrückt: Darf die IP diesen Port aus keinem Grund zum Binden verwenden?

Ich kann das obige Verhalten überprüfen, dh ich verwende die exakte sysctl-Zeile oben, und aus diesem Grund habe ich mySQL auf einen Port unter 1024 verschoben, da es gelegentlich und sehr zufällig nicht neu gestartet werden konnte, da angenommen wurde, dass das Betriebssystem diesen Port verwendet (3306). für einen kurzlebigen Hafen.

AB Carroll
quelle
Ich habe meine Antwort mit weiteren Informationen aktualisiert. Fühlen Sie sich frei, mit jeder Frage zu antworten.
89c3b1b8-b1ae-11e6-b842-48d705

Antworten:

8

Sie haben hier zwei Hauptfragen:

1.

Streng genommen ist eine IPv4-Erschöpfung tatsächlich möglich?

Ja. Nehmen Sie zum Beispiel einen Load Balancing-Router, der alle Verbindungen an eine NAT-IP-Adresse sendet. Dies ist wahrscheinlich der Fall, wenn Sie viele SRC IPVerbindungen zum Engpass eines einzelnen haben DST IP.

Dies bedeutet, dass Ihr Webserver eine Reihe von Verbindungen haben kann wie:

root@buglab:~# netstat -pnt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 173.200.1.18:80      10.100.1.100:49923        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.200.1.200:10155        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.10.1.10:14400        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.10.1.10:50652        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.20.1.20:57554        ESTABLISHED 13939/nginx: worker 

und das ist vollkommen in Ordnung. Wenn jedoch alle 'Fremdadressen' gleich sind, kann dies zu einem Problem führen (z. B. 'Großer Router, der NAT <---> Server mit einer IP-Adresse ausführt').

Wenn ich postulieren müsste, warum die kurzlebige Erschöpfung von Ports kein häufiges Problem ist, würde ich vorschlagen, dass jeder Port einen Überwachungsdienst und genügend Ressourcen benötigt, um zu antworten - eine andere Ressource (Speicher, CPU) ist normalerweise zuerst ein Engpass.

Ich persönlich bin jedoch bei der Arbeit in einem Lastausgleichsunternehmen auf einige Probleme mit der Erschöpfung des Hafens gestoßen.

2. Warum kann ein verwendeter Port ein Problem für einen Abhördienst darstellen?

"Dies ermöglicht die Verwendung von kurzlebigen Ports von 1024-65535. Wenn ich Dienste habe, die an Port 3306 (z. B. mySQL) gebunden sind, können diese manchmal nicht gestartet werden, da der Port verwendet wird."

Der mySQL-Server kann nicht an diesen Port gebunden werden, wenn er verwendet wird - beispielsweise von localhost: 3306 oder auf allen Schnittstellen. Siehe zum Beispiel die Zeile 0.0.0.0:80 in der folgenden netstatAusgabe?

root@buglab:~# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      PID/Program name
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      964/php-fpm.conf)
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      1660/mysqld     
tcp        0      0 0.0.0.0:842             0.0.0.0:*               LISTEN      1317/inetd      
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      13938/nginx     

Dies bedeutet, dass Port 80 über alle Schnittstellen lokal auf dem Server lauscht . Wenn ein anderer Prozess Port 80 hält, bevor mein nginxServer gestartet nginxwird, kann er die Kontrolle über diesen Port nicht übernehmen und schlägt wahrscheinlich beim Start fehl.

Normalerweise ist Port 3306 in Ordnung, da Überwachungsdienste vordefinierte Ports (oder Bereiche) haben, die vom Host-Computer angefordert werden - z. B. Port 80 und 443 für Webserver.

89c3b1b8-b1ae-11e6-b842-48d705
quelle
0

Ich könnte 65k Verbindungen von 127.0.0.1:(x) bis 127.0.0.1:80 haben. Ich könnte 65k Verbindungen von 127.0.0.1:(x) bis 127.0.0.1:555 haben

a: Ja, wenn Ihr lokaler Port 1-65535 ist, beträgt die Anzahl der Verbindungen 65k-1 (ein Port ist Listen).

Grundsätzlich ist die Frage (srcip, srcport, dstip, dstport) noch einmal eindeutig, richtig? a: ja

Ich konnte nicht mehr als 65.000 Verbindungen von IP "A" zu IP "B", Port "N" öffnen. Ebenso konnte eine einzelne IP nicht mehr als 65.000 Verbindungen zu meinem Webserver unter xxxx: 80 öffnen, ich konnte jedoch viel mehr unterstützen als 65k insgesamt, solange sie von verschiedenen Quell-IPs stammen?

a: Eine einzelne IP konnte unter xxxx: 80 nicht mehr als 65.000 Verbindungen zu meinem Webserver öffnen, da srcip, srcport, dstip, dstport eindeutig sind. Ja, Sie könnten viel mehr als 65k unterstützen, wenn Soruce IP anders ist

wow qing
quelle