ネットワーク接続の問題のトラブルシューティングを行う場合でも、ファイアウォールを構成する場合でも、最初に確認することの1つは、システムで実際に開かれているポートです。
この記事では、Linuxシステムで外部に開かれているポートを見つけるためのいくつかのアプローチについて説明します。
リスニングポートは、アプリケーションがリッスンするネットワークポートです。 ssなどのコマンドを使用してネットワークスタックにクエリを実行すると、システムのリスニングポートのリストを取得できます。 、netstat またはlsof 。各リスニングポートは、ファイアウォールを使用して開く(フィルタリングする)ことができます。
一般的に、開いているポートは、離れた場所からの着信パケットを受け入れるネットワークポートです。
たとえば、ポート80でリッスンするWebサーバーを実行している場合 および443 これらのポートはファイアウォールで開いているため、誰でも(ブロックされたIPを除く)、自分のブラウザを使用してWebサーバーでホストされているWebサイトにアクセスできます。この場合、両方の80 および443 開いているポートです。
攻撃者は各オープンポートを使用して脆弱性を悪用したり、その他の種類の攻撃を実行したりする可能性があるため、オープンポートはセキュリティリスクをもたらす可能性があります。アプリケーションの機能に必要なポートのみを公開し、他のすべてのポートを閉じる必要があります。
nmapで開いているポートを確認します #
Nmapは、単一のホストと大規模なネットワークをスキャンできる強力なネットワークスキャンツールです。これは主にセキュリティ監査と侵入テストに使用されます。
可能な場合は、nmap ポートスキャンに関しては、最初のツールになるはずです。ポートスキャンに加えて、nmap Macアドレス、OSタイプ、カーネルバージョンなども検出できます。
コンソールから発行される次のコマンドは、ネットワークからのTCP接続をリッスンしているポートを判別します。
sudo nmap -sT -p- 10.10.8.8
-sT nmapに通知します TCPポートと-p-をスキャンします すべての65535ポートをスキャンします。 -p-の場合 nmapは使用されません 最も人気のある1000個のポートのみをスキャンします。
Starting Nmap 7.60 ( https://nmap.org ) at 2019-07-09 23:10 CEST
Nmap scan report for 10.10.8.8
Host is up (0.0012s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
MAC Address: 08:00:27:05:49:23 (Oracle VirtualBox virtual NIC)
Nmap done: 1 IP address (1 host up) scanned in 0.41 seconds
上記の出力は、ポート22のみを示しています 、80 および8069 ターゲットシステムで開かれます。
UDPポートをスキャンするには、-sUを使用します -sTの代わりに :
sudo nmap -sU -p- 10.10.8.8 詳細については、nmapのmanページにアクセスし、このツールの他のすべての強力なオプションについてお読みください。
netcatで開いているポートを確認する #
Netcat(またはnc )は、TCPまたはUDPプロトコルを使用して、ネットワーク接続間でデータを読み書きできるコマンドラインツールです。
netcatを使用 単一のポートまたはポート範囲をスキャンできます。
たとえば、IPアドレスが10.10.8.8のリモートマシンで開いているTCPポートをスキャンするには 20-80の範囲 次のコマンドを使用します:
nc -z -v 10.10.8.8 20-80
-z オプションはncに指示します データと-vを送信せずに、開いているポートのみをスキャンします より詳細な情報のためです。
出力は次のようになります:
nc: connect to 10.10.8.8 port 20 (tcp) failed: Connection refused
nc: connect to 10.10.8.8 port 21 (tcp) failed: Connection refused
Connection to 10.10.8.8 22 port [tcp/ssh] succeeded!
...
Connection to 10.10.8.8 80 port [tcp/http] succeeded!
開いているポートの行のみを画面に印刷する場合は、grepで結果をフィルタリングします。 コマンド。
nc -z -v 10.10.8.8 20-80 2>&1 | grep succeeded Connection to 10.10.8.8 22 port [tcp/ssh] succeeded!
Connection to 10.10.8.8 80 port [tcp/http] succeeded!
UDPポートをスキャンするには、-uを渡します ncのオプション コマンド:
nc -z -v -u 10.10.8.8 20-80 2>&1 | grep succeeded 2>&1 構成は、標準エラーを標準出力にリダイレクトします。 Bash疑似デバイスを使用して開いているポートを確認する#
特定のポートが開いているか閉じているかを確認する別の方法は、Bashシェル/dev/tcp/..を使用することです。 または/dev/udp/.. 疑似デバイス。
/dev/$PROTOCOL/$HOST/$IPでコマンドを実行する場合 疑似デバイスの場合、Bashは指定されたポートで指定されたホストへのTCPまたはUDP接続を開きます。
次のif..elsestatementは、ポート443かどうかをチェックします kernel.orgで 開いています:
if timeout 5 bash -c '</dev/tcp/kernel.org/443 &>/dev/null'
then
echo "Port is open"
else
echo "Port is closed"
fi
Port is open
上記のコードはどのように機能しますか?
疑似デバイスを使用してポートに接続する場合、デフォルトのタイムアウトは非常に大きいため、timeoutを使用しています。 5秒後にテストコマンドを強制終了するコマンド。 kernel.orgへの接続が確立されている場合 ポート443 テストコマンドはtrueを返します。
ポート範囲を確認するには、forループを使用します。
for PORT in {20..80}; do
timeout 1 bash -c "</dev/tcp/10.10.8.8/$PORT &>/dev/null" && echo "port $PORT is open"
done
出力は次のようになります:
port 22 is open
port 80 is open
結論#
開いているポートをスキャンするために使用できるいくつかのツールを示しました。開いているポートをチェックする他のユーティリティやメソッドもあります。たとえば、Pythonのsocketを使用できます。 モジュール、curl 、telnet またはwget 。
ご質問やご意見がございましたら、下にコメントを残してください。