IPアドレス 0.0.0.0

network
quarto
Author

Ryo Nakagami

Published

2024-12-07

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,つまり特別な目的用に予約されたアドレスです.

RFC6890
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.0catch-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でアクセスを許容していた場合)

Python http serverをprivate networkに限定する意図を込めて,以下のスクリプトでホスティングすることが望ましいです

$ python3 -m http.server -b <your-local-private-network IP> 8080 --directory ./_site/

References