GNU/Linux >> Znalost Linux >  >> Linux

Všechny způsoby, jak zkontrolovat, zda je port otevřený v Linuxu

Váš linuxový server běží a nyní chcete zkontrolovat, zda je otevřený konkrétní port, abyste k němu měli vzdálený přístup. Kontrola otevřených portů je poměrně běžným úkolem systémových administrátorů a v Linuxu existuje několik různých způsobů, jak toho dosáhnout.

V tomto článku se dozvíte několik způsobů, jak zkontrolovat, zda je port otevřený v Linuxu, takže si můžete vybrat, které pro vás budou nejlepší. Připraveni? Čtěte dál!

Předpoklady

Tento tutoriál bude praktickou ukázkou. Pokud chcete sledovat, ujistěte se, že máte následující.

  • Počítač se systémem Linux. Tato příručka používá Ubuntu 20.04, ale všechny nejnovější distribuce Linuxu by měly fungovat.
  • Přístup k terminálu. Pokud používáte grafické desktopové prostředí, vyhledejte v nabídce aplikace program emulátoru terminálu. Nebo, pokud jste se přihlásili ke vzdálenému serveru přes SSH,
  • Uživatelský účet s sudo privilegia. Pro zjednodušení tento tutoriál používá uživatele root.

Zkontrolujte, zda je port otevřený v Linuxu pomocí netstat

První metodou, jak zkontrolovat, zda je port otevřený v Linuxu, je spuštění netstat příkaz. Tento příkaz zobrazí síťová připojení, směrovací tabulky a mnoho statistik síťového rozhraní.

netstat příkaz je součástí net-tools balíček a tento balíček nemusí být standardně dodáván s vaší distribucí Linuxu. Na Ubuntu nainstalujte netstat spuštěním následujících příkazů v terminálu.

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

Předpokládejme, že máte spuštěný webový server NGINX a chcete zkontrolovat, zda port 80 je otevřeno. Můžete tak učinit spuštěním následujícího příkazu. Nahraďte 80 s číslem portu, který chcete zkontrolovat.

-tulpn příznaky instruují netstat pro zobrazení všech naslouchacích portů. První grep příkaz vyhledá a filtruje řádek obsahující slovo LISTEN ve výsledku. Druhý grep příkaz filtruje výsledky tak, aby zobrazil pouze položky odpovídající :80 .

netstat -tulpn | grep LISTEN | grep :80

Chcete-li se dozvědět více o příznacích netstat, spusťte příkaz netstat –help.

Pokud je port otevřený, uvidíte následující výstup. Jak můžete vidět, výstup ukazuje, že port 80 je v systému otevřený. TCP je typ protokolu a :::80 označuje, že se jedná o TCPv6 přístav. 0.0.0.0:80 znamená, že port je otevřený pro všechny adresy IPv4. 80 je výchozí port HTTP obsluhující přístup k webu.

Kontrola, zda je port otevřený pomocí ss

ss command je další nástroj příkazového řádku pro kontrolu otevřených portů. Tento příkaz zobrazí statistiku soketu, kterou můžete použít k potvrzení, zda je port otevřený nebo ne. ss zobrazí více informací o otevřených portech než jiné nástroje.

Stejně jako netstat příkaz -t flag dává pokyn ss chcete-li zobrazit pouze sokety TCP, -u pro zobrazení pouze soketů UDP a -l zobrazit pouze poslechové zásuvky. -p příznak označuje název procesu nebo PID pomocí portu.

ss -tulpn | grep LISTEN | grep :80

Pokud je port otevřený, uvidíte následující výstup. Jak můžete vidět, výstup obsahuje název procesu a PID pro každý naslouchací port. V tomto případě je port 80 otevřený a webový server NGINX jej používá.

Kontrola, zda je port otevřený pomocí lsof

lsof Command je dalším užitečným nástrojem pro kontrolu otevřených portů. lsof název znamená seznam otevřených souborů , která zobrazuje informace o souborech, které jsou v systému otevřené. Tyto informace zahrnují deskriptory souborů, ID procesů, ID uživatelů atd.

Jak vám výpis otevřených souborů pomůže určit, zda je port otevřený? Pravděpodobně jste již slyšeli frázi „vše v Linuxu je soubor“ – a tato fráze znamená to, co říká.

Předpokládejme například, že chcete zkontrolovat, zda je otevřený port 22 a vaši uživatelé mohou na váš server SSH. Spuštěním níže uvedeného příkazu zobrazíte seznam otevřených souborů s aktivními připojeními na portu 22.

-i flag instruuje lsof zobrazit všechny otevřené internetové zásuvky. -P příznak zobrazuje čísla portů místo názvů služeb. A -n příznak potlačí vyhledávání DNS a názvu služby, takže místo názvů vzdálených hostitelů uvidíte IP adresy.

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

Pokud je port otevřený, uvidíte následující výstup. Jak vidíte, výstup obsahuje informace o:

  • 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) ukazuje, že port naslouchá příchozím připojením.
  • 0t0 is the status of the socket, which means that the socket is in the LISTEN state.

Kontrola, zda je port otevřený pomocí nmap

Zatím jste viděli, jak zkontrolovat, zda je port otevřený v Linuxu pomocí příkazového řádku. Ale co když chcete zkontrolovat, zda je na vzdáleném počítači otevřený port? V takovém případě můžete použít nmap nástroj.

Ale před spuštěním nmap , mějte na paměti, že tento nástroj nemusí být součástí výchozích balíčků ve vaší distribuci Linuxu. V takovém případě musíte nejprve nainstalovat nmap spuštěním níže uvedeného příkazu.

apt install nmap -y

Nyní spusťte následující příkaz a zkontrolujte, zda je na vzdáleném počítači otevřený port. Tento příkaz otestuje port 22 je otevřena na 159.89.176.25 takže váš uživatel může SSH na váš server. Nahraďte IP adresu podle potřeby svou.

nmap -p 22 159.89.176.25

Jak vidíte, výstup obsahuje informace o:

  • Čas zahájení skenování portů (2022-06-30 16:58 UTC ).
  • IP adresa vzdáleného počítače (159.89.176.25 ).
  • Stav portu (otevřený ).
  • Služba, která používá port (ssh ).
  • Stav hostitele (nahoru ).

Výsledek potvrzuje, že uživatelé mohou SSH do počítače pomocí IP adresy a portu.

ssh [email protected] -p 22

Snímek obrazovky níže ukazuje úspěšné připojení SSH k serveru, což dokazuje, že port 22 je otevřený.

Testování, zda je port otevřený ze skriptu Shell

Automatizace je vždy dobrý nápad. Kontrola otevřených portů spuštěním skriptu shellu je vynikající způsob, jak otestovat více portů. Ke kontrole, zda je port otevřený, můžete použít jakékoli předchozí metody. Ale pro tento příklad budete psát základní skript shellu, který spustí Netcat nc příkaz.

1. Vytvořte soubor s názvem check_port .sh ve vašem domovském adresáři pomocí preferovaného textového editoru. Tento příklad používá nano.

nano check_port.sh

2. Zkopírujte níže uvedený ukázkový kód do svého editoru. Nahraďte 80 číslem portu, který chcete zkontrolovat.

pokud podmínka zkontroluje, zda je port 80 otevřený pomocí příkazu nc. 2>&1 a>/dev/null přesměrovávají chybové a výstupní zprávy na /dev/null. /dev/null je speciální soubor, který zahodí vše, co obdrží.

Pokud je port otevřený, check_port.sh skript vytiskne online na konzoli. Jinak se skript vytiskne offline.

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

Soubor skriptu by měl vypadat podobně jako níže uvedený snímek obrazovky. Uložte skript a ukončete editor.

3. Spusťte skript shellu a začněte kontrolovat otevřené porty, které jste zadali ve skriptu.

bash check_port.sh

V závislosti na tom, zda je port otevřený, uvidíte jeden z následujících výstupů. V tomto případě je port otevřený, což je zpráva Online potvrzuje.

Tento skript shellu můžete použít ke kontrole, zda je port otevřený v intervalu nebo plánované úloze. Skriptování je zvláště užitečné, když musíte zkontrolovat více serverů. Stačí zkopírovat tento check_port.sh skript na všechny servery, které chcete zkontrolovat, a spusťte jej pomocí nástrojů CI/CD, jako je Jenkins nebo Ansible.

Testování, zda je port otevřený pomocí prostředí PowerShell

PowerShell má vestavěnou rutinu pro testování síťových připojení s názvem Test-NetConnection — ale tato rutina je dostupná pouze v systémech Windows. Nebojte se; stále můžete používat PowerShell v Linuxu ke kontrole otevřených portů a připojení pomocí třídy TcpClient.

Pokud váš počítač se systémem Linux ještě nemá PowerShell, nainstalujte jej podle pokynů v této dokumentaci společnosti Microsoft:Instalace PowerShell v systému Linux.

1. Spusťte PowerShell spuštěním níže uvedeného příkazu.

pwsh

2. Dále pomocí textového editoru vytvořte soubor s názvem Test-Port.ps1. Tento příklad používá nano.

nano Test-Port.ps1

3. Dále zkopírujte níže uvedený kód do svého editoru. Uložte soubor a poté editor ukončete.

Poznámka:Tento kód je výňatek z nástroje 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. Po uložení skriptu Test-Port.ps1 spusťte níže uvedený příkaz a otestujte porty 22, 80, 443 a 53.

Parametr -ComputerName přijímá seznam názvů hostitelů, FQDN nebo IP adres cílových počítačů.

Parametr -Port přijímá pole jednoho nebo více čísel portů k testování.

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

Jak můžete vidět níže, výsledek ukazuje, že porty 22 a 80 jsou otevřené (True), zatímco port 443 není (False).

Chcete-li spustit stejný skript proti více cílovým koncovým bodům a portům, upravte níže uvedený kód a přidejte všechny cílové počítače do parametru Název_počítače a čísla portů do parametru Port.

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

Závěr

V tomto článku jste se naučili, jak zkontrolovat, zda je port otevřený nebo ne v Linuxu. Naučili jste se také zkontrolovat, zda je port otevřený ze skriptu prostředí a prostředí PowerShell. Nyní můžete použít kteroukoli z těchto metod ke kontrole, zda je na vašem počítači nebo na jakémkoli vzdáleném počítači otevřený port.

Nezastavujte se zde však. Podívejte se na další články o odstraňování problémů a pokračujte ve zdokonalování svých dovedností správce systému!


Linux
  1. Zkontrolujte stav souboru v systému Linux pomocí příkazu stat

  2. 5 způsobů, jak použít příkaz move v Linuxu

  3. Zkontrolujte použití portu v Linuxu

  1. 4 způsoby úpravy fotografií na příkazovém řádku Linuxu

  2. Zvládněte příkaz Linux ls

  3. Zkontrolujte, zda je port otevřený nebo uzavřený na serveru Linux?

  1. 3 zajímavé způsoby použití linuxového příkazu cowsay

  2. Jak zkontrolovat otevřený port na vzdáleném systému Linux

  3. Linux ekvivalent příkazu otevřít Mac OS X