
ネットワーク接続の問題のトラブルシューティングを行う場合でも、ファイアウォールを構成する場合でも、最初に確認することの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
。
ご質問やご意見がございましたら、下にコメントを残してください。