Alle Möglichkeiten überprüfen, ob ein Port in Linux geöffnet ist

Ihr Linux-Server läuft, und Sie möchten jetzt überprüfen, ob ein bestimmter Port geöffnet ist, damit Sie darauf remote zugreifen können. Das Überprüfen offener Ports ist eine ziemlich übliche Aufgabe für Systemadministratoren, und es gibt einige verschiedene Möglichkeiten, dies in Linux zu tun.

In diesem Artikel lernen Sie mehrere Möglichkeiten kennen, um zu überprüfen, ob ein Port in Linux geöffnet ist, damit Sie diejenigen auswählen können, die am besten für Sie funktionieren. Bereit? Lesen Sie weiter!

Voraussetzungen

In diesem Tutorial wird eine praktische Demonstration durchgeführt. Wenn Sie mitmachen möchten, stellen Sie sicher, dass Sie Folgendes haben.

  • A Linux computer. This guide uses Ubuntu 20.04, but any recent Linux distribution should work.
  • Zugriff auf ein Terminal. Wenn Sie eine grafische Desktop-Umgebung verwenden, suchen Sie nach einem Terminal-Emulator-Programm in Ihrem Anwendungsmenü. Oder wenn Sie sich über SSH bei einem Remote-Server angemeldet haben,
  • A user account with sudo privileges. For simplicity, this tutorial uses the root user.

Überprüfen Sie, ob ein Port in Linux geöffnet ist, indem Sie netstat verwenden

Die erste Methode, um zu überprüfen, ob ein Port in Linux geöffnet ist, besteht darin, den Befehl netstat auszuführen. Dieser Befehl zeigt Netzwerkverbindungen, Routing-Tabellen und viele Netzwerkschnittstellenstatistiken an.

Der Befehl netstat ist Teil des Pakets net-tools, und dieses Paket wird möglicherweise nicht standardmäßig mit Ihrer Linux-Distribution geliefert. Auf Ubuntu installieren Sie netstat, indem Sie die folgenden Befehle im Terminal ausführen.

apt update -y && apt install net-tools -y

Angenommen, Sie haben einen NGINX-Webserver im Einsatz und möchten überprüfen, ob der Port 80 geöffnet ist. Dies können Sie tun, indem Sie den folgenden Befehl ausführen. Ersetzen Sie 80 durch die Portnummer, die Sie überprüfen möchten.

Die Flags -tulpn instruieren netstat, alle hörenden Ports anzuzeigen. Der erste grep-Befehl findet und filtert die Zeile, die das Wort LISTEN im Ergebnis enthält. Der zweite grep-Befehl filtert die Ergebnisse, um nur diejenigen Elemente anzuzeigen, die :80 entsprechen.

netstat -tulpn | grep LISTEN | grep :80

Um mehr über die netstat-Flags zu erfahren, führen Sie den Befehl netstat –help aus.

Wenn der Port geöffnet ist, sehen Sie folgende Ausgabe. Wie Sie sehen können, zeigt die Ausgabe, dass Port 80 auf dem System geöffnet ist. tcp ist der Protokolltyp, und :::80 zeigt an, dass es sich um einen TCPv6-Port handelt. 0.0.0.0:80 bedeutet, dass der Port für alle IPv4-Adressen geöffnet ist. 80 ist der Standard-HTTP-Port, der den Zugriff auf die Website ermöglicht.

Checking If a Port is Open with netstat

Überprüfen, ob ein Port geöffnet ist, mit ss

Der ss-Befehl ist ein weiteres Befehlszeilen-Dienstprogramm zum Überprüfen offener Ports. Dieser Befehl zeigt Socket-Statistiken an, die Sie verwenden können, um zu bestätigen, ob ein Port geöffnet ist oder nicht. Der ss-Befehl zeigt mehr Informationen über offene Ports als andere Tools.

Wie der netstat-Befehl weist das Flag -t ss an, nur TCP-Sockets anzuzeigen, -u um nur UDP-Sockets anzuzeigen, und -l um nur hörende Sockets anzuzeigen. Das Flag -p zeigt den Prozessnamen oder die PID an, die den Port verwenden.

ss -tulpn | grep LISTEN | grep :80

Sie werden folgende Ausgabe sehen, wenn der Port geöffnet ist. Wie Sie sehen können, enthält die Ausgabe den Prozessnamen und die PID für jeden hörenden Port. In diesem Fall ist Port 80 geöffnet, und der NGINX-Webserver verwendet ihn.

Checking If a Port is Open Using ss

Überprüfen, ob ein Port mit lsof geöffnet ist

Der lsof-Befehl ist ein weiteres praktisches Werkzeug zum Überprüfen offener Ports. Der Name lsof steht für list open files, was Informationen über Dateien anzeigt, die auf dem System geöffnet sind. Diese Informationen umfassen Dateideskriptoren, Prozess-IDs, Benutzer-IDs usw.

Wie hilft Ihnen das Auflisten geöffneter Dateien dabei festzustellen, ob ein Port geöffnet ist? Sie haben wahrscheinlich bereits den Ausdruck „Alles in Linux ist eine Datei“ gehört – und dieser Ausdruck bedeutet, was er sagt.

Zum Beispiel, nehmen wir an, Sie möchten überprüfen, ob Port 22 geöffnet ist und Ihre Benutzer sich per SSH auf Ihren Server verbinden können. Führen Sie den unten stehenden Befehl aus, um geöffnete Dateien mit aktiven Verbindungen im Port 22 aufzulisten.

Der -i-Schalter weist lsof an, alle offenen Internet-Sockets anzuzeigen. Der -P-Schalter zeigt die Portnummern anstelle der Dienstnamen an. Und der -n-Schalter unterdrückt DNS- und Dienstnamensauflösungen, sodass Sie die IP-Adressen anstelle der Remote-Hostnamen sehen.

lsof -i -P -n | grep LISTEN | grep :22

Wenn der Port geöffnet ist, sehen Sie die folgende Ausgabe. Wie Sie sehen können, enthält die Ausgabe Informationen über:

  • 1027 ist die Prozess-ID des sshd-Dienstes.
  • root ist die Benutzer-ID, die den Port verwendet.
  • 3u und 4u sind die Dateideskriptoren für IPv4 und IPv6.
  • 31035 und 31037 sind die Netzwerkports für IPv4 und IPv6.
  • :22 zeigt an, dass Port 22 für alle IPv4- und IPv6-Adressen geöffnet ist.
  • (LISTEN) zeigt an, dass der Port auf eingehende Verbindungen wartet.
  • 0t0 ist der Status des Sockets, was bedeutet, dass der Socket im LISTEN-Zustand ist.
Checking If a Port is Open Using lsof

Überprüfen, ob ein Port geöffnet ist, unter Verwendung von nmap

Bisher haben Sie gesehen, wie Sie über die Befehlszeile unter Linux überprüfen können, ob ein Port geöffnet ist. Aber was ist, wenn Sie überprüfen möchten, ob ein Port auf einem Remote-Rechner geöffnet ist? In diesem Fall können Sie das nmap-Werkzeug verwenden.

Aber bevor Sie nmap ausführen, beachten Sie, dass dieses Werkzeug möglicherweise nicht Teil der Standardpakete Ihrer Linux-Distribution ist. In diesem Fall müssen Sie zuerst nmap installieren, indem Sie den folgenden Befehl ausführen.

apt install nmap -y

Führen Sie nun den folgenden Befehl aus, um zu überprüfen, ob ein Port auf einer Remote-Maschine geöffnet ist. Dieser Befehl testet, ob Port 22 auf 159.89.176.25 geöffnet ist, damit Ihr Benutzer eine SSH-Verbindung zu Ihrem Server herstellen kann. Ersetzen Sie bei Bedarf die IP-Adresse durch Ihre eigene.

nmap -p 22 159.89.176.25

Wie Sie sehen können, enthält die Ausgabe Informationen über:

  • Die Startzeit des Portscans (2022-06-30 16:58 UTC).
  • Die IP-Adresse der Remote-Maschine (159.89.176.25).
  • Den Status des Ports (geöffnet).
  • Den Dienst, der den Port verwendet (ssh).
  • Den Status des Hosts (aktiv).
Checking If a Port is Open Using nmap

Das Ergebnis bestätigt, dass Benutzer über die IP-Adresse und den Port eine SSH-Verbindung zum Computer herstellen können.

ssh [email protected] -p 22

Der folgende Screenshot zeigt eine erfolgreiche SSH-Verbindung zum Server und beweist, dass Port 22 geöffnet ist.

SSHing into your server

Überprüfung, ob ein Port von einem Shell-Skript aus geöffnet ist

Automatisierung ist immer eine gute Idee. Das Überprüfen offener Ports durch Ausführen eines Shell-Skripts ist eine ausgezeichnete Möglichkeit, mehrere Ports zu testen. Sie können beliebige frühere Methoden verwenden, um zu überprüfen, ob ein Port geöffnet ist. Für dieses Beispiel schreiben Sie jedoch ein einfaches Shell-Skript, das den Netcat nc-Befehl ausführt.

1. Erstellen Sie eine Datei mit dem Namen check_port.sh in Ihrem Home-Verzeichnis mit Ihrem bevorzugten Texteditor. In diesem Beispiel wird nano verwendet.

nano check_port.sh

2. Kopieren Sie den untenstehenden Beispielcode in Ihren Editor. Ersetzen Sie 80 durch die Portnummer, die Sie überprüfen möchten.

Die if-Bedingung überprüft, ob der 80-Port mit dem nc-Befehl geöffnet ist. Die 2>&1 und >/dev/null leiten die Fehler- und Ausgabemeldungen jeweils nach /dev/null um. Das /dev/null ist eine spezielle Datei, die alles, was sie empfängt, verwirft.

Wenn der Port geöffnet ist, gibt das Skript check_port.sh Online in die Konsole aus. Andernfalls gibt das Skript Offline aus.

if ( nc -zv localhost 80 2>&1 >/dev/null ); then
    echo 'Online'
else
    echo 'Offline'
fi

Die Skriptdatei sollte ähnlich aussehen wie der untenstehende Screenshot. Speichern Sie das Skript und beenden Sie den Editor.

Creating the Shell script

3. Führen Sie das Shell-Skript aus, um mit der Überprüfung der von Ihnen im Skript angegebenen offenen Ports zu beginnen.

bash check_port.sh

Sie sehen eine der folgenden Ausgaben, je nachdem, ob der Port geöffnet ist. In diesem Fall ist der Port geöffnet, was die Meldung Online bestätigt.

Check if the 80 port is open

Sie können dieses Shell-Skript verwenden, um zu überprüfen, ob ein Port in regelmäßigen Abständen oder als geplanter Job geöffnet ist. Die Skripting-Funktion ist besonders hilfreich, wenn Sie mehrere Server überprüfen müssen. Sie müssen nur dieses check_port.sh-Skript auf allen Servern kopieren, die Sie überprüfen möchten, und es mithilfe von CI/CD-Tools wie Jenkins oder Ansible ausführen.

Testen, ob ein Port mit PowerShell geöffnet ist

PowerShell verfügt über ein integriertes Cmdlet zum Testen von Netzwerkverbindungen namens Test-NetConnection – dieses Cmdlet ist jedoch nur auf Windows-Systemen verfügbar. Keine Sorge; Sie können PowerShell in Linux immer noch verwenden, um offene Ports und Verbindungen mithilfe der Klasse TcpClient zu überprüfen.

Wenn Ihr Linux-Computer noch kein PowerShell hat, installieren Sie es, indem Sie den Anweisungen in dieser Microsoft-Dokumentation folgen: PowerShell unter Linux installieren.

1. Starten Sie PowerShell, indem Sie den untenstehenden Befehl ausführen.

pwsh
Launching PowerShell

2. Erstellen Sie als Nächstes eine Datei namens Test-Port.ps1 mit Ihrem Texteditor. In diesem Beispiel wird nano verwendet.

nano Test-Port.ps1

3. Kopieren Sie anschließend den untenstehenden Code in Ihren Editor. Speichern Sie die Datei und beenden Sie danach den Editor.

Hinweis: Dieser Code ist ein Auszug aus dem All-in-One PowerShell-Test-Port-Test-Tool.

<#
	.SYNOPSIS
		Diese Funktion testet offene TCP/UDP-Ports.
	.DESCRIPTION
		Diese Funktion testet jeden TCP/UDP-Port, um zu sehen, ob er offen oder geschlossen ist.
	.NOTES

	.PARAMETER Computername
		Ein oder mehrere entfernte, durch Komma getrennte Computernamen
	.PARAMETER Port
		Ein oder mehrere durch Komma getrennte Portnummern, die Sie testen möchten.
	.PARAMETER TcpTimeout
		Die Anzahl der Millisekunden, die die Funktion wartet, bis sie den TCP-Port als geschlossen erklärt. Standardmäßig sind es 1000.
	.EXAMPLE
		PS> Test-Port -Computername 'LABDC','LABDC2' -Protocol TCP 80,443
		
		Dieses Beispiel testet die TCP-Netzwerkports 80 und 443 auf den Servern LABDC und LABDC2.
	#>
[CmdletBinding()]
[OutputType([System.Management.Automation.PSCustomObject])]
param (
    [Parameter(Mandatory)]
    [string[]]$ComputerName,
    [Parameter(Mandatory)]
    [int[]]$Port,
    [Parameter()]
    [int]$TcpTimeout = 1000
)
begin {
    $Protocol = 'TCP'
}
process {
    foreach ($Computer in $ComputerName) {
        foreach ($Portx in $Port) {            
            $Output = @{ 'Computername' = $Computer; 'Port' = $Portx; 'Protocol' = $Protocol; 'Result' = '' }
            Write-Verbose "$($MyInvocation.MyCommand.Name) - Beginning port test on '$Computer' on port '$Protocol<code>:$Portx'"

            $TcpClient = New-Object System.Net.Sockets.TcpClient
            $Connect = $TcpClient.BeginConnect($Computer, $Portx, $null, $null)
            $Wait = $Connect.AsyncWaitHandle.WaitOne($TcpTimeout, $false)
            if (!$Wait -or !($TcpClient.Connected)) {
                $TcpClient.Close()
                Write-Verbose "$($MyInvocation.MyCommand.Name) - '$Computer' failed port test on port '$Protocol</code>:$Portx'"
                $Output.Result = $false
            }
            else {
                $TcpClient.EndConnect($Connect)
                $TcpClient.Close()
                Write-Verbose "$($MyInvocation.MyCommand.Name) - '$Computer' passed port test on port '$Protocol<code>:$Portx'"
                $Output.Result = $true
                $TcpClient.Close()
                $TcpClient.Dispose()
            }
            [pscustomobject]$Output
        }
    }
}

4. Nachdem Sie das Skript Test-Port.ps1 gespeichert haben, führen Sie den folgenden Befehl aus, um die Ports 22, 80, 443 und 53 zu testen.

Der Parameter -ComputerName akzeptiert die Liste der Hostnamen, FQDN oder IP-Adressen der Zielmaschine(n).

Der Parameter -Port akzeptiert ein Array von einer oder mehreren Portnummern zum Testen.

./Test-Port.ps1 -ComputerName localhost -Port 22,80,443

Wie unten gezeigt, zeigt das Ergebnis, dass die Ports 22 und 80 offen sind (True), während der Port 443 nicht offen ist (False).

Checking for open ports using PowerShell scripting

Um dasselbe Skript gegen mehrere Zielendpunkte und Ports auszuführen, bearbeiten Sie den unten stehenden Code, um alle Zielcomputer im Parameter ComputerName und die Portnummern im Parameter Port hinzuzufügen.

./Test-Port.ps1 `
    -ComputerName adamtheautomator.com,localhost,8.8.8.8 `
    -Port 22,80,443,53
Checking for open ports on multiple targets using PowerShell scripting

Abschluss

In diesem Artikel haben Sie gelernt, wie Sie überprüfen können, ob ein Port in Linux geöffnet ist oder nicht. Sie haben auch gelernt, wie Sie überprüfen können, ob ein Port von einem Shell-Skript und PowerShell aus geöffnet ist. Jetzt können Sie eine dieser Methoden verwenden, um zu überprüfen, ob ein Port auf Ihrem Rechner oder einem entfernten Rechner geöffnet ist.

Aber hier sollten Sie nicht aufhören. Schauen Sie sich andere Fehlerbehebungs-Artikel an, um Ihre Fähigkeiten als Systemadministrator weiter zu verfeinern!

Source:
https://adamtheautomator.com/check-if-a-port-is-open-in-linux/