Ihr Linux-Server läuft, und Sie möchten jetzt überprüfen, ob ein bestimmter Port geöffnet ist, damit Sie remote darauf zugreifen können. Das Überprüfen auf offene Ports ist eine ziemlich häufige Aufgabe für Systemadministratoren, und es gibt einige verschiedene Möglichkeiten, dies unter Linux zu tun.
In diesem Artikel lernen Sie verschiedene Möglichkeiten kennen, um zu überprüfen, ob ein Port in Linux geöffnet ist, damit Sie auswählen können, welche für Sie am besten funktionieren. Bereit? Lesen Sie weiter!
Voraussetzungen
Dieses Tutorial wird eine praktische Demonstration sein. Wenn Sie mitmachen möchten, stellen Sie sicher, dass Sie Folgendes haben.
- Ein Linux-Computer. Diese Anleitung verwendet Ubuntu 20.04, aber jede neuere Linux-Distribution sollte funktionieren.
- Zugang zu einem Terminal. Wenn Sie eine grafische Desktop-Umgebung verwenden, suchen Sie in Ihrem Anwendungsmenü nach einem Terminal-Emulator-Programm. Oder, wenn Sie sich über SSH bei einem Remote-Server angemeldet haben,
- Ein Benutzerkonto mit
sudo
Privilegien. Der Einfachheit halber verwendet dieses Tutorial den Root-Benutzer.
Überprüfen Sie mit netstat, ob ein Port in Linux geöffnet ist
Die erste Methode, um zu überprüfen, ob ein Port unter Linux geöffnet ist, besteht darin, netstat
auszuführen Befehl. Dieser Befehl zeigt Netzwerkverbindungen, Routing-Tabellen und viele Statistiken zu Netzwerkschnittstellen an.
Die netstat
Befehl ist Teil des net-tools
Paket, und dieses Paket ist möglicherweise nicht standardmäßig in Ihrer Linux-Distribution enthalten. Installieren Sie unter Ubuntu netstat
indem Sie die folgenden Befehle im Terminal ausführen.
apt update -y && apt install net-tools -y
Angenommen, Sie haben einen NGINX-Webserver ausgeführt und möchten überprüfen, ob Port 80
ist offen. Sie können dies tun, indem Sie den folgenden Befehl ausführen. Ersetzen Sie 80
mit der Portnummer, die Sie überprüfen möchten.
Die -tulpn
Flags weisen netstat
an um alle Listening Ports anzuzeigen. Die erste grep
Der Befehl findet und filtert die Zeile, die das Wort LISTEN
enthält im Ergebnis. Die zweite grep
Der Befehl filtert die Ergebnisse so, dass nur die Elemente angezeigt werden, die mit :80
übereinstimmen .
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 die 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
gibt an, dass es sich um ein TCPv6 handelt Hafen. 0.0.0.0:80
bedeutet, dass der Port für alle IPv4-Adressen offen ist. 80
ist der Standard-HTTP-Port für den Zugriff auf die Website.
Mit ss prüfen, ob ein Port offen ist
Die ss
command ist ein weiteres Befehlszeilendienstprogramm zum Überprüfen offener Ports. Dieser Befehl zeigt Socket-Statistiken an, die Sie verwenden können, um zu bestätigen, ob ein Port offen ist oder nicht. Die ss
Der Befehl zeigt mehr Informationen über offene Ports an als die anderen Tools.
Wie die netstat
Befehl, der -t
Flag weist ss
an um nur TCP-Sockets anzuzeigen, -u
um nur UDP-Sockets anzuzeigen, und -l
um nur lauschende Steckdosen anzuzeigen. Die -p
Flag gibt den Prozessnamen oder die PID an, die den Port verwendet.
ss -tulpn | grep LISTEN | grep :80
Sie sehen die folgende Ausgabe, wenn der Port offen ist. Wie Sie sehen, enthält die Ausgabe den Prozessnamen und die PID für jeden Listening-Port. In diesem Fall ist Port 80 offen und wird vom NGINX-Webserver verwendet.
Mit lsof prüfen, ob ein Port geöffnet ist
Der lsof
Der Befehl ist ein weiteres praktisches Tool, um nach offenen Ports zu suchen. Der lsof
Name steht für offene Dateien auflisten , das Informationen zu Dateien anzeigt, die auf dem System geöffnet sind. Zu diesen Informationen gehören Dateideskriptoren, Prozess-IDs, Benutzer-IDs usw.
Wie hilft Ihnen das Auflisten offener Dateien festzustellen, ob ein Port offen ist? Sie haben wahrscheinlich schon den Ausdruck „Alles in Linux ist eine Datei“ gehört – und dieser Ausdruck bedeutet, was er sagt.
Angenommen, Sie möchten überprüfen, ob Port 22 offen ist und Ihre Benutzer SSH auf Ihren Server zugreifen können. Führen Sie den folgenden Befehl aus, um offene Dateien mit aktiven Verbindungen in Port 22 aufzulisten.
Der -i
Flag weist lsof
an um alle geöffneten Internet-Sockets anzuzeigen. Der -P
Flag zeigt die Portnummern anstelle der Dienstnamen. Und die -n
-Flag unterdrückt DNS- und Dienstnamen-Lookups, 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 is the process id of the sshd service.
root is the user id that is using the port.
3u and 4u are the file descriptors for IPv4 and IPv6, respectively.
31035 and 31037 are the network ports for IPv4 and IPv6, respectively.
:22 indicates that port 22 is open for all IPv4 and IPv6 addresses.
- (LISTEN) zeigt an, dass der Port auf eingehende Verbindungen wartet.
0t0 is the status of the socket, which means that the socket is in the LISTEN state.
Überprüfen, ob ein Port mit nmap geöffnet ist
Bisher haben Sie gesehen, wie Sie mit der Befehlszeile überprüfen, ob ein Port unter Linux geöffnet ist. Aber was ist, wenn Sie überprüfen möchten, ob ein Port auf einem Remote-Computer geöffnet ist? In diesem Fall können Sie den nmap
verwenden Werkzeug.
Aber bevor Sie nmap
ausführen , beachten Sie, dass dieses Tool möglicherweise nicht Teil der Standardpakete in 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 einem Remotecomputer geöffnet ist. Dieser Befehl testet, ob Port 22
ist auf 159.89.176.25
geöffnet damit Ihr Benutzer SSH auf Ihren Server zugreifen kann. Ersetzen Sie die IP-Adresse nach Bedarf durch Ihre eigene.
nmap -p 22 159.89.176.25
Wie Sie sehen können, enthält die Ausgabe Informationen über:
- Die Startzeit des Port-Scannens (2022-06-30 16:58 UTC ).
- Die IP-Adresse des Remote-Computers (159.89.176.25 ).
- Der Status des Ports (offen ).
- Der Dienst, der den Port verwendet (ssh ).
- Der Zustand des Hosts (up ).
Das Ergebnis bestätigt, dass Benutzer mithilfe der IP-Adresse und des Ports eine SSH-Verbindung zum Computer herstellen können.
ssh [email protected] -p 22
Der Screenshot unten zeigt eine erfolgreiche SSH-Verbindung zum Server, was beweist, dass Port 22 offen ist.
Testen, ob ein Port von einem Shell-Skript geöffnet ist
Automatisierung ist immer eine gute Idee. Das Überprüfen offener Ports durch Ausführen eines Shell-Skripts ist eine hervorragende Möglichkeit, mehrere Ports zu testen. Sie können alle vorherigen Methoden verwenden, um zu überprüfen, ob ein Port geöffnet ist. Aber für dieses Beispiel schreiben Sie ein einfaches Shell-Skript, das Netcat ausführt nc
Befehl.
1. Erstellen Sie eine Datei namens check_port .sh in Ihrem Home-Verzeichnis mit Ihrem bevorzugten Texteditor. Dieses Beispiel verwendet nano.
nano check_port.sh
2. Kopieren Sie den folgenden Beispielcode in Ihren Editor. Ersetzen Sie 80 durch die Portnummer, die Sie überprüfen möchten.
Das wenn condition prüft mit dem nc-Befehl, ob Port 80 offen ist. Die 2>&1 und>/dev/null leiten die Fehler- bzw. Ausgabemeldungen nach /dev/null um. /dev/null ist eine spezielle Datei, die alles verwirft, was sie empfängt.
Wenn der Port offen ist, wird die check_port.sh Das Skript wird online auf der Konsole gedruckt. Andernfalls wird das Skript offline gedruckt.
if ( nc -zv localhost 80 2>&1 >/dev/null ); then
echo 'Online'
else
echo 'Offline'
fi
Die Skriptdatei sollte ähnlich wie im folgenden Screenshot aussehen. Speichern Sie das Skript und beenden Sie den Editor.
3. Führen Sie das Shell-Skript aus, um nach den offenen Ports zu suchen, die Sie im Skript angegeben haben.
bash check_port.sh
Abhängig davon, ob der Port geöffnet ist, sehen Sie eine der folgenden Ausgaben. In diesem Fall ist der Port offen, was die Meldung Online
bestätigt.
Sie können dieses Shell-Skript verwenden, um zu überprüfen, ob ein Port in einem Intervall oder einem geplanten Job geöffnet ist. Scripting ist besonders hilfreich, wenn Sie mehrere Server überprüfen müssen. Sie müssen nur diese check_port.sh kopieren Skript an alle Server, die Sie überprüfen möchten, und führen Sie es mit CI/CD-Tools wie Jenkins oder Ansible aus.
Testen, ob ein Port mit PowerShell geöffnet ist
PowerShell verfügt über ein integriertes Cmdlet zum Testen von Netzwerkverbindungen mit dem Namen Test-NetConnection
– aber dieses Cmdlet ist nur auf Windows-Systemen verfügbar. Mach dir keine Sorgen; Sie können weiterhin PowerShell in Linux verwenden, um offene Ports und Verbindungen mit der TcpClient-Klasse zu überprüfen.
Wenn Ihr Linux-Computer noch nicht über PowerShell verfügt, installieren Sie es anhand der Anweisungen in dieser Microsoft-Dokumentation:Installieren Sie PowerShell unter Linux.
1. Starten Sie PowerShell, indem Sie den folgenden Befehl ausführen.
pwsh
2. Als nächstes erstellen Sie mit Ihrem Texteditor eine Datei namens Test-Port.ps1. Dieses Beispiel verwendet nano.
nano Test-Port.ps1
3. Kopieren Sie als Nächstes den folgenden Code in Ihren Editor. Speichern Sie die Datei und verlassen Sie danach den Editor.
Hinweis:Dieser Code ist ein Auszug aus dem An All-in-One PowerShell Test Port Testing Tool.
<#
.SYNOPSIS
This function tests for open TCP/UDP ports.
.DESCRIPTION
This function tests any TCP/UDP port to see if it's open or closed.
.NOTES
.PARAMETER Computername
One or more remote, comma-separated computer names
.PARAMETER Port
One or more comma-separated port numbers you'd like to test.
.PARAMETER TcpTimeout
The number of milliseconds that the function will wait until declaring
the TCP port closed. Default is 1000.
.EXAMPLE
PS> Test-Port -Computername 'LABDC','LABDC2' -Protocol TCP 80,443
This example tests the TCP network ports 80 and 443 on both the LABDC
and LABDC2 servers.
#>
[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:$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
:$Portx'"
$Output.Result = $false
}
else {
$TcpClient.EndConnect($Connect)
$TcpClient.Close()
Write-Verbose "$($MyInvocation.MyCommand.Name) - '$Computer' passed port test on port '$Protocol:$Portx'"
$Output.Result = $true
$TcpClient.Close()
$TcpClient.Dispose()
}
[pscustomobject]$Output
}
}
}
4. Führen Sie nach dem Speichern des Skripts Test-Port.ps1 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 zu testenden Portnummern.
./Test-Port.ps1 -ComputerName localhost -Port 22,80,443
Wie Sie unten sehen können, zeigt das Ergebnis, dass die Ports 22 und 80 offen sind (True), während Port 443 nicht geöffnet ist (False).
Um dasselbe Skript für mehrere Zielendpunkte und Ports auszuführen, bearbeiten Sie den folgenden Code, um alle Zielcomputer im ComputerName-Parameter und Portnummern im Port-Parameter hinzuzufügen.
./Test-Port.ps1 `
-ComputerName adamtheautomator.com,localhost,8.8.8.8 `
-Port 22,80,443,53
Schlussfolgerung
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, über ein Shell-Skript und PowerShell zu prüfen, ob ein Port geöffnet ist. Jetzt können Sie eine dieser Methoden verwenden, um zu überprüfen, ob ein Port auf Ihrem Computer oder einem Remote-Computer geöffnet ist.
Hören Sie hier jedoch nicht auf. Sehen Sie sich andere Artikel zur Fehlerbehebung an, um Ihre Fähigkeiten als Systemadministrator weiter zu verbessern!