kqito's 技術ブログ

技術やプログラミングについて思ったことを呟くブログ

0.0.0.0にHTTPリクエストできるん!?

はじめに

こんにちは。Webフロントエンドを専攻しているkqitoです。 最近、友人が0.0.0.0でデプロイしたWebサーバーに対して0.0.0.0でリクエストして正常にレスポンスが帰ってきているのを見てびっくりした事がありました。

なぜ宛先アドレスを0.0.0.0に指定しても127.0.0.1のように自分自身を指しているのか全然理解できていなかったからです。

そもそも0.0.0.0127.0.0.1の違いって?

インターフェースの確認

mac環境にてifconfigコマンドでインターフェースを確認します。

その結果の一部加工したものを以下に示します。

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
        inet 127.0.0.1 netmask 0xff000000

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet 192.168.11.2 netmask 0xffffff00 broadcast 192.168.11.255

lo0はローカルループバックを定義しているインターフェースです。inetに記述してある通り、127.0.0.1はローカルループバックIPアドレスとい う事が理解できます。

また、en0イーサネットのインターフェースを定義しています。ここではローカルIPやネットマスク、ブロードキャスクアドレスを定義しています。

それぞれの意味

結論からいうと、

  • 127.0.0.1は自分自身のIPアドレスを示す
  • 0.0.0.0は全てのインターフェースを示す

です。

従って0.0.0.0でWebサーバーをデプロイするということは上記でいうと127.0.0.1192.168.11.2の両方にbindするということになります。

これはそもそも基本情報とかで勉強した知識だったので昔からある程度は理解していたつもりでした。

なんで0.0.0.0でHTTPリクエストできるん?

気になって検索したらわかりやすくまとめて下さった方がいらっしゃいました。

qiita.com

その正体はLinux kernel

まとめると、Linux kernelが宛先アドレスが0.0.0.0だった場合にいろいろ処理してくれているそうです。Linux kernel読めないけど

一時期はブラウザの仕業かななんて思いましたけど、Linux kernelだったとは。

もしかすると0.0.0.0でアクセスできないOSがありそうですね。

まとめ

0.0.0.0について知識を深める事ができました。

気になってことを調べるとなんでも記事にされててネットすごいって最近思います()