IPアドレス 0.0.0.0にバインド
pythonでhttp serverを立てて,Quartoで作成したウェブサイトを以下のコマンドで公開するとします
% python -m http.server 3000 --directory ./_site/
Serving HTTP on 0.0.0.0 port 3000 (http://0.0.0.0:3000/) ..バインド先を設定せずにserverを立ち上げたところ,0.0.0.0 で立ち上げているようです. このとき,Firewallの3000 portをホスト側でAllowすると,同じnetworkの他の端末(例:iPad)からでもアクセスできるようになりました.
▶ プライベートIPアドレスをバインド先に指定した場合
自宅内のネットワークのみで有効なプライベートIPアドレス(クラスC 192.168.0.0 ~ 192.168.255.255)を指定してhttp serverを立たてみます.
% python -m http.server 3000 --directory ./_site/ --bind 192.168.10.105
Serving HTTP on 192.168.10.105 port 3000 (http://192.168.10.105:3000/) ...このとき,同じネットワーク内にあるiPadからアクセスできるようになりました. iPad側では http://192.168.10.105:3000 に接続することでQuarto contentsにアクセスできるようになりましたが, このiPad側での操作は 0.0.0.0 で立ち上げたときと同じ操作となります.
❓ Question
python http.server を使用して 0.0.0.0 にバインドしてhttp serverを立てたときの挙動がプライベートネットワーク内部で割り当てられたプライベートIPアドレスを指定したときと同じ挙動をするのか?
0.0.0.0/8 が満たすべき性質
IPv4において 0.0.0.0 (IPv6では::/0) はSepcial-Purpose Address Registry,つまり特別な目的用に予約されたアドレスです.
| Attribute | Value |
|---|---|
| Address Block | 0.0.0.0/8 |
| Name | This host on this network |
| RFC | [RFC1122], Section 3.2.1.3 |
| Allocation Date | September 1981 |
| Termination Date | N/A |
| Source | True |
| Destination | False |
| Forwardable | False |
| Global | False |
| Reserved-by-Protocol | True |
上記より0.0.0.0 ~ 0.255.255.255について以下の情報を得ることができます
GlobalセクションがFalseとなっていることから,グローバルIPアドレスとして使用できない.利用はローカルネットワークに限定されるSourceセクションTrueより,送信元アドレスとして有効DestinationセクションFalseより,宛先アドレスとして使用できない = ルーティング不可
ただし,0.0.0.0の具体的な意味はここからではまだわかりません.
▶ 0.0.0.0/0 vs 0.0.0.0/32
| Attribute | 0.0.0.0/0 |
0.0.0.0/32 |
|---|---|---|
| Subnet Mask | 0.0.0.0 (all bits variable) |
255.255.255.255 (all bits fixed) |
| Range | All IPv4 addresses (0.0.0.0 to 255.255.255.255) |
0.0.0.0 |
Python http serverにおける 0.0.0.0
バインド先を指定しないでhttp serverを立てるとき,バインド先を指定しない = 有効な宛先がないことを意味します. このとき使用されるのが 0.0.0.0 です.
この文脈での 0.0.0.0 は catch-all wildcard と呼ばれるもので,同じネットワーク上のすべてのインターフェースに対して, バインドするという特別な意味を持っています.コンピューターが複数のネットワークに接続していて,すべてのネットワークにバインドしたい場合に 0.0.0.0を指定します.ただし,不必要に使用してしまうと誤って外部のネットワークに共有してしまったりするので使用は控えたほうが良いです.
📘 REMARKS
- Python HTTP Serverにおける
0.0.0.0はルーティングにおけるデフォルトルートとしての0.0.0.0は異なります - 文脈に応じて
0.0.0.0が指す内容が異なることに注意してください python hhtp.serverの文脈では0.0.0.0にバインドすると以下のインターフェースからアクセス可能となります- Localhost (
127.0.0.1) - The private network (例:
192.168.x.x) - Public network interfaces (Firewallでアクセスを許容していた場合)
- Localhost (
Python http serverをprivate networkに限定する意図を込めて,以下のスクリプトでホスティングすることが望ましいです
$ python3 -m http.server -b <your-local-private-network IP> 8080 --directory ./_site/Appendix: プライベートアドレス
Definition 1 プライベートアドレス
- 社内や家庭内など,限られたネットワークの中だけで有効なIPアドレスのこと
- 組織内で一意でない場合は,宛先を混同して正常に通信できないので各デバイスに一意に割り当てる必要がある
| Class | IP Address Range | CIDR |
|---|---|---|
| Class A | 10.0.0.0 ~ 10.255.255.255 | 10.0.0.0/8 |
| Class B | 172.16.0.0 ~ 172.31.255.255 | 172.16.0.0/12 |
| Class C | 192.168.0.0 ~ 192.168.255.255 | 192.168.0.0/16 |
ネットワーク部に着目すると,それぞれのクラスが大規模ネットワーク向け,中規模ネットワーク向け,小規模ネットワーク向けに対応していることがわかります.