Wie kann ich unter Linux feststellen, wie viele vergängliche Ports noch verfügbar sind?

17

Gibt es eine Methode in Linux, um zu überprüfen, wie viele vergängliche Ports noch verfügbar sind? Es wird gelegentlich der Fehler "Adresse wird bereits verwendet" angezeigt, da die vergänglichen Ports aufgebraucht sind. Ein Neustart des Computers wird das Problem beheben, es ist jedoch besser, den Fehler vorher zu beheben.

JMc
quelle
Wenn Sie auf solche Fehler stoßen, würde ich vorschlagen, dass Sie entweder das System missbrauchen, indem Sie nicht die richtige Software oder Architektur für einen Job verwenden, oder Ihre Software sich schlecht verhält oder falsch konfiguriert ist. Vielleicht sind Ihre Timeouts zu lang für Ihre Anwendung, oder es bleiben Verbindungen offen, ohne sie zu verwenden?
Caleb
1
Es gibt viele gültige Anwendungen, die über die Standardeinstellungen des Betriebssystems hinaus zusätzliche temporäre Ports erfordern.
GregB

Antworten:

26

Der ephermale Portbereich wird in angegeben /proc/sys/net/ipv4/ip_local_port_range. Sie können es wahrscheinlich von 16k auf 64k erweitern.

Mit können Sie die Anzahl der offenen Verbindungen anzeigen netstat -an. Sockets können im TIME_WAIT-Status hängen bleiben, wenn Sie viele Verbindungen öffnen und schließen. An einigen Stellen ist dies unvermeidlich, aber Sie müssen möglicherweise überlegen, ob Sie in diesem Fall einen Pool von Verbindungen benötigen.

Wenn TIME_WAIT das Problem ist, können Sie net.ipv4.tcp_tw_reuse/ einstellen net.ipv4.tcp_tw_recycle, um den Verbindungsumsatz zu beschleunigen.

Sean
quelle
+1, danke, dass du dir die Zeit genommen hast, diesem Typen die genauen Details zu geben.
Caleb
Wir haben einen Bereich von 32800 bis 61000. Wir stellen nur fest, dass das Betriebssystem sie nicht mehr verwendet, wenn sie einmal verwendet wurden. Dies ist das erwartete Verhalten, aber ich würde erwarten, dass das Betriebssystem am Anfang neu startet, sobald es den letzten verfügbaren Port erreicht. Dies scheint jedoch nicht zu passieren. Zu beachten ist auch, dass dies kein sehr regelmäßiges Ereignis ist. Es ist zeitweise, aber wir haben eine große Anzahl von Servern.
JMc
Beachten Sie, dass net.ipv4.tcp_tw_recyclein Linux 4.12
Anon
1
Zur Einhaltung von RFC 6335 /proc/sys/net/ipv4/ip_local_port_range muss es sich um eine Teilmenge von 49152-65535 handeln. Eine Reduzierung des unteren Bereichsendes auf weniger als 49152 ist daher mit einem gewissen Risiko verbunden.
Kasperd
Verwenden Sie niemals net.ipv4.tcp_tw_recycle oder net.ipv4.tcp_tw_reuse, es sei denn, Sie sind verzweifelt und wissen genau, was Sie tun. Sie setzen Ihren Service potenziellen Extremen aus.
Kiwy
3

Beachten Sie, dass dieses Limit für jedes einzelne Tupel (Quell-IP, Peer-IP, Peer-Port) gilt. Daher müssen Sie die Ausgabe von netstat/ ssnach jedem dieser Tupel gruppieren und prüfen, wie nah jede Gruppe am Verbindungslimit ist.

In diesem Beitrag wird detaillierter erläutert, wie Sie diese Gruppierung durchführen können. Um zu überprüfen, wie nahe jede Gruppe in Ruby am Limit ist, können Sie die ssAusgabe wie folgt verarbeiten :

#!/usr/bin/ruby

first_port, last_port = IO.read('/proc/sys/net/ipv4/ip_local_port_range').split.map(&:to_i)
ephemeral_port_max = last_port - first_port + 1
ephemeral_port_warning = ephemeral_port_max / 3 * 2

conns = `ss --numeric --tcp state connected "( sport >= :#{first_port} and sport <= :#{last_port} )"`

groups = Hash.new(0)
conns.lines.each do |conn|
  state, recvq, sendq, local, peer = conn.split
  local_ip, local_port = local.split(':')
  group = [local_ip, peer]
  groups[group] += 1
end

groups_requiring_warning =
  groups.select { |k, v| v > ephemeral_port_warning }
  .to_a
  .sort_by { |v1, v2| v1[1] <=> v2[1] } # Sort groups in descending order of number of connections

groups_requiring_warning.each do |group, used_port_count|
  puts "Connections from #{group[0]} to #{group[1]} "\
    "have used #{used_port_count} ephemeral ports out of #{ephemeral_port_max} max"\
    "(#{((used_port_count.to_f / ephemeral_port_max) * 100).round(2)}% used)"
end
Will Sewell
quelle