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/