GNU/Linux >> Linux Esercitazione >  >> Linux

Tutti i modi per verificare se una porta è aperta in Linux

Il tuo server Linux è in esecuzione e ora vuoi controllare se una porta specifica è aperta in modo da potervi accedere da remoto. Il controllo delle porte aperte è un'attività abbastanza comune per gli amministratori di sistema e ci sono diversi modi per farlo in Linux.

In questo articolo imparerai diversi modi per verificare se una porta è aperta in Linux in modo da poter scegliere quella che funziona meglio per te. Pronto? Continua a leggere!

Prerequisiti

Questo tutorial sarà una dimostrazione pratica. Se desideri continuare, assicurati di avere quanto segue.

  • Un computer Linux. Questa guida utilizza Ubuntu 20.04, ma qualsiasi distribuzione Linux recente dovrebbe funzionare.
  • Accesso a un terminale. Se utilizzi un ambiente desktop grafico, cerca un programma di emulazione di terminale nel menu dell'applicazione. Oppure, se hai effettuato l'accesso a un server remoto tramite SSH,
  • Un account utente con sudo privilegi. Per semplicità, questo tutorial utilizza l'utente root.

Verifica se una porta è aperta in Linux utilizzando netstat

Il primo metodo per verificare se una porta è aperta in Linux è eseguire netstat comando. Questo comando visualizza le connessioni di rete, le tabelle di routing e molte statistiche dell'interfaccia di rete.

Il netstat il comando fa parte del net-tools pacchetto e questo pacchetto potrebbe non essere disponibile per impostazione predefinita con la tua distribuzione Linux. Su Ubuntu, installa netstat eseguendo i seguenti comandi nel terminale.

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

Supponiamo che tu abbia un server web NGINX in esecuzione e desideri controllare se la porta 80 è aperto. Puoi farlo eseguendo il comando seguente. Sostituisci 80 con il numero di porta che desideri controllare.

Il -tulpn i flag istruiscono netstat per visualizzare tutte le porte di ascolto. Il primo grep Il comando trova e filtra la riga contenente la parola LISTEN nel risultato. Il secondo grep il comando filtra i risultati per visualizzare solo gli elementi che corrispondono a :80 .

netstat -tulpn | grep LISTEN | grep :80

Per saperne di più sui flag netstat, esegui il comando netstat –help.

Se la porta è aperta, vedrai il seguente output. Come puoi vedere, l'output mostra che la porta 80 è aperta sul sistema. TCP è il tipo di protocollo e :::80 indica che si tratta di un TCPv6 porta. 0.0.0.0:80 significa che la porta è aperta per tutti gli indirizzi IPv4. 80 è la porta HTTP predefinita che serve l'accesso al sito web.

Verifica se una porta è aperta utilizzando ss

Il ss command è un'altra utilità della riga di comando per il controllo delle porte aperte. Questo comando visualizza le statistiche del socket, che puoi utilizzare per confermare se una porta è aperta o meno. Il ss il comando mostra più informazioni sulle porte aperte rispetto agli altri strumenti.

Come il netstat comando, il -t flag indica ss per visualizzare solo i socket TCP, -u per visualizzare solo i socket UDP e -l per mostrare solo le prese di ascolto. Il -p flag indica il nome del processo o il PID che utilizza la porta.

ss -tulpn | grep LISTEN | grep :80

Vedrai il seguente output se la porta è aperta. Come puoi vedere, l'output contiene il nome del processo e il PID per ciascuna porta in ascolto. In questo caso, la porta 80 è aperta e il server web NGINX la sta utilizzando.

Verifica se una porta è aperta utilizzando lsof

Il lsof command è un altro strumento utile per verificare la presenza di porte aperte. Il lsof name sta per elenca i file aperti , che visualizza le informazioni sui file aperti nel sistema. Queste informazioni includono descrittori di file, ID di processo, ID utente, ecc.

In che modo l'elenco dei file aperti ti aiuta a determinare se una porta è aperta? Probabilmente hai già sentito la frase "tutto in Linux è un file", e questa frase significa quello che dice.

Ad esempio, supponi di voler controllare se la porta 22 è aperta e se i tuoi utenti possono accedere tramite SSH al tuo server. Esegui il comando seguente per elencare i file aperti con connessioni attive nella porta 22.

Il -i flag indica lsof per visualizzare tutte le prese Internet aperte. Il -P flag mostra i numeri di porta invece dei nomi dei servizi. E il -n flag sopprime le ricerche DNS e dei nomi dei servizi, quindi vedrai gli indirizzi IP invece dei nomi host remoti.

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

Se la porta è aperta, vedrai il seguente output. Come puoi vedere, l'output contiene informazioni su:

  • 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) mostra che la porta è in ascolto per le connessioni in entrata.
  • 0t0 is the status of the socket, which means that the socket is in the LISTEN state.

Verifica se una porta è aperta usando nmap

Finora, hai visto come verificare se una porta è aperta su Linux usando la riga di comando. Ma cosa succede se si desidera verificare se una porta è aperta su una macchina remota? In tal caso, puoi utilizzare il nmap strumento.

Ma prima di eseguire nmap , tieni presente che questo strumento potrebbe non essere parte dei pacchetti predefiniti nella tua distribuzione Linux. In tal caso, devi prima installare nmap eseguendo il comando seguente.

apt install nmap -y

Ora, esegui il comando seguente per verificare se una porta è aperta su una macchina remota. Questo comando verifica se la porta 22 è aperto su 159.89.176.25 in modo che il tuo utente possa entrare in SSH nel tuo server. Sostituisci l'indirizzo IP secondo necessità con il tuo.

nmap -p 22 159.89.176.25

Come puoi vedere, l'output contiene informazioni su:

  • L'ora di inizio della scansione delle porte (30-06-2022 16:58 UTC ).
  • L'indirizzo IP della macchina remota (159.89.176.25 ).
  • Lo stato del porto (aperto ).
  • Il servizio che sta utilizzando la porta (ssh ).
  • Lo stato dell'host (su ).

Il risultato conferma che gli utenti possono accedere tramite SSH al computer utilizzando l'indirizzo IP e la porta.

ssh [email protected] -p 22

Lo screenshot seguente mostra una connessione SSH riuscita al server, dimostrando che la porta 22 è aperta.

Verifica se una porta è aperta da uno script della shell

L'automazione è sempre una buona idea. Il controllo delle porte aperte eseguendo uno script di shell è un modo eccellente per testare più porte. È possibile utilizzare qualsiasi metodo precedente per verificare se una porta è aperta. Ma, per questo esempio, scriverai uno script di shell di base che esegue Netcat nc comando.

1. Crea un file chiamato check_port .sh nella tua home directory usando il tuo editor di testo preferito. Questo esempio usa nano.

nano check_port.sh

2. Copia il codice di esempio seguente nel tuo editor. Sostituisci 80 con il numero di porta che vuoi controllare.

Il se condition controlla se la porta 80 è aperta usando il comando nc. 2>&1 e>/dev/null reindirizzano i messaggi di errore e di output rispettivamente a /dev/null. /dev/null è un file speciale che scarta tutto ciò che riceve.

Se la porta è aperta, check_port.sh lo script verrà stampato in linea sulla console. Altrimenti, lo script verrà stampato offline.

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

Il file di script dovrebbe essere simile allo screenshot qui sotto. Salva lo script ed esci dall'editor.

3. Esegui lo script della shell per iniziare a controllare le porte aperte specificate all'interno dello script.

bash check_port.sh

Vedrai uno dei seguenti output a seconda che la porta sia aperta. In questo caso, la porta è aperta, che contiene il messaggio Online conferma.

È possibile utilizzare questo script di shell per verificare se una porta è aperta a intervalli o un lavoro pianificato. Gli script sono particolarmente utili quando devi controllare più server. Devi solo copiare questo check_port.sh script su tutti i server che desideri controllare ed eseguirlo utilizzando strumenti CI/CD come Jenkins o Ansible.

Verifica se una porta è aperta utilizzando PowerShell

PowerShell ha un cmdlet integrato per testare le connessioni di rete chiamato Test-NetConnection — ma quel cmdlet è disponibile solo su sistemi Windows. Non preoccuparti; puoi comunque usare PowerShell in Linux per controllare le porte e le connessioni aperte usando la classe TcpClient.

Se il tuo computer Linux non ha ancora PowerShell, installalo seguendo le istruzioni in questa documentazione Microsoft:Installa PowerShell su Linux.

1. Avvia PowerShell eseguendo il comando seguente.

pwsh

2. Quindi, crea un file chiamato Test-Port.ps1 usando il tuo editor di testo. Questo esempio usa nano.

nano Test-Port.ps1

3. Quindi, copia il codice seguente nel tuo editor. Salva il file e poi esci dall'editor.

Nota:questo codice è un estratto di 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. Dopo aver salvato lo script Test-Port.ps1, esegui il comando seguente per testare le porte 22, 80, 443 e 53.

Il parametro -ComputerName accetta l'elenco di nomi host, FQDN o indirizzi IP delle macchine di destinazione.

Il parametro -Port accetta una matrice di uno o più numeri di porta da testare.

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

Come puoi vedere di seguito, il risultato mostra che le porte 22 e 80 sono aperte (True), mentre la porta 443 non lo è (False).

Per eseguire lo stesso script su più porte e endpoint di destinazione, modifica il codice seguente per aggiungere tutti i computer di destinazione nel parametro ComputerName e i numeri di porta nel parametro Port.

./Test-Port.ps1 `
    -ComputerName adamtheautomator.com,localhost,8.8.8.8 `
    -Port 22,80,443,53

Conclusione

In questo articolo, hai imparato come verificare se una porta è aperta o meno in Linux. Hai anche imparato a verificare se una porta è aperta da uno script di shell e da PowerShell. Ora puoi utilizzare uno qualsiasi di questi metodi per verificare se una porta è aperta sulla tua macchina o su qualsiasi macchina remota.

Non fermarti qui, però. Consulta altri articoli sulla risoluzione dei problemi per continuare ad affinare le tue capacità di amministratore di sistema!


Linux
  1. 4 modi per modificare le foto sulla riga di comando di Linux

  2. Controlla lo stato del file su Linux con il comando stat

  3. Padroneggia il comando ls di Linux

  4. 5 modi per usare il comando move in Linux

  5. Come controllare la porta aperta su un sistema Linux remoto

Cosa sono i porti? Come controllare le porte aperte di Linux?

Strumenti Sysadmin:11 modi per usare il comando ls in Linux

Come verificare che una porta sia aperta su un sistema Linux remoto

3 modi per controllare la versione del kernel Linux nella riga di comando

Come controllare tutte le porte aperte nel tuo sistema Linux

Come controllare le porte aperte in Linux?