ポート番号の仕組み|URLに443が出ないのは省略されているから。開発用のサイトは8080番台に並んでいた
ポート番号は、サーバーの中の「窓口」の番号。
HTTPSは443番で、決まりの番号なのでURLから省略されている。
0〜65535の区分と、開発環境・本番サーバーでの使われ方を並べた。
ポート番号は、ひとつのサーバーの中で「どの窓口に用があるか」を示す番号だ。
Webサイトを見るときは HTTPS の 443 番が使われているが、決まりの番号なのでURLには書かずに省略されている。
試しに https://autocamp.website:443/ と番号つきで開いても、いつものトップページがそのまま返ってくる。
この記事では、ポート番号の決まりごとを、IANA の登録簿や RFC、MDN の説明に沿って整理する。
このサイトの開発環境と本番サーバーで、実際に番号がどう使われているかも並べておく。
「僕は〜と思う」と書いたところだけが、僕の意見になる。
住所が建物なら、ポートは窓口の番号
前に、DNSはドメイン名をIPアドレスという数字の住所に直す仕組みだ、と書いた。
住所で建物までは届くが、建物の中には窓口がいくつもある。
Webページの窓口、メールを受け取る窓口、管理者がログインする窓口、という具合だ。
その窓口を指すのがポート番号になる。
MDN の URL の解説でも、ポートはWebサーバー上のリソースにアクセスするための技術的な「門」だと説明されている。
IPアドレスとポート番号の2つがそろって、ようやく相手が1か所に決まる。
URLに443が書いていないのは、省略しているから
MDN には、Webサーバーが標準のポート(HTTP は 80、HTTPS は 443)を使っているなら、ふつうは番号を省略する、とある。
HTTPの仕様(RFC 9110)にも、ポートがその方式の既定のポートと同じなら、正規の形では番号を省く、と書かれている。
だから次の2つは、同じ場所を指している。
https://autocamp.website/
https://autocamp.website:443/手元で curl を使って両方を開いてみると、どちらも HTTP 200 が返り、つないだ先のポートはどちらも 443 だった。
番号は消えているのではなく、書かなくても補われている。
番号は0から65535まで。3つの区分がある
ポート番号の割り当ては、IANA という組織が登録簿で管理している。
区分は RFC 6335 で決められていて、大きく3つに分かれる。
- 0〜1023:システムポート(ウェルノウンポートとも呼ばれる)
- 1024〜49151:ユーザーポート(登録済みポートとも呼ばれる)
- 49152〜65535:ダイナミックポート(割り当てはされない)
よく見かける番号を、IANA の登録簿から拾うとこうなる。
- 22:SSH(サーバーに安全にログインする)
- 25:SMTP(メールの配送)
- 80:HTTP
- 443:HTTPS
- 587:メールの送信(Message Submission)
- 3306:MySQL
登録簿は「この番号はこの用途で使う」という約束で、番号そのものに鍵がかかっているわけではない。
決まりの番号以外で動かすこともでき、その場合はURLや接続の設定に番号を書く。
このサイトの開発環境では、8080番台に並んでいた
僕のパソコンでは、案件ごとの開発用サイトを Docker で動かしている。
今日 docker ps で確かめると、それぞれの Web サーバーに 8080、8082、8084、8090……と別々の番号が振られていた。
0.0.0.0:8080->80/tcp
0.0.0.0:8082->80/tcp
0.0.0.0:8084->80/tcp矢印の左がパソコン側の番号、右がコンテナの中の番号だ。
中ではどのサイトも 80 番で待っているが、1台のパソコンの上では同じ番号を2つのプログラムで同時に使えない。
だから外側の番号をずらして、ぶつからないようにしている。
ふだん僕がブラウザで開くときは、番号を書かない https:// のアドレスで開いている。
これは、パソコンの 80 番と 443 番をひとつの受付(リバースプロキシ)が受け、アドレスを見て奥の各サイトへ振り分けているからだ。
この仕組みは別の記事に書いた。
データベースは 3306 番だった。
これは IANA の登録簿で MySQL に割り当てられている番号と同じだ。
本番サーバーのSSHは、22番ではなかった
SSHの決まりの番号は 22 番だ。
でも、このサイトを置いている Xserver のマニュアルでは、SSH の接続ポートは 10022 と案内されている。
僕が本番に記事を入れるスクリプトも、接続先の番号に 10022 を指定している。
決まりの番号から外すと、22番だけを狙って片っぱしから試す機械的な接続は、まず届かなくなる。
ただ、番号を変えただけで守りが固くなるわけではないと僕は思う。
番号は調べれば分かるので、鍵を使ったログインや、接続できる相手を絞る設定のほうが本体だ。
エラーに番号が出てきたら
「ポートが使われています」のようなエラーは、その番号をすでに別のプログラムが使っている、という意味になる。
開発用のサーバーを2つ同じ番号で立ち上げようとすると、こうなる。
片方を止めるか、片方の番号をずらせば動く。
URLに :8080 のような番号が付いているページは、決まりの番号以外で動いているサーバーだ。
開発中の画面や、社内の管理画面でよく見かける。
番号が付いていること自体は、異常ではない。
まとめ
- ポート番号は、ひとつのサーバーの中の「窓口」の番号
- HTTP は 80、HTTPS は 443。決まりの番号はURLから省略される
- 番号は 0〜65535。0〜1023 がシステムポート、1024〜49151 がユーザーポート、49152〜65535 がダイナミックポート
- 1台のパソコンでは同じ番号を同時に使えないので、開発環境では外側の番号をずらす
- SSH を 22 番以外にしているサーバーもある。番号の変更は守りの本体ではない
住所にあたるIPアドレスの話は、こちらに書いている。
DNSとは何か|nslookupを打ったら、自分のサイトの住所が数字で返ってきた
出典
ほかにも書いています
受託・note・スタンプこういう仕組みを作る相談を受けています
毎日の更新・データ集め・集計の自動化/3万円〜収益がいくらだったか、どの施策が外れたか
note / 個人の視点で掘り下げていますスタンプラリーに挑戦する
行った場所は、現地チェックインで記録に残せます※受託の相談とnoteは、運営者が個人で受けている・書いているものです。
