Wie kann ich überprüfen, welche Ports auf meinem Linux-Computer belegt und welche frei sind?

30

Gibt es einen Befehlszeilenbefehl oder eine andere Möglichkeit, um die belegten und freien Portnummern auf meinem Linux-Computer zu ermitteln und aufzulisten?

Jeegar Patel
quelle

Antworten:

41

Der Befehl

netstat -antu

Zeigt alle verwendeten TCP- und UDP-Ports an. Die Ausgabe sieht ungefähr so ​​aus:

Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:59753           0.0.0.0:*               LISTEN

Die Nummer nach dem Doppelpunkt im Feld Lokale Adresse zeigt den verwendeten Port an. Wenn der Status "LISTEN" ist, bedeutet dies, dass ein Port für eingehende Verbindungen verwendet wird. Wenn die IP-Adresse in diesem Local AddressFeld angegeben ist 0.0.0.0, bedeutet dies, dass eingehende Verbindungen auf jeder IP-Adresse akzeptiert werden, die einer Schnittstelle zugewiesen ist.

Wenn gesagt localhostoder 127.0.0.1wäre es nur , um Verbindungen von Ihrem Computer zu akzeptieren.

Wenn Sie den -pParameter hinzufügen und als root ausführen, wird außerdem der Prozess angezeigt, der den Port geöffnet hat:

$ sudo netstat -antup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:59753           0.0.0.0:*               LISTEN      860/rpc.statd

Alles, was nicht als verwendet angezeigt wird, ist kostenlos. Benutzer (nicht privilegierte Konten) können jedoch nur Ports über 1023 öffnen.

Paul
quelle
Dies bedeutet, dass eingehende Verbindungen auf jeder einer Schnittstelle zugewiesenen IP-Adresse akzeptiert werden. Wenn also Verbindungen von außerhalb Ihres Computers hergestellt werden, haben Sie hier keinen Fehler gemacht? Sie haben wahrscheinlich gemeint, dass Verbindungen akzeptiert werden, wenn sie an einer Adresse eingehen, die einer bestimmten Schnittstelle zugewiesen ist, unabhängig von ihrer Herkunft. Die Herkunft der eingehenden Verbindungen wird wahrscheinlich in der nächsten Spalte Fremdadresse angegeben. Wenn man also 0.0.0.0 als Wert hat, bedeutet dies, dass die Verbindungen von überall akzeptiert werden, auch von außerhalb der Maschine
user907860 05.10.17
1
@ user907860 Es ist möglicherweise nicht klar, aber ich unterscheide zwischen 0.0.0.0 und 127.0.0.1. Letztere akzeptieren nur Verbindungen von Ihrem Computer, da sie eine nicht weitergeleitete IP-Adresse abhören. Wenn 0.0.0.0 eine Adresse auf Ihrem Computer bedeutet und diese weitergeleitet wird, können Verbindungen von anderen Computern hergestellt werden.
Paul
Nur -antuzu -tunaIhrer
Information
13

Ich habe selbst eine kleine Liste zusammengestellt .

Einige meiner Favoriten sind:

netstat -tulpn
lsof -i -n -P
Robin
quelle
7

Eine gute und zuverlässige Möglichkeit, nach geöffneten Ports zu suchen, ist die Verwendung ss(Ersatz für die veralteten netstat ). Sie kann in einem Skript verwendet werden, ohne dass erhöhte Berechtigungen erforderlich sind (z. B. sudo).

Verwendung: Option zum Überwachen von -lPorts, Option -nzum Umgehen der DNS-Auflösung und Filter für Quellport NN: src :NN( NNdurch den zu überwachenden Port ersetzen ). Weitere Optionen finden Sie unterman ss

ss -ln src :NN

Beispiele:

[user@server ~]# ss -ln src :80
State       Recv-Q Send-Q       Local Address:Port   Peer Address:Port
LISTEN      0      128                      *:80                *:*
[user@server ~]# ss -ln src :81
State       Recv-Q Send-Q       Local Address:Port   Peer Address:Port

Und in einem Skript können wir mit grep testen, ob die Ausgabe den von uns angeforderten Port enthält. Beispiel mit verwendetem Port 80 (siehe oben):

myport=80
# count the number of occurrences of port $myport in output: 1= in use; 0 = not in use
result=$(ss -ln src :$myport | grep -Ec -e "\<$myport\>")
if [ "$result" -eq 1 ]; then
  echo "Port $myport is in use (result == $result) "
else
  echo "Port $myport is NOT in use (result == $result) "
fi

# output:
Port 80 is in use (result == 1)

Beispiel mit nicht belegtem Port 81 (so)

myport=81
result=$(ss -ln src :$myport | grep -Ec -e "\<$myport\>")
if [ "$result" -eq 1 ]; then
  echo "Port $myport is in use (result == $result) "
else
  echo "Port $myport is NOT in use (result == $result) "
fi

# output:
Port 81 is NOT in use (result == 0)
Thomas
quelle