10080 番ポートが使えない
ローカルで開発していて、このアプリのポートは 8080、次のアプリのポートは 9080、その次は 10080 とするとうまくいきません。なぜ?
ポート番号0-1023 は最近はウェルノウンポートではなくシステムポートと呼ぶそうです。開発時に適当にポート番号を割り振るときにシステムポートは管理者権限がないと使えないので避けて、3000番台とか5000番台もDBや何かのフレームワークのデフォルトで使っていそう、8080番はよくサンプルで見るので自分のアプリで使っていそう、などと考えています。
かぶらない番号を求めて 9080 番、10080番と上げていくと 10080番ではうまく表示されません。
こんなところに NG のポートがあるの・・・?
- Chrome の場合

- Firefox の場合

実はこのメッセージは、アプリが10080番で動いていようがいまいが、ブラウザで http://localhost:10080/ にアクセスすると表示されます。
10080 番はブラウザが強制的にエラーにします。
Firefox のエラーメッセージが丁寧でわかりやすいですね。(Chrome はエラーメッセージが違うような気が・・・)
ちなみにアプリが動いていない場合、10081番ポートでは以下のような表示です。
- アプリが動いていない場合(10081番ポート)

10080番以外にもブロックされるポートはあって、Chrome (Chromium) では以下のソースで確認できます。
- net/base/port_util.cc - chromium/src - Git at Google
// The general list of blocked ports. Will be blocked unless a specific
// protocol overrides it. (Ex: ftp can use port 21)
// When adding a port to the list, consider also adding it to kAllowablePorts,
// below. See <https://fetch.spec.whatwg.org/#port-blocking>.
const int kRestrictedPorts[] = {
0, // Not in Fetch Spec.
1, // tcpmux
7, // echo
9, // discard
11, // systat
13, // daytime
15, // netstat
17, // qotd
19, // chargen
20, // ftp data
21, // ftp access
22, // ssh
23, // telnet
... // 中略
2049, // nfs
3659, // apple-sasl / PasswordServer
4045, // lockd
5060, // sip
5061, // sips
6000, // X11
6566, // sane-port
6665, // Alternate IRC [Apple addition]
6666, // Alternate IRC [Apple addition]
6667, // Standard IRC [Apple addition]
6668, // Alternate IRC [Apple addition]
6669, // Alternate IRC [Apple addition]
6697, // IRC + TLS
10080, // Amanda
};
ソースの先頭の方のコメントにもありますが、ポートブロッキングは Web の標準仕様となっていて以下で確認できます。
(おや、4190番ポートが Chrome の方には反映されていないよう・・・。Firefox は動作で確認すると 4190 番ポートはブロックされました。)
ということで、10080番ポートはブラウザがブロックするのでエラーになっていました。
ブラウザが特定のポートをブロックするのは、「NAT Slipstreaming」という攻撃に対処するためとのことです。
NAT Slipstreaming 攻撃は NAT をうまくすり抜けて外部から LAN 内のホストにアクセスするという攻撃です。
知らないうちにセキュリティ対策をしてくれているので、ブラウザも定期的にアップデートしないといけませんね。
