【network】portcanningで自サーバーの許可ポートを確認
はじめに
ポートスキャンを普段扱っている自分のPCに対して行い、どのポートが空いていて、どう使われているかを知るきっかけにしたいと思ったため、その検証を行います。
対象の方
パソコンのルーター、グローバルIP、プロバイダなど、network関連を学び始めた方。
「もっとネットワーク知りたい!」という方。
環境
AWS EC2
OS : AmazonLinux2023
macbookpro2019
OS : Sonoma ver 14.4.1
内容
1 ポートスキャンとは?
1つのIPに対し、0 ~ 65535 までのポートに縦断的にパケットを送り、返ってくるかどうかでそのポートが開いているかどうか、確認を行う。例としてpingを全ポートに送っているようなもの、結果は
return boolean(True or false) => if(true)echo json(付加情報) else break;
のような形をループして返ってくる。
PORT STATE SERVICE
5555/tcp open xxxxxsql
8000/tcp open yyyyyyyy
19999/tcp open zzzzzzzz
55555/tcp filtered unknown
ここで、chatGPTへ質問しました。
portscanはどう行いますか。1つのIPに対して、縦断的にall portを、です。
下記の返答です。
chatGPT4 portscanの手順
ポートスキャンを行う際は、セキュリティ上の観点から対象サーバーやネットワークの所有者から明確な許可を得ている必要があります。許可のないポートスキャンは違法とされる場合が多いので注意してください。
ポートスキャンを行うためのツールとして一般的に使用されるのが Nmap (Network Mapper) です。Nmapを使えば、特定のIPに対して全ポートをスキャンすることができます。
以下は、Nmapを使って1つのIPアドレスに対して全ポートをスキャンする方法です。
手順
-
Nmapのインストール
- Linuxでは、以下のコマンドでインストール可能です。
sudo apt install nmap # Debian系(Ubuntuなど) sudo yum install nmap # Red Hat系
- macOSでは、Homebrewを使用してインストールできます。
brew install nmap
- Windowsでは公式サイトからインストーラーをダウンロードしてインストールします。
- Linuxでは、以下のコマンドでインストール可能です。
-
全ポートスキャンコマンド
- ターゲットIPアドレスに対して全ポート(1-65535)をスキャンするには、次のコマンドを実行します。
nmap -p- <ターゲットIP>
-
-p-
オプションは全ポート(1-65535)を指定するオプションです。 - 例えば、ターゲットIPが
192.168.1.1
の場合、以下のように入力します。nmap -p- 192.168.1.1
- ターゲットIPアドレスに対して全ポート(1-65535)をスキャンするには、次のコマンドを実行します。
-
詳細な出力
- より詳細な情報(OSの推定やサービスのバージョン)を得たい場合は、
-A
オプションを追加します。nmap -p- -A 192.168.1.1
- より詳細な情報(OSの推定やサービスのバージョン)を得たい場合は、
-
結果の確認
- スキャン結果が表示され、各ポートのステータス(開いているか閉じているか)、使用されているサービスなどがわかります。
注意事項
ポートスキャンは、セキュリティや診断目的でのみ行い、許可のないシステムに対して行わないようにしましょう。
本題
自分のmacOS、EC2インスタンスのAmazonLinux2023のOS間であれば、許可的に問題はありません。自身のローカルサーバーに対し、portscanをEC2インスタンスから試みましょう。
自身のローカルサーバーに対し、portscanning from My Mac(local server)
macbookpro2019から、ターミナルを立ち上げ、
brew install nmap
から、
nmap -p- 127.0.0.1
で、自身のlocalhostを、FQDNのようなnaming用の文字列で表現されたドメインでなく、数値のIPで指定します。すると、いくつかのポートが利用されていることが確認できます。
この一覧をホームディレクトリへ移動し、リダイレクト(>)を用いて、.txtへ書き出して保存しておきます。
cd
mkdir network
cd network
nmap -p- 127.0.0.1 > portscan_202411101545.txt
ファイル名に、portscan_[timestamp].txtと命名します。意味的に同じファイル名を、複数回取得する場合、この命名が扱いやすそうです。
その後、そのファイルの中身をcatで確認します。cat porまで打ち込んだら、tabキーでその後の入力を補完できます。ただし、そのディレクトリに選択できるporまで前方一致しているファイルがある場合にのみ、です。
cat portscan_202411101545.txt
先ほどのnmapコマンドの結果が保存できました。それでは、今度はEC2インスタンスへ入り、自身のローカルサーバーをportscanしてみましょう。
自身のローカルサーバーに対し、portscanning from EC2instance(remote server)
EC2インスタンスへ、ssmかsshで接続し、下記を実行します。
yum list | grep nmap
yum list でyumを用いてインストールできるパッケージ一覧が表示されます。その一覧を | (パイプ)で、左側のコマンドの標準出力から、右側のコマンドの標準入力へ渡しています。さらに、grep 検索用文字列をパイプの右側で処理させることで、該当する結果だけをfilterし、出力します。つまり、
yum list | grep nmap
nmap.x86_64 3:7.93-4.amzn2023 @amazonlinux
nmap-ncat.x86_64 3:7.93-4.amzn2023 @amazonlinux
で、一覧の中からnmapのfilterで拾えるデータを1行ずつ、拾っています。上記は2行ヒットした結果です。
また、dnfでも同じようにヒットします。
dnf list | grep nmap
nmap.x86_64 3:7.93-4.amzn2023 @amazonlinux
nmap-ncat.x86_64 3:7.93-4.amzn2023 @amazonlinux
--installedを用いると、すでにインストールされているものに対し、dnf listをかけます。
dnf list --installed | grep nmap
上記のコマンドで、すでにnmapがinstallされているか、確認できます。
本当にそのコマンドが合っているか、心配になった場合に--helpオプションが利用できます。
dnf list --help
や、
dnf list installed --help
などが有効です。
では、EC2インスタンスからnmapを利用してみましょう。
ここで、自分のmacのIPはなんでしょうか。
127.0.0.1
となります。これは、今触れている端末から見た、自OSが認識している自身のIPを指します。
「ループバックアドレス」と呼ばれているようです。ownのような再帰的な意味のようです。
なんかかっこいいですね。
localhostと同じ??と考えます。localhostに、127.0.0.1が紐づいています。自身のIPを認識する際には同じです。これは、
https://zenn.dev/
に、複数のIPが紐づいていて、付加分散されていると考えるのが良さそうです。
上記の文字列のFQDN(ドメイン)に、
4つほど、
222.11.11.111
111.22.11.111
111.11.22.111
111.11.11.222
のIPが紐づいていた場合、上記のサイトへアクセスしにきたユーザーを、ロードバランサーなどにより4パターンの経路でアプリを覗きに行くサーバーを建て、負荷分散を行うことができる、といった認識です。(誤っていた場合、ご指摘いただけますと幸いです。)
その文字列のURLと、数値のIPを紐づけるAWSサービスがRoute53になります。
Route53のホストゾーンから、文字列となるURLの一部、ドメインを定義して、IPを紐付けることで、複数のIPをロードバランスするSRVレコードのような利用方法が可能です。
EC2インスタンスで同じものを叩くと、自分のportを確認しに行くため、同じ方法ではscanできません。
自macで下記を叩きましょう。
curl ipinfo.io/ip
curlであるAPIのエンドポイントを叩いています。返ってきたipが、自身のmacのglobalIPです。上記のcurlで、ipinfo.io/ipというエンドポイントに対しリクエストを送り、外から見たIPを教えてくれています。
上記で取得したIPで、EC2インスタンスから自macのIPをportscanしてみましょう。
nmap -p- [curlで取得したIP]
ここで失敗する方もいます。それは、VPNに繋いでいるパターンです。VPNの仕様により異なりますが、筆者が無料で利用しているProtonVPNは、中継用サーバーを接続先に加えたのち、そのサーバーからInternetに繋ぐ仕様のようで、IPが入れ替わった状態になっており、上記のcurl結果がVPN用中継サーバーになっているケースがあります。VPNをoffに設定し、上記curlをもう一度行いましょう。
ちなみに、下記がProtonVPNです。
無料版の説明がFAQにありました。
さあ、先ほどのcurlを叩いてみましょう。
失敗しましたが、その結果が正常だと思われます。しかし、それはなぜでしょう・・。
筆者が予想した原因は下記です。
・softbank光などの光回線を扱うプロバイダの仕様により、中継地点のルーターにACLやproxy的なIP,port制御がかけられていて,macのローカルサーバーまでipへ到達できない。
・icmpのプロトコルを扱うportが、iptablesやファイアウォールで、遮断されている。(filtered)
しかしここで、
nmap -p- 127.0.0.1 > portscan_202411101545.txt
した際に、cat portscan_202411101545.txt で、proxyという文字を見かけました。
proxyで制限かけられているのかな、というところもありますが、今回のnetwork的な検証で、
nmap -p- 127.0.0.1 > portscan_202411101545.txt
で、欲しい情報は取得できました。
「ローカルで許可されているポート一覧」が欲しかったので、一旦上記でOKです。というのも、接続先のURLにより、portをランダムに選択して自PCへ接続している可能性があるため、固定でない、という点を除き、一旦OKという認識です。
しかし、その経路上を本当に通っていて、どの地点で情報が取れなくなっているか、正確な情報が欲しいです。そこで、下記のコマンドを扱います。
traceroute [globalIP]
を利用することで、パケットの送受信が行われている経路を通り、そこを追跡し、経由したルーターからIPを返送するようにリクエストを出し、各ルーターでその制御を行いながら、目的地となるglobalIPへ到達するというコマンドがあります。これを実行してみましょう。
EC2インスタンスから自PCへ向けてのtraceroute [globalIP]で、上記を確認すると、やはりルーターを経由し、プロバイダまでの経路(softbank~の表記を確認)は確認できますが、その先は****という表記になり、確認不可能です。
EC2インスタンスから自PCへ向けてのtraceroute
自PC ****** provider(softbank光) <----- EC2instance
また逆に、自PCからEC2インスタンスまでのtracerouteでも、途中から****という表記になり、確認不可能です。しかし、softbank~の表記確認したため、プロバイダ経由ルーターあたりまでは、traceできています。
自PCからEC2インスタンスまでのtraceroute
自PC -----> provider(softbank光) ****** EC2instance
そこで、tracerouteの仕様を確認しました。
tracerouteはデフォルトで、udpのプロトコル(一方通行の送信用プロトコル。制御のスピードが速いため、通話などの音声を発話する際など、リアルタイム性の高いパケットを扱う際に利用するプロトコル)で送信を行い、ICMPのプロトコル(pingやtracerouteなどのnetwork情報を扱うプロトコル)のエラーメッセージの返答を行う、といった使用で、****が返ってくるあたりで、ICMPは閲覧できないよう暗号化か何かの制御が入り、視認不可になっていると思われます。
****の表示になったあたりで、送信は各ルーターで到達しているが、ICMPの返答が見えなくなる制御が入った、と考えられます。
上記のtracerouteにより、
・softbank光などの光回線を扱うプロバイダの仕様により、中継地点のルーターにACLやproxy的なIP,port制御がかけられていて,macのローカルサーバーまでipへ到達できない。
・icmpのプロトコルを扱うportが、iptablesやファイアウォールで、遮断されている。(filtered)
と予想した原因が、確度20%程度の現象から、50%~65%前後まで裏付けられたかと思われます。
最初に知りたかった自PCのportscan情報はもう取れているため、そこを足がかりに適切な
vi /etc/pf.conf
によるIP・port解放などの制御あたりをnetwork系統の記事として、今後続けられればと思います。
ここまで読んでいただき、ありがとうございました!!
Discussion