もっと詳しく

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 結果で。 二番目 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 flag はポートを使用するプロセス名または PID を示します。

ss -tulpn | grep LISTEN | grep :80

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

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

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.
lsof を使用してポートが開いているかどうかを確認する
lsof を使用してポートが開いているかどうかを確認する

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

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

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

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

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

  • ポートスキャンの開始時刻 (2022-06-30 16:58 UTC)。
  • リモート マシンの IP アドレス (159.89.176.25)。
  • ポートの状態 (開いた)。
  • ポートを使用しているサービス (ssh)。
  • ホストの状態 ()。
nmap を使用してポートが開いているかどうかを確認する
nmap を使用してポートが開いているかどうかを確認する

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

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

サーバーへの SSH 接続
サーバーへの SSH 接続

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

自動化は常に良い考えです。 シェル スクリプトを実行して開いているポートを確認することは、複数のポートをテストする優れた方法です。 以前の方法を使用して、ポートが開いているかどうかを確認できます。 ただし、この例では、以下を実行する基本的なシェル スクリプトを記述します。 ネットキャット nc 指図。

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

2. 以下のサンプル コードをエディタにコピーします。 80 を確認するポート番号に置き換えます。

もしも 条件は、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. シェル スクリプトを実行して、スクリプト内で指定した開いているポートのチェックを開始します。

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

80ポートが開いているかどうかを確認します
80ポートが開いているかどうかを確認します

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

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

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

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

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

PowerShell の起動
PowerShell の起動

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

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<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. 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) ことを示しています。

PowerShell スクリプトを使用して開いているポートを確認する
PowerShell スクリプトを使用して開いているポートを確認する

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

./Test-Port.ps1 `
    -ComputerName adamtheautomator.com,localhost,8.8.8.8 `
    -Port 22,80,443,53
PowerShell スクリプトを使用して、複数のターゲットで開いているポートを確認する
PowerShell スクリプトを使用して、複数のターゲットで開いているポートを確認する

結論

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

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

The post Linux でポートが開いているかどうかを確認するすべての方法 appeared first on Gamingsym Japan.