ネットワーク セキュリティを強化する方法をお探しですか?プロのように Linux ポート スキャンを実行する方法を学びませんか?
このチュートリアルでは、最も一般的なツールとテクニックのいくつかについて学び、ポート スキャンに関連する潜在的なリスクとメリットを予測します。
有望に聞こえますか?今すぐポート スキャンを開始して、ネットワークを保護してください!
前提条件
このチュートリアルは実践的なデモンストレーションです。先に進みたい場合は、Linux システムを使用していることを確認してください。このチュートリアルでは Ubuntu 20.04 を使用していますが、最新の Linux ディストリビューションであればどれでも動作します。
Nmap を使用して開いているポートをスキャンしています
ポートをスキャンするにはさまざまな方法がありますが、Nmap はネットワーク検出とセキュリティ監査のための優れたツールです。 Nmap を使用すると、パケットを送信して応答を分析することで、コンピューター ネットワーク上のホストとサービスを見つけることができます。
Nmap は無料で利用でき、Windows、Linux、および OS X と互換性があります。
ポート スキャンでは、開いているポートについてサーバーまたはホストをプローブできます。これは、さまざまな理由で役立ちます。
- ホストで実行されているサービスを調べる
- 脆弱性の発見
- システムを列挙する。
ただし、Nmap を利用する前に、まずマシンに Nmap をインストールする必要があります:
1. 以下の apt update コマンドを実行して、システム パッケージ インデックスを更新します。
apt update -y

2. 次に、次の apt install コマンドを実行して Nmap をインストールします。
apt install nmap -y

3. 以下の nmap –version コマンドを実行して、マシンにインストールされている Nmap のバージョンを確認します。
nmap --version
以下、インストールされている Nmap のバージョンは 7.80 で、これはこの記事の最新リリースです。

4. 次の nmap コマンドを実行して、ターゲットのホスト名または IP アドレス (scanme.nmap.org) をスキャンします。開始するには、最低限のオプションが必要です。
nmap scanme.nmap.org
以下は、スキャンの出力の内訳です。
- ターゲットの IPv4 アドレス – 45.33.32.156 .
- ターゲットの IPv6 アドレス (利用可能な場合) – 2600:3c01::f03c:91ff .
- 逆引き DNS 名 (利用可能な場合)
各ポートとそのステータスを出力で確認することもできます:
- 開く – ポートが開いていて、着信接続をリッスンしていることを示します。
- 閉店 – ポートが閉じられており、着信接続をリッスンしていないことを示します。
- フィルタ済み – ポートがフィルタリングされていることを示し、Nmap はポートが開いているか閉じているかを判断できません。 Nmap はプローブをポートに送信しますが、応答がありません。

特定のポートのスキャン
Nmap はバックグラウンドで多くのことを行い、各ポートのステータスを確認しようとします。 -p
のように、より詳細に制御するための CLI オプションを追加することで、スキャンをさらにカスタマイズできます。 オプション。このオプションを使用すると、スキャンするポートを指定できます。
1. 次のコマンドを実行して、ターゲット ホスト名 (scanme.nmap.org) のポート 80 をスキャンします。このコマンドは、ターゲット ホストのポート 80 が開いているか閉じているかを知らせます。
nmap -p 80 scanme.nmap.org
以下では、ポート 80 が開いていることがわかります。この状態は、Web サーバーがポート 80 で実行されていることを示しています。

2. 次に、次のコマンドを実行して、Google のパブリック DNS サーバー (8.8.8.8 および 8.8.4.4) を使用して、ホスト名 (scanme.nmap.org) のポート 80 をスキャンします。
–dns-servers オプションを使用すると、スキャンに使用する DNS サーバーを指定できます。このオプションは、別のネットワーク上のホストをスキャンする場合に役立ちます。 -v フラグを使用すると、スキャンに関する詳細情報が得られます。
nmap --dns-servers -p 80 8.8.8.8,8.8.4.4 -v scanme.nmap.org
以下で、Nmap が Google Public DNS サーバーを使用してホスト名を解決し、スキャンが成功したことを確認できます。

3. 最後に、次のコマンドを実行して、ステップ 1 と同様にホスト名 (scanme.nmap.org) のポート 80 をスキャンします。ただし今回は、-d オプションを追加して、デバッグ レベルを 3 に上げます。このオプションは、Nmap に関する問題のトラブルシューティングに役立ちます。
-d オプションは、整数 (0 から 9 の間) を引数として取ります。数値が大きいほど、より多くのデバッグ出力が表示されます。
レベル 9 は非常に詳細な出力用です。これは、Nmap に取り組んでいる開発者に役立ちます。
nmap -d 3 -p 80 scanme.nmap.org

ポートのスキャン Netcat (Ncat) の使用
ネットキャット (nc
) は、ネットワーク探索、セキュリティ監査、侵入テスト用のコマンドライン ツールです。 Netcat を使用して、単純な TCP および UDP 接続と、より複雑な SOCKS および HTTP プロキシを作成できます。ただし、このチュートリアルでは、Netcat を使用してリモート システムの開いているポートをスキャンします。
1. 以下の nc コマンドを実行して、159.89.176.25 のポート 20 ~ 1000 からデータ (-z) を送信せずに開いているポートをスキャンします。 -v オプションは、スキャン中に何が起こっているかを確認できるように、Netcat に詳細を伝えるように指示します。
nc -z -v 159.89.176.25 20-1000
ポートの範囲は、必要に応じて増減できます。ただし、ポート 20 ~ 1000 は、一般的に使用されるさまざまなポートをカバーしています。
以下の出力は、どのポートが開いているかを示しており、それらの接続ステータスは次のとおりです:
- 接続が拒否されました – 接続が対応するポートによって拒否されたことを示します。これはおそらく、そのポートで実行されているサービスが不足しているためです — ポートが閉じられています.
- 成功! – 接続が成功したことを示します — ポートが開いています。
リモート システムで開かれているポート 22 (SSH) とは別に、他の多くのメッセージも表示されるため、煩わしい場合があります。したがって、次のステップにジャンプして、出力をフィルタリングしてください。

2. 以下の grep コマンドを実行して、159.89.176.25 のポート 20 から 100 をスキャンし、各スキャン結果から単語が成功した開いているポートのみを表示します。
2>&1 の部分は、stderr (ファイル記述子 2) を stdout (ファイル記述子 1) にリダイレクトするようにシェルに指示するため、エラー メッセージがある場合は、出力にエラー メッセージが表示されます。
nc -z -v 159.89.176.25 20-100 2>&1 | grep succeeded
以下に示すように、ポート 22 のみが開いており、これにも成功メッセージがあります。

3. 最後に、ステップ 2 と同じコマンドを実行します。ただし、今回は、以下に示すように、-u オプションを追加して UDP ポートをスキャンします。
nc -z -v -u 159.89.176.25 20-100 2>&1 | grep succeeded
UDP をスキャンする場合、TCP ポートよりもスキャンに時間がかかることに注意してください:
- TCP スキャンは、ターゲット ホストとの接続の確立を試行し、65,535 個のポートすべてをスキャンして開いているポートを確認します。
- UDP スキャンは接続を確立しようとはしませんが、ターゲット ホストの各ポートに UDP パケットを送信して、どのポートが開いているかを確認します。 UDP スキャンは、パケットを送信してエラー処理と 3 ウェイ ハンドシェイクを完了するため、TCP スキャンよりも低くなります。
以下では、リモート システムで UDP サービスが実行されていないため、出力が空白になっていることがわかります。

Bash スクリプトを使用してポートが開いているかどうかをテストする
これまで、Netcat と Nmap を使用して、システムで開いているポートをスキャンする方法を見てきました。これらのツールは便利ですが、ポート スキャンのタスクを自動化する場合は信頼できません。
たとえば、1000 台のホストで開いているポートをスキャンすることを計画しているとします。その場合、ポート スキャンを手動で行うのは面倒で、完了するまでに長い時間がかかります。しかし、Linux でポート スキャン タスクを自動化するにはどうすればよいでしょうか。 Bash スクリプトを作成すれば、うまくいきます。
ポート スキャンを自動化する Bash スクリプトを作成するには:
1. お気に入りのテキスト エディタで新しいファイルを開きます。ファイルには好きな名前を付けますが、このチュートリアルではports.shとします。
nano ports.sh
2. 次のコードを ports.sh に追加します。 ただし、SERVER と PORT の値は、スキャンする独自の IP アドレスまたはホスト名とポートに置き換えてください。
値を変更したら、変更を保存してエディターを閉じます。
# Defines the server you want to scan.
SERVER=adamtheautomator.com
# Defines the port to scan.
PORT=443
# Runs the nmap command and assigns the output to the state variable.
# The grep command filters and displays the output of the nmap command
# with the lines containing the "open" keyword.
state=`nmap -p $PORT $SERVER | grep "$PORT" | grep open`
# Checks if the state variable is blank (port is closed).
if [ -z "$state" ]; then
# Displays a message if the connection fails.
echo "Connection to $SERVER on port $PORT has failed"
else
# Displays a message if the connection succeeded.
echo "Connection to $SERVER on port $PORT was successful"
# Exits the script with an exit code of 1
# to determine if the script was successful or not.
exit 1
fi # Ends the if statement
3. 最後に、以下の bash コマンドを実行して、ports.sh スクリプトを実行します。
bash ports.sh
すべてがうまくいけば、adamtheautomator.com で 443 ポートが開いていることを示す次の出力が表示されます。

結論
このチュートリアルでは、Netcat と Nmap を使用してシステムで開いているポートをスキャンする方法を学習しました。これらのツールとは別に、ポート スキャンを自動化する Bash スクリプトを作成したので、プレート上で他のタスクを実行できます。
この時点で、これらのツールを使用してシステム上の開いているポートをスキャンする方法を十分に理解しており、ネットワークを安全に保つことができます.しかし、ポート スキャン タスクをさらに自動化するには、cron ジョブを作成して Bash スクリプトの実行をスケジュールしてみませんか?