多くの意欲的なシステム管理者にとって、ネットワーキングは広大で恐ろしいトピックです。それらを把握するために、学習する多くのレイヤー、プロトコル、インターフェース、および多数のリソースとユーティリティがあります。
ポートは、TCP/IPおよびUDPネットワーキングの論理通信エンドポイントです。 Webサーバー、アプリケーションサーバー、ファイルサーバーなどの多くのサービスは、単一のIPアドレスで動作します。これらの各サービスは、通信するために特定のポートをリッスンして対話する必要があります。コンピューターに接続するときは、IPアドレスとポートを介して接続します。
場合によっては、使用しているプログラムが自動的にポートを選択します。たとえば、https://www.fosslinux.comにアクセスすると、安全なWebトラフィックの標準ポートであるポート443でfosslinux.comサーバーに接続します。これがデフォルトであるため、ブラウザが自動的にポートを追加します。
このガイドでは、ポートについて詳しく学習します。ポートの状態を取得するのに役立つさまざまなプログラムを見ていきます。これらには以下が含まれます:
- Nmap
- Zenmap
- Netcat
- netstat
- ユニコーンスキャン
- Bash Pseudo Unitを使用して、開いているポートを検索できます
- ssコマンドの使用
netstatソフトウェアは、開いているポートを見つけるために使用され、Nmapプログラムは、ネットワーク上のマシンのポートの状態に関する情報を取得するために使用されます。完了すると、人気のあるポートを見つけたり、開いているポートをシステムで検索したりできるようになります。
ポートについて知る
OSIネットワークモデルにはいくつかの層があります。トランスポート層は、サービスとアプリケーション間の通信を処理するプロトコルスタックの一部です。後者は、ポートが接続されるプライマリレイヤーです。
ポート構成を理解するには、いくつかの用語情報が必要です。次に説明する内容を理解するのに役立つさまざまな単語を次に示します。
ポート:オペレーティングシステム内に導入されたアドレス可能なネットワークの場所は、さまざまなアプリケーションまたはサービスを対象としたトラフィックの差別化に役立ちます。
インターネットソケット:IPアドレスと関連するポート番号、および使用するデータ転送プロトコルを定義するファイル記述子。
バインディング:アプリケーションまたはサービスがインターネットソケットを使用してデータの入力と出力を管理する場合。
リッスン:サービスがポート/プロトコル/ IPアドレスの組み合わせにバインドしてクライアントの要求を待機する場合、そのポートで「リッスン」していると見なされます。
クライアントがアクティブにリッスンしているのと同じポートを使用してメッセージを受信した後、必要に応じてクライアントとのリンクを確立します。インターネットソケットは特定のクライアントIPアドレスに関連付けられているため、サーバーは複数のクライアントからの要求を同時にリッスンして処理できます。
ポートスキャンは、一連のシーケンシャルポートに接続して、使用可能なポートと、その背後で実行されているサービスとオペレーティングシステムを学習しようとしています。
頻繁に使用されるポートの特定
各ポートには1〜65535の範囲の番号が割り当てられています。
1024未満のいくつかのポートは、LinuxおよびUnixライクなオペレーティングシステムがネットワーク機能に不可欠であると見なすリソースに関連付けられているため、それらにサービスを割り当てるにはroot権限が必要です。
「登録済み」ポートとは、1024〜49151の番号のポートです。これは、IANA(Internet Assigned Numbers Authority)にリクエストを送信することにより、特定のサービスに対して非常に緩い意味で「予約」できることを意味します。これらは厳密には実装されていませんが、特定のポートで動作しているサービスに関する洞察を提供できます。
49152〜65535のポートは登録できず、個人使用をお勧めします。開いているポートの数が多いため、特定のポートに接続するほとんどのサービスについて心配する必要はありません。
ただし、広く使用されているため、特定のポートは学習する価値があります。以下は完全にはほど遠いリストです:
- 20:FTPの詳細
- 22:SSH
- 23:Telnet
- 21:FTP制御ポート
- 25:SMTP(Simple Mail Transfer Protocol)
- 80:HTTP –暗号化されていないWebトラフィック
- 443:HTTPS –安全なネットワークトラフィック
- 143:IMAPメールポート
- 161:SNMP
- 194:IRC
- 389:LDAP
- 631:CUPS印刷デーモンポート
- 666:DOOM –このレガシーゲームには独自のポートがあります
- 587:SMTP –メッセージ送信
これらは、ポートに接続されることが多い施設のほんの一部です。構成しようとしているアプリケーションに必要なポートは、それぞれのドキュメントに記載されている必要があります。
ほとんどのサービスは、通常以外のポートを使用するように構成できますが、クライアントとサーバーの両方が非標準のポートを使用していることを確認する必要があります。
一般的に使用されるいくつかのポートのリストを含むファイルは、/ etc/servicesと呼ばれます。
tuts@fosslinux:~$ less /etc/services

または
tuts@fosslinux:~$ cat /etc/services

人気のあるポートのリストとそれに付随するサービスを提供します:
これにより、設定に応じて異なるページが表示される場合があります。エントリの次のページを表示するには、スペースキーを押すか、Qキーを押してプロンプトに戻ります。
ポートスキャン
PCまたはサーバーで開いているポートをチェックする方法は、ポートスキャンと呼ばれます。ゲーマーやハッカーは、ポートスキャナーを使用して、開いているポートや指紋サービスを検索します。ポートは、その状態に応じて、開いたり、フィルタリングされたり、閉じられたり、フィルタリングされなかったりする可能性があります。特定のポートは、アプリケーションが接続またはパケットについて特定のポートをアクティブにリッスンしている可能性が低い場合に使用できます/
ネットワーク接続の問題のトラブルシューティングやファイアウォールの構成時に最初に確認することの1つは、デバイスで使用可能なポートです。
この記事では、Linuxシステムのどのポートが外部で利用可能かを判断するためのいくつかの方法について説明します。
開いているポートとは正確には何ですか?
リスニングポートは、ネットワークポートでリッスンできます。 ss、netstat、lsofなどのコマンドを使用してシステムのリスニングポートのリストを取得し、ネットワークスタックにクエリを実行できます。
ファイアウォールを使用する場合、各リスニングポートは開いたり閉じたり(フィルタリング)できます。
ネットワークポートは、リモートロケーションからの着信パケットを受け入れる場合、オープンポートと呼ばれます。たとえば、Webサーバーがポート80と443をリッスンし、それらのポートがファイアウォールで使用可能な場合、ブロックされたIPを除くすべてのユーザーが、自分のブラウザーを使用してWebサーバーでホストされているWebサイトにアクセスできます。この状況では、ポート80と443の両方が開いています。
オープンポートは、攻撃者がそれらを使用して脆弱性をハッキングしたり、他の種類の攻撃を実行したりする可能性があるため、セキュリティリスクになる可能性があります。他のすべてのポートを閉じ、アプリケーションの機能に必要なポートのみを公開する必要があります。
TCP / IPインターネットプロトコルでは、TCP(伝送制御プロトコル)とUDP(ユニフォームデータグラムプロトコル)(ユーザーデータグラムプロトコル)の2種類のポートを探す必要があります。 TCPとUDPには、それぞれスキャン方法があります。この投稿では、Linux環境でポートスキャンを実行する方法を説明しますが、最初に、ポートスキャンがどのように機能するかを確認します。ポートスキャンは多くの国で違法であることに注意することが重要です。そのため、ターゲットをスキャンする前に権限を再確認してください。
TCPのスキャン
TCPは接続の状態を追跡するため、ステートフルプロトコルです。 TCP接続には、サーバーソケットとクライアント側ソケットの3方向ハンドシェイクが必要です。クライアントはリッスンしているサーバーソケットにSYNを送信し、サーバーはSYN-ACKで応答します。次に、クライアントはACKを送信して、接続ハンドシェイクを完了します。
スキャナーはSYNパケットをサーバーに送信して、開いているTCPポートを検索します。 SYN-ACKが返された場合、ポートは使用可能です。サーバーがハンドシェイクを完了せず、RSTで応答した場合、ポートは閉じられます。
UDPによるスキャン
一方、UDPはステートレスプロトコルであり、接続の状態を追跡しません。また、3ウェイハンドシェイクの使用も除外されます。
UDPスキャナーは、UDPパケットをポートに送信して検索します。 ICMPパケットが生成され、そのポートが閉じられている場合は発信元に送り返されます。これが発生しない場合、ポートは開いています。
ファイアウォールはICMPパケットを失うため、UDPポートスキャンは常に不正確であり、ポートスキャナーの誤検知が発生します。
ポートのスキャナー
ポートスキャン機能について見てきたので、さまざまなポートスキャナーとその機能に移ることができます。これらには以下が含まれます:
Nmap
Nmapは、最も広く使用されている無料のネットワーク検出ツールの1つとして人気が高まっているネットワークマッパーです。 Nmapは、ネットワーク管理者がネットワークをマッピングするときに使用する最も人気のあるツールの1つになりました。このソフトウェアを使用して、ネットワーク上のライブホストの検索、ポートスキャン、pingスイープ、OS検出、バージョン検出などを実行できます。
最近のいくつかのサイバー攻撃は、Nmapのようなネットワーク監査ツールの重要性を再強調しています。たとえば、アナリストによると、システム管理者が接続されたデバイスを追跡していた場合、それらは以前に検出された可能性があります。このチュートリアルでは、Nmapとは何か、Nmapで何ができるか、最も一般的なコマンドの使用方法について説明します。
Nmapは、単一のホストと広大なネットワークの両方をスキャンできるネットワークスキャンツールです。また、侵入テストやコンプライアンス監査にも使用されます。
ポートスキャンに関しては、Nmapが開いている場合は、最初に選択する必要があります。 Nmapは、ポートスキャンに加えて、Macアドレス、OSフォーム、カーネルバージョンなどを検出できます。
Nmapは単なるネットワークスキャンツールではありません。また、IPパケットを使用して、接続されているすべてのデバイスを特定し、実行中のサービスとオペレーティングシステムに関する情報を提供する役割も果たします。
このソフトウェアは、Linux、Gentoo、FreeBSDなどのさまざまなオペレーティングシステムで利用できます。多くの場合、コマンドラインインターフェイスを介して使用されます。ただし、GUIフロントエンドも使用できます。その成功は、活気に満ちたアクティブなユーザーサポートコミュニティによっても支えられています。
Nmapは大規模ネットワーク向けに設計されており、接続されている何千ものデバイスを検索できます。一方、中小企業は近年ますますNmapを使用しています。モノのインターネットの台頭により、これらの企業のネットワークはより複雑になり、その結果、セキュリティを確保することがより困難になっています。
その結果、いくつかのWebサイト監視ツールがNmapを使用してWebサーバーとIoTデバイス間のトラフィックを検査するようになりました。 MiraiなどのIoTボットネットの最近の出現は、特にUPnPプロトコルを介して接続されたデバイスに問い合わせ、潜在的に悪意のあるマシンを強調表示する機能のために、Nmapへの関心を呼び起こしました。
これまで、Nmapは利用可能な最も用途が広く詳細なポートスキャナーでした。ポートスキャンからオペレーティングシステムのフィンガープリントや脆弱性スキャンまで、あらゆるものが可能です。 NmapのGUIはZenmapと呼ばれ、CLIとGUIインターフェイスの両方を備えています。高速で正確なスキャンを実行するための幅広いオプションがあります。 LinuxシステムでNmapを設定する方法は次のとおりです。
Nmapがポートスキャンの実行に役立つさまざまな方法があります。最も広く使用されているバリエーションは次のとおりです。
- #sSTCPSYNスキャン
- #sTTCP接続スキャン
- #sUUDPスキャン
- #sYSCTPINITスキャン
- #sN TCP NULL
これらのタイプのスキャンの主な違いは、TCPまたはUDPポートを保護するかどうか、およびTCPリンクを実行するかどうかです。主な違いは次のとおりです。
sS TCP SYNスキャンは、これらのスキャンの中で最も基本的なものであり、ほとんどのユーザーに必要なすべての情報を提供します。毎秒数千のポートがスキャンされ、TCPリンクを完了しないため、疑惑は生じません。
各ホストにアクティブにクエリを実行して応答を要求するTCPConnectスキャンは、この形式のスキャンの主な代替手段です。このスキャンはSYNスキャンよりも時間がかかりますが、より正確な結果を提供できます。
UDPスキャンは、UDPパケットを使用してDNS、SNMP、およびDHCPポートをスキャンすることを除いて、TCP接続スキャンと同様に動作します。このタイプのスキャンは、ハッカーが最も一般的に標的とするポートであるため、脆弱性をチェックするのに役立ちます。
SCTP INITスキャンは、SS7とSIGTRANの2つの異なるサービスを調べます。このスキャンはSCTP手順全体を完了しないため、外部ネットワークを検索する際の疑惑を防ぐこともできます。
TOP NULLスキャンは、もう1つの独創的なスキャンプロセスです。 TCPフレームワークの欠陥を悪用して、ポートを明示的に照会しなくてもポートのステータスを公開できるため、ファイアウォールがポートを保護している場合でも、ポートのステータスを確認できます。
この記事では、次のことについて説明します。
- Nmapを設定するにはどうすればよいですか?
- ローカルおよびリモートコンピューターで基本的なポートスキャンを実行する方法
- TCPおよびUDPポートを検索するための最良の方法は何ですか?
sudo apt-get update sudo apt-get upgrade -y sudo apt-get install nmap -y
ネットワークからのTCP接続をリッスンしているポートは、コンソールから次のコマンドを発行することで判別できます。
tuts@fosslinux:~$ sudo nmap -sT -p- 10.10.4.3

-sTオプションはNmapにTCPポートを検索するように指示し、-p-オプションはすべての65535ポートをスキャンするように指示します。 -p-オプションが指定されていない場合、Nmapは1000個の最も一般的なポートのみをチェックします。
パフォーマンスによると、ターゲットマシンではポート22、80、および8069のみが開いています。
-sTの代わりに、-sUを使用して次のようにUDPポートを検索します。
tuts@fosslinux:~$ sudo nmap -sU -p- 10.10.4.3
次に、Nmapを使用してサーバー(hackme.org)で開いているポートを検索し、それらのポートで利用可能なサービスを一覧表示します。コマンドプロンプトにnmapとサーバーアドレスを入力します。
tuts@fosslinux:~$ nmap hackme.org

root権限が必要なため、sudoで-sUオプションを使用してUDPポートを検索します。
tuts@fosslinux:~$ sudo nmap -sU hackme.org

Nmapには、次のような他の多くの機能もあります。
- -p-:65535ポートのリスト全体をスキャンします
- -sT:これはTCPの接続スキャンです
- -O:実行中のオペレーティングシステムをスキャンします
- -v:詳細スキャン
- -A:積極的なスキャン、事実上すべてをスキャンする
- -T [1-5]:スキャン速度を設定するには
- -Pn:サーバーがpingをブロックするたびに発生します
ゼンマップ
Zenmapは、コマンドを覚える必要がないNmapへのクリックキディインターフェイスです。設定するには、次のコマンドを実行してzenmapをインストールします。
tuts@fosslinux:~$ sudo apt-get install -y zenmap
または、
mkdir -p ~/Downloads/zenmap cd ~/Downloads/zenmap wget http://old-releases.ubuntu.com/ubuntu/pool/universe/p/pygtk/python-gtk2_2.24.0-6_amd64.deb wget http://old-releases.ubuntu.com/ubuntu/pool/universe/n/nmap/zenmap_7.80+dfsg1-1build1_all.deb sudo apt install ./*.deb

サーバーのアドレスを入力し、利用可能な検索オプションから選択してスキャンします。

Netcat
ncと呼ばれるNetcatは、コマンドラインツールです。 TCPまたはUDPプロトコルを使用して、ネットワーク接続を介してデータを読み書きします。また、ポートを検索することもできる生のTCPおよびUDPポートライターでもあります。
Netcatは、単一のポートまたはいくつかのポートを検索できます。
リンクスキャンを使用するため、ネットワークマッパーよりも低速です。設定するには、フォーム
tuts@fosslinux:~$ sudo apt install netcat-traditional -y
次のように記述して、ポートが使用可能かどうかを確認します。
tuts@fosslinux:~$ nc -z -v hackme.org 80

次の検索語を入力して、ポートのリストを検索します。
tuts@fosslinux:~$ nc -z -nv 127.0.0.1 50-80

たとえば、IPアドレス10.10.4.3が20〜80の範囲にあるリモートマシンで開いているTCPポートを検索するには、次のコマンドを使用します。
tuts@fosslinux:~$ nc -z -v 10.10.4.3 50-80
-zオプションは、開いているポートのみを検索し、データを送信しないようにncに指示しますが、-vオプションは、より正確な詳細を提供します。
最終製品は次のようになります。
開いているポートのある行を画面に印刷する場合は、grepコマンドを使用して結果をフィルタリングします。
tuts@fosslinux:~$ nc -z -v 10.10.4.3 50-80 2>&1 | grep succeeded
-uをncコマンドに渡して、UDPポートを検索します。
tuts@fosslinux:~$ nc -z -v -u 10.10.4.3 50-80 2>&1 | grep succeeded
lsofコマンド
Linuxで開いているファイルを一覧表示するlsofコマンドは、開いているポートをクエリするための最後のツールです。 Unix / Linuxはファイルであるため、開いているファイルはストリームまたはネットワークファイルの場合があります。
-iオプションを使用して、すべてのインターネットおよびネットワークデータを一覧表示します。このコマンドは、サービス名と数値ポートの組み合わせを表示します。
tuts@fosslinux:~$ sudo lsof -i

この形式でlsofを実行して、特定のポートでリッスンしているアプリケーションを確認するには、次のコマンドを実行します。
tuts@fosslinux:~$ sudo lsof -i:80

コマンドnetstatの使用
Netstatは、広く使用されているLinuxネットワークサブシステムに関する情報を照会するためのツールです。使用可能なすべてのポートを次の形式で印刷するために使用できます。
tuts@fosslinux:~$ sudo netstat -ltup

-lフラグは、netstatに、すべてのリスニングソケット、-tすべてのTCP接続、-uすべてのUDP接続、および-pポートでリッスンしているすべてのアプリケーション/プログラム名を出力するように指示します。
-nフラグを追加して、サービス名の代わりに数値を出力します。
tuts@fosslinux:~$ sudo netstat -lntup

grepコマンドを使用して、特定のポートでリッスンしているアプリケーションを確認することもできます。
tuts@fosslinux:~$ sudo netstat -lntup | grep "apache2."

または、示されているように、ポートを定義して、それに接続されているアプリケーションを見つけることができます。
tuts@fosslinux:~$ sudo netstat -lntup | grep ":80"

ユニコーンスキャン
Unicornscanは、セキュリティ研究者向けに設計された強力で高速なポートスキャナーです。ネットワークマッパーとは異なり、ユーザーランド分散TCP/IPスタックを使用します。後者には、Nmapにはないいくつかの機能があります。これらのいくつかを以下に示します。
TCPフラグのバリエーションの種類を使用して、TCPの非同期ステートレススキャンが可能です。
TCPバナーグラブは、応答を引き出すのに十分な署名を送信する非同期プロトコル固有の非同期およびステートレスUDPスキャンです。応答を評価することにより、アクティブおよびパッシブのリモートOS、プログラム、およびコンポーネントの認識が可能になります。
- PCAPファイルのフィルタリングと記録
- リレーショナルデータベースからのパフォーマンス
- カスタムモジュールのサポート
- カスタマイズ可能なデータセットのビュー
検索ボックスに「unicornscan」と入力して、ターミナルで次のコマンドを実行してUnicornscanをインストールします。
tuts@fosslinux:~$ sudo apt-get install unicornscan -y
スキャンを実行するには、次のように記述します。
tuts@fosslinux:~$ sudo us 127.0.0.1
Bash Pseudo Unitを使用して、開いているポートを検索できます
ポートが開いているか閉じているかを確認する場合、Bashシェル/ dev /tcp/または/dev/udp/疑似デバイスは非常に便利です。
コマンドが/dev/ $ PROTOCOL / $ HOST / $ IP疑似デバイスで実行されると、Bashは指定されたポートで指定されたホストへのTCPまたはUDPリンクを開きます。
以下のif…elseステートメントは、kernel.orgのポート443が開いているかどうかを確認します。コマンド:
if timeout 5 bash -c '</dev/tcp/kernel.org/443 &>/dev/null' then echo "Port is open." else echo "Port is closed." fi
疑似デバイスを使用してポートに接続するときのデフォルトのタイムアウトは非常に長いため、timeoutコマンドを使用して、5秒後にテストコマンドを破棄しています。 kernel.orgポート443へのリンクが作成されると、testコマンドは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
ssコマンドの使用
ssコマンドは、ソケット情報を表示するためのもう1つの貴重なツールです。そのパフォーマンスはnetstatと非常によく似ています。次のコマンドは、ポートをリッスンしているすべてのTCPおよびUDP接続を数値として表示します。
tuts@fosslinux:~$ sudo ss -lntu

結論
ゲーマー、DevOp、ハッカーのいずれであっても、ポートスキャナーが便利です。これらのスキャナー間には適切なコントラストはありません。それらのどれも完璧ではなく、それぞれに独自の長所と短所があります。あなたのニーズはこれとあなたがそれらをどのように使いたいかを強く決定します。
Pythonソケットモジュール、curl、telnet、wgetなどの他のユーティリティやメソッドを使用して、開いているポートを検索することもできます。また、特定のポートに接続されているプロセスを特定する方法も示しました。