🛶

【network】portcanningで自サーバーの許可ポートを確認

2024/11/10に公開

はじめに

ポートスキャンを普段扱っている自分の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アドレスに対して全ポートをスキャンする方法です。

手順

  1. Nmapのインストール

    • Linuxでは、以下のコマンドでインストール可能です。
      sudo apt install nmap  # Debian系(Ubuntuなど)
      sudo yum install nmap  # Red Hat系
      
    • macOSでは、Homebrewを使用してインストールできます。
      brew install nmap
      
    • Windowsでは公式サイトからインストーラーをダウンロードしてインストールします。
  2. 全ポートスキャンコマンド

    • ターゲットIPアドレスに対して全ポート(1-65535)をスキャンするには、次のコマンドを実行します。
      nmap -p- <ターゲットIP>
      
    • -p- オプションは全ポート(1-65535)を指定するオプションです。
    • 例えば、ターゲットIPが 192.168.1.1 の場合、以下のように入力します。
      nmap -p- 192.168.1.1
      
  3. 詳細な出力

    • より詳細な情報(OSの推定やサービスのバージョン)を得たい場合は、-A オプションを追加します。
      nmap -p- -A 192.168.1.1
      
  4. 結果の確認

    • スキャン結果が表示され、各ポートのステータス(開いているか閉じているか)、使用されているサービスなどがわかります。

注意事項

ポートスキャンは、セキュリティや診断目的でのみ行い、許可のないシステムに対して行わないようにしましょう。

本題

自分の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です。
https://protonvpn.com/ja

無料版の説明が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