GNU/Linux >> Linux の 問題 >  >> Linux

Linux でポートが開いているかどうかを確認するすべての方法

Linux サーバーが実行されており、特定のポートが開いているかどうかを確認して、リモートでアクセスできるようにしたいと考えています。開いているポートを確認することは、システム管理者にとってかなり一般的なタスクであり、Linux ではいくつかの方法で確認できます。

この記事では、Linux でポートが開いているかどうかを確認するいくつかの方法を学習し、最適な方法を選択できるようにします。準備?続きを読む

前提条件

このチュートリアルは実践的なデモンストレーションです。フォローしたい場合は、次のものがあることを確認してください。

  • Linux コンピュータ。このガイドでは Ubuntu 20.04 を使用していますが、最近の Linux ディストリビューションはすべて動作するはずです。
  • 端末へのアクセス。グラフィカル デスクトップ環境を使用している場合は、アプリケーション メニューでターミナル エミュレータ プログラムを探します。または、SSH 経由でリモート サーバーにログインした場合は、
  • sudo のユーザー アカウント 特権。簡単にするために、このチュートリアルでは root ユーザーを使用します。

netstat を使用して、Linux でポートが開いているかどうかを確認します

Linux でポートが開いているかどうかを確認する最初の方法は、netstat を実行することです。 指図。このコマンドは、ネットワーク接続、ルーティング テーブル、および多くのネットワーク インターフェース統計を表示します。

netstat コマンドは net-tools の一部です パッケージであり、このパッケージは Linux ディストリビューションにデフォルトで付属していない場合があります。 Ubuntu では、netstat をインストールします。 ターミナルで次のコマンドを実行します。

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

NGINX Web サーバーを実行していて、ポートが 80 かどうかを確認したいとします。 開いています。これを行うには、次のコマンドを実行します。 80 を置き換えます 確認したいポート番号を付けてください。

-tulpn フラグは netstat を指示します すべてのリッスン ポートを表示します。最初の grep コマンドは、単語 LISTEN を含む行を見つけてフィルタリングします 結果で。 2 番目の grep コマンドは結果をフィルタリングして、:80 に一致するアイテムのみを表示します。 .

netstat -tulpn | grep LISTEN | grep :80

netstat フラグの詳細については、netstat –help コマンドを実行してください。

ポートが開いている場合は、次の出力が表示されます。ご覧のとおり、出力はシステムでポート 80 が開いていることを示しています。 tcp はプロトコル タイプ、:::80 TCPv6 であることを示します ポート。 0.0.0.0:80 ポートがすべての IPv4 アドレスに対して開いていることを意味します。 80 Web サイトへのアクセスを提供するデフォルトの HTTP ポートです。

ss を使用してポートが開いているかどうかを確認する

ss command は、開いているポートをチェックするための別のコマンドライン ユーティリティです。このコマンドは、ポートが開いているかどうかを確認するために使用できるソケット統計を表示します。 ss コマンドは、開いているポートに関する情報を他のツールよりも多く表示します。

netstat のように コマンド、-t フラグは ss を指示します TCP ソケットのみを表示するには -u UDP ソケットと -l のみを表示するには リッスンしているソケットのみを表示します。 -p フラグは、ポートを使用するプロセス名または PID を示します。

ss -tulpn | grep LISTEN | grep :80

ポートが開いている場合は、次の出力が表示されます。ご覧のとおり、出力には、各リッスン ポートのプロセス名と PID が含まれています。この場合、ポート 80 が開いており、NGINX Web サーバーがそれを使用しています。

lsof を使用してポートが開いているかどうかを確認する

lsof コマンドは、開いているポートをチェックするもう 1 つの便利なツールです。 lsof 名前は開いているファイルのリストを表します 、システムで開いているファイルに関する情報を表示します。この情報には、ファイル記述子、プロセス ID、ユーザー ID などが含まれます。

開いているファイルのリストは、ポートが開いているかどうかを判断するのにどのように役立ちますか? 「Linux ではすべてがファイルである」というフレーズを聞いたことがあるかもしれませんが、このフレーズはその内容を意味しています。

たとえば、ポート 22 が開いていて、ユーザーがサーバーに SSH 接続できるかどうかを確認するとします。以下のコマンドを実行して、ポート 22 でアクティブな接続を持つ開いているファイルを一覧表示します。

-i フラグは lsof を指示します 開いているすべてのインターネット ソケットを表示します。 -P flag は、サービス名の代わりにポート番号を表示します。そして -n フラグは DNS とサービス名のルックアップを抑制するため、リモート ホスト名の代わりに IP アドレスが表示されます。

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

ポートが開いている場合は、次の出力が表示されます。ご覧のとおり、出力には以下に関する情報が含まれています。

  • 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) は、ポートが着信接続をリッスンしていることを示します。
  • 0t0 is the status of the socket, which means that the socket is in the LISTEN state.

nmap を使用してポートが開いているかどうかを確認する

これまで、コマンド ラインを使用して Linux でポートが開いているかどうかを確認する方法を見てきました。しかし、リモート マシンでポートが開いているかどうかを確認したい場合はどうでしょうか。その場合、 nmap を使用できます

nmap を実行する前に このツールは、Linux ディストリビューションのデフォルト パッケージに含まれていない可能性があることに注意してください。その場合、最初に nmap をインストールする必要があります 以下のコマンドを実行してください。

apt install nmap -y

次に、次のコマンドを実行して、リモート マシンでポートが開いているかどうかを確認します。このコマンドは、ポート 22 かどうかをテストします 159.89.176.25 で開いています ユーザーがサーバーに SSH 接続できるようにします。必要に応じて IP アドレスを自分のものに置き換えてください。

nmap -p 22 159.89.176.25

ご覧のとおり、出力には以下に関する情報が含まれています。

  • ポート スキャンの開始時刻 (2022-06-30 16:58 UTC ).
  • リモート マシンの IP アドレス (159.89.176.25 ).
  • ポートの状態 (open ).
  • ポートを使用しているサービス (ssh ).
  • ホストの状態 (up ).

結果は、ユーザーが IP アドレスとポートを使用してコンピューターに SSH 接続できることを確認します。

ssh [email protected] -p 22

以下のスクリーンショットは、サーバーへの SSH 接続が成功したことを示しており、ポート 22 が開いていることを示しています。

シェル スクリプトからポートが開いているかどうかのテスト

自動化は常に良い考えです。シェル スクリプトを実行して開いているポートを確認することは、複数のポートをテストする優れた方法です。以前の方法を使用して、ポートが開いているかどうかを確認できます。ただし、この例では、Netcat を実行する基本的なシェル スクリプトを作成します。 nc コマンド。

1. check_port という名前のファイルを作成します 任意のテキスト エディターを使用してホーム ディレクトリに .sh を作成します。この例では nano を使用しています。

nano check_port.sh

2. 以下のサンプル コードをエディタにコピーします。 80 をチェックしたいポート番号に置き換えます。

if 条件は、nc コマンドを使用して 80 ポートが開いているかどうかをチェックします。 2>&1 および>/dev/null は、エラーおよび出力メッセージをそれぞれ /dev/null にリダイレクトします。 /dev/null は、受信したすべてを破棄する特別なファイルです。

ポートが開いている場合、check_port.sh スクリプトはオンラインをコンソールに出力します。それ以外の場合、スクリプトはオフラインで印刷されます。

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

スクリプト ファイルは、次のスクリーンショットのようになります。スクリプトを保存してエディターを終了します。

3. シェル スクリプトを実行して、スクリプト内で指定した開いているポートのチェックを開始します。

bash check_port.sh

ポートが開いているかどうかに応じて、次のいずれかの出力が表示されます。この場合、ポートは開いており、メッセージ Online

このシェル スクリプトを使用して、ポートが定期的に開いているか、スケジュールされたジョブであるかを確認できます。スクリプトは、複数のサーバーをチェックする必要がある場合に特に役立ちます。この check_port.sh をコピーするだけです。 Jenkins や Ansible などの CI/CD ツールを使用して確認し、実行するすべてのサーバーにスクリプトを送信します。

PowerShell を使用してポートが開いているかどうかをテストする

PowerShell には、Test-NetConnection というネットワーク接続をテストするためのコマンドレットが組み込まれています。 — ただし、そのコマンドレットは Windows システムでのみ使用できます。心配しないで; Linux で PowerShell を使用して、TcpClient クラスを使用して開いているポートと接続を確認できます。

Linux コンピューターに PowerShell がまだインストールされていない場合は、この Microsoft ドキュメントの手順に従ってインストールしてください:Linux に PowerShell をインストールする

1. 以下のコマンドを実行して PowerShell を起動します。

pwsh

2. 次に、テキスト エディターを使用して Test-Port.ps1 というファイルを作成します。この例では nano を使用しています。

nano Test-Port.ps1

3. 次に、以下のコードをエディターにコピーします。ファイルを保存し、後でエディターを終了します。

注:このコードは、オールインワン PowerShell テスト ポート テスト ツールの抜粋です。

<#
	.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. Test-Port.ps1 スクリプトを保存したら、次のコマンドを実行して、ポート 22、80、443、および 53 をテストします。

-ComputerName パラメーターは、ターゲット マシンのホスト名、FQDN、または IP アドレスのリストを受け入れます。

-Port パラメーターは、テストする 1 つ以上のポート番号の配列を受け入れます。

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

以下に示すように、結果は、ポート 22 と 80 が開いている (True) のに対し、ポート 443 は開いていない (False) ことを示しています。

複数のターゲット エンドポイントとポートに対して同じスクリプトを実行するには、以下のコードを編集して、ComputerName パラメーターにすべてのターゲット コンピューターを追加し、Port パラメーターにポート番号を追加します。

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

結論

この記事では、Linux でポートが開いているかどうかを確認する方法を学習しました。また、シェル スクリプトと PowerShell からポートが開いているかどうかを確認する方法も学習しました。これで、これらの方法のいずれかを使用して、自分のマシンまたはリモート マシンでポートが開いているかどうかを確認できます。

ただし、ここで停止しないでください。他のトラブルシューティング記事をチェックして、システム管理者のスキルを磨き続けてください!


Linux
  1. Linuxコマンドラインで写真を編集する4つの方法

  2. リモートLinuxシステムで開いているポートを確認する方法

  3. Mac OS X の open コマンドに相当する Linux

  1. statコマンドを使用してLinuxのファイルステータスを確認します

  2. Linuxlsコマンドをマスターする

  3. Linux サーバーでポートが開いているか閉じているかを確認しますか?

  1. Linuxのcowsayコマンドを使用する3つの興味深い方法

  2. Linuxでmoveコマンドを使用する5つの方法

  3. Linuxでのポートの使用を確認する