MySQL を立ち上げると 3306、PostgreSQL を立ち上げると 5432。普段はなんとなく受け入れている数字だが、ふと、誰がどう決めたのだろうと気になった。80 や 443 のように標準っぽい番号もある。かと思えば、3000 や 8080 のように、ローカル開発でやたらと見かける番号もある。

そこで MySQL と PostgreSQL を入口に、ポート番号の素性を洗ってみた。対象はデータベース、HTTP、開発サーバーまわりで、資料は公式ドキュメントと IANA の登録情報を中心にした。ポート番号を番地に、IANA を登記所に見立てると、話の見通しがいくらかよくなる。

結論めいたことを先に言えば、ポート番号には大きく2つのタイプがある。ひとつは、標準仕様や IANA 登録と強く結びついた番号だ。HTTP の 80、HTTPS の 443、FTP の 20/21、SSH の 22、SMTP の 25 がこれにあたる。こちらは、いまその番号を使う理由が比較的はっきりしている。

もうひとつは、製品やツールのデフォルト設定として定着した番号である。MySQL の 3306、PostgreSQL の 5432、Tomcat の 8080、Rails や Next.js の 3000、Flask の 5000、Django の 8000、Jupyter の 8888 などだ。こちらは現在のデフォルト値こそ公式に確認できても、なぜその数字が選ばれたのかまでは文書化されていないことが多い。住人の名前は分かっても、その番地を選んだ理由までは記録に残っていないわけだ。

ポート番号の管理

そもそもポート番号は IANA が管理している。RFC 6335 では、ポート番号を大きく3つの範囲に分けている。

範囲名前用途のイメージ
0-1023System PortsHTTP、SSH、DNS などの標準的なサービス
1024-49151User Portsアプリケーションやサービスが登録して使う領域
49152-65535Dynamic / Private Ports一時的・私的に使う領域

Linux などの Unix 系 OS では、1024 未満のポートに bind するには特権が要る。いわゆる特権ポートで、この扱いは長く続いている。この制約を考えれば、高番ポートがローカル開発やアプリケーションサーバーで好まれてきたのは、ごく自然な成り行きに見える。8080、3000、5000、8000、8888 あたりがそうだ。root 権限なしでサーバーを立てられるからである。

もっとも、IANA に登録されていることと、あるソフトウェアがデフォルトで使うことは別の話だ。登記上の名義と実際の住人は、往々にして食い違う。たとえば 3000 は Web 開発ではおなじみだが、IANA 上で「Web 開発用ポート」として登録されているわけではない。Oracle Database の 1521 も、Oracle 製品では長くデフォルトのリスナーポートとして扱われてきたのに、IANA 上の名義は Oracle ではない。

Kubernetes API Server の 6443 も同様だ。Kubernetes では既定値としてよく使われるのに、IANA 上は Kubernetes 用の登録ではない。現場で強く定着している番号でも、IANA 上の名義と一致するとは限らないのだ。

MySQL の 3306

MySQL について公式に確認できるのは、classic MySQL protocol のデフォルトポートが 3306 であることだ。MySQL の公式ドキュメントでも、3306 は既定値として扱われている。IANA のレジストリでも、3306 は mysql として登録されている。その assignee/contact には Monty の名前がある。MySQL の作者である Michael "Monty" Widenius に紐づく登録だと見てよさそうだ。

ところが肝心の「なぜ 3306 なのか」については、今回調べた一次資料の範囲では、はっきりした説明を見つけられなかった。よく見かけるのは「3305 の次に空いていたから 3306 になった」という話だ。もっともらしくはある。ただ、少なくとも今回見た MySQL 公式ドキュメントや IANA の登録情報だけでは、その説明を断定するのは難しい。

MySQL 3306 について確認できたことを並べると、こうなる。MySQL のデフォルトであることは公式に確認できる。IANA に mysql として登録されていて、その登録には Monty の名前が見える。しかし、なぜ 3306 という数字なのかは今回の範囲では不明。このくらいで筆を止めておくのが安全である。

PostgreSQL の 5432

PostgreSQL も、5432 が PostgreSQL Database のポートとして IANA に登録されている。assignee/contact には Tom Lane の名前がある。PostgreSQL の古い公式ドキュメントを見ても、かなり早い時期から default port 5432 が使われていたことは確認できる。少なくとも PostgreSQL 系の歴史の中で、5432 が早くから定着していたとは言える。

ただし、こちらもなぜ 5432 なのかまでは、今回見た公式アーカイブからは分からなかった。PostgreSQL は Berkeley POSTGRES の流れをくむ。となると、5432 の理由も Berkeley 時代にあるのでは、と考えたくなる。けれど今回の資料だけで「5432 という数字の意味は Berkeley 起源である」と言い切るのは、いささか危うい。

MySQL 3306 と PostgreSQL 5432 は、どちらも製品のデフォルトとして定着し、IANA にも登録されている番号だ。一方で、数字そのものの由来はまた別の問題である。そこは一次資料が乏しい領域なのだ。

ほかのデータベースのポート

SQL Server の 1433 は、Microsoft の公式ドキュメントで default instance が使う TCP ポートとして説明されている。IANA にも ms-sql-s 1433 として登録済みだ。ただ、なぜ 1433 なのかという数字の由来までは、今回の一次資料では見つけられなかった。 Oracle Database の 1521 は、少し事情が違う。Oracle の公式ドキュメントでは、Oracle Net Listener の default port として 1521 が説明されている。現場でも非常によく知られた番号だ。ところが IANA で 1521 を引くと、登録名は Oracle ではなく ncube-lm である。

さらに Oracle による利用については、IANA 側に「Unauthorized Use Known on port 1521」という注記まで付いている。Oracle の世界では定番なのに、IANA 上で Oracle 用に正式登録されているとは言いにくい。登記簿に名前のない住人が、堂々と表札を掲げて住み続けているようなものだ。この佇まいは、なかなか味わい深い。

Redis の 6379、MongoDB の 27017 も、公式ドキュメント上のデフォルト値は確認できる。MongoDB 27017 は IANA にも登録されている。ただ、これらも数字そのものの由来までは、今回の範囲でははっきりしなかった。

Elasticsearch は、さらに少しややこしい。公式ドキュメントでは、http.port のデフォルトが 9200-9300、transport.port のデフォルトが 9300-9400 という範囲で説明されている。会話では「Elasticsearch は 9200 と 9300」と言いがちだ。だが厳密には、最初に使われやすい値と設定上の範囲を分けて見た方がよい。

HTTP の 80 と HTTPS の 443

対して HTTP 80 と HTTPS 443 は、今回見た中ではかなり由来が分かりやすい部類だった。RFC 1945 では、http:// URL でポートが省略されている場合は 80 を前提にする、という扱いが示されている。現在の RFC 9110 でも、http のデフォルトは TCP 80、https のデフォルトは TCP 443 と説明されている。このあたりはローカル開発の慣習ではなく、仕様として決まっている番号と見てよい。

8080 は 80 を2つ並べたのか

8080 は IANA では http-alt として登録されている。説明も HTTP Alternate、つまり HTTP の代替ポートという位置づけだ。Tomcat もデフォルトで 8080 に bind しようとする。Tomcat のドキュメントには、ポートを変えるなら 1024 より大きい番号にするのが望ましい、という説明もある。Unix 系 OS の特権ポートの制約を考えると、80 の代わりに 8080 のような高番ポートを使う理由はよく分かる。

かといって、よく言われる「8080 は 80 を2つ並べたから」という説明は、今回確認した IANA、RFC、Tomcat の一次資料には出てこなかった。数字の見た目からして、そう受け取りたくなるのは分かる。ただ、一次資料に基づいて言えるのは、8080 が HTTP の代替ポートとして登録されているところまでだ。80 を2つ並べたから 8080 になった、とまでは言い切れないのである。

3000 は Web 開発の標準なのか

3000 は、今回調べていてとりわけ印象に残った番号である。Rails、Express、Create React App、Next.js、Grafana など、多くの開発ツールやアプリケーションが 3000 を使っている。Web 開発をしていれば、localhost:3000 はもはや実家のような安心感がある。

ところが IANA 上の 3000 は、Web 開発用ポートではない。IANA で 3000 を引くと、HBCI など別の用途が出てくる。実家だと思っていた家の登記を見たら、名義が赤の他人だったわけだ。つまり 3000 は公式な Web 開発ポートではなく、ローカル開発の世界で広く定着したデファクトと見るべきなのだ。

Rails の古いガイドでも 3000 は使われており、Rails が比較的早い時期から 3000 を使っていたことは確認できる。ただし、Rails が 3000 の起源である、とまでは今回の資料だけでは踏み込めない。Rails などの人気プロジェクトが使い、Express や Next.js などでも使われた。その結果「Web 開発なら 3000」という空気が強まっていった、と見るのが自然ではないだろうか。

5000、8000、8888、4200、5173

Flask は 5000、Django は 8000、Jupyter Notebook は 8888、Angular CLI は 4200、Vite は 5173 をデフォルトとして使う。どれも公式ドキュメント上で、現在のデフォルト値は確認できる。ただ、その理由までは今回見た公式ドキュメントでは分からなかった。Flask がなぜ 5000 で、Django がなぜ 8000 で、Jupyter がなぜ 8888 なのか、どれも謎のままである。

Vite の 5173 や Angular の 4200 についても、外部ではいろいろな説を見かける。けれど一次資料で確認できる範囲に絞るなら、言えることは限られる。現在のデフォルトは確認できるが、数字の理由は分からない。そう書いておくのが誠実というものだ。

Docker、Kubernetes、Prometheus

Docker daemon のリモート API では、2375 が非 TLS、2376 が TLS の慣例的なポートとして説明されている。Docker のドキュメントでは conventional という表現が使われている。標準仕様で固定された番号というより、Docker の運用慣習と見る方が近い。

Kubernetes API Server は既定で 6443 を listen する。ただし IANA 上の 6443 は Kubernetes ではなく sun-sr-https だ。ここでも製品のデフォルトと IANA の登録名が一致していない。

Prometheus は 9090 をデフォルトとして使う。これも公式ドキュメント上のデフォルト値は確認できる。とはいえ、なぜ 9090 なのかという数字の由来までは、今回の範囲では追いきれなかった。

俗説の整理

調べていて感じたことがある。ポート番号では「いまそう使われていること」と「その数字が選ばれた理由」が、混ぜこぜで語られやすいのだ。よく聞く説明を、今回調べた範囲での見方と並べると次のようになる。

よくある説明調べた範囲での見方
HTTP は 80 を使うRFC で確認できる
HTTPS は 443 を使うRFC で確認できる
8080 は HTTP の代替ポートIANA で確認できる
8080 は 80 を2つ並べたから今回の一次資料では確認できなかった
MySQL 3306 は 3305 の次の空き番号だった今回の一次資料では確認できなかった
PostgreSQL 5432 は Berkeley 由来で理由も説明済み5432 の利用は確認できるが、数字理由は確認できなかった
3000 は公式な Web 開発ポートIANA 上はそうではなく、デファクトと見るのがよさそう
Oracle 1521 は IANA でも Oracle 用IANA 上の名義は Oracle ではない
Elasticsearch のデフォルトは厳密に 9200 と 9300公式設定では範囲として説明されている
Kubernetes 6443 は IANA でも Kubernetes 用IANA 上は Kubernetes 用ではない

ポート番号の一覧

ついでに、今回見た番号を一覧にしておく。

ポートよく見る用途今回の見方
20/21FTP標準プロトコル側の番号
22SSH標準プロトコル側の番号
25SMTP標準プロトコル側の番号
53DNS標準プロトコル側の番号
67/68DHCP標準プロトコル側の番号
80HTTPRFC で既定値が示されている
443HTTPSRFC で既定値が示されている
8080HTTP alternate / TomcatHTTP 代替ポートとしては確認できるが、語呂の由来は未確認
3000Rails / Express / Next.js などWeb 開発のデファクト。ただし IANA 上の Web 標準ではない
3306MySQL公式既定と IANA 登録は確認できるが、数字理由は未確認
5432PostgreSQL公式既定と IANA 登録は確認できるが、数字理由は未確認
1433SQL Server公式既定と IANA 登録は確認できるが、数字理由は未確認
1521Oracle Net ListenerOracle の定番だが、IANA 上の名義は Oracle ではない
5000Flask公式デフォルトは確認できるが、数字理由は未確認
6379Redis公式デフォルトは確認できるが、数字理由は未確認
8000Django公式デフォルトは確認できるが、数字理由は未確認
8888Jupyter Notebook公式デフォルトは確認できるが、数字理由は未確認
1883MQTTIANA に登録された MQTT の標準ポート
8883MQTT over TLSIANA に登録された secure MQTT の標準ポート
2375/2376Docker daemon remote APIDocker の慣例的ポート
27017MongoDB公式既定と IANA 登録は確認できるが、数字理由は未確認
4200Angular CLI公式デフォルトは確認できるが、数字理由は未確認
5173Vite公式デフォルトは確認できるが、数字理由は未確認
6443Kubernetes API ServerKubernetes の既定値だが、IANA 上の名義は別用途
9090Prometheus公式デフォルトは確認できるが、数字理由は未確認
9200/9300Elasticsearch厳密には HTTP / transport ともに範囲で説明されている

決まり事になったデフォルト値

ポート番号は、見慣れているほど、なにか明確な理由があるはずだと思ってしまう。ところが実際に調べてみると、数字の由来まで一次資料で追えるものは意外なほど少なかった。HTTP 80 や HTTPS 443 のように、標準仕様の中で説明しやすいものもある。片や MySQL 3306、PostgreSQL 5432、3000、5000、4200、5173 のような番号は、いまでは当たり前に使われていても、なぜその数字なのかはあまり語られていない。

このあたりは、いかにもソフトウェアの歴史らしいところだ。最初は小さなデフォルト値に過ぎなかったものが、ユーザー、ドキュメント、サンプルコード、Docker イメージ、クラウド設定などを通じて広まっていく。そして、いつの間にか「そういうもの」として固定される。誰かが気まぐれに打ち込んだ数字が、何十年もかけて世界中の設定ファイルに書き写されてきたのかもしれない。そう思うと、少し愉快である。

だからポート番号について話すときは、2つを分けて考えると見通しがずっとよくなる。その番号をいま使っていることと、その番号が選ばれた理由が分かっていることだ。表札と登記簿は、必ずしも同じことを語らないのである。

以上、MySQL の 3306 と PostgreSQL の 5432 を入口に、よく見るポート番号の由来を調べた。この二つも、使われていること自体ははっきりしている。ただ、その数字に込められた最初の理由については、少なくとも今回調べた範囲では、まだ余白が残っていた。当たり前の数字ほど、由来は語られないものなのだ。