generated at
127.0.0.1 と 0.0.0.0 の違い
127.0.0.1 0.0.0.0 IPアドレス
IPアドレスは各サーバーが持っているTCP/IP通信のための住所(アドレス)
127.0.0.1 はローカルループバックインターフェースのIPアドレス
IPを持つ全てのコンピューターには、自分自身のアドレスとして 127.0.0.1 が設定されている
つまり、どのコンピューターでも 127.0.0.1 は自分自身を指す
0.0.0.0 は全インターフェースに対してbindするという意味
自分自身という意味ではない
socketのbind 時に意味を持つ




以下、Djangoを例に事例別で紹介

手元のPCでDjangoを起動する
Djangoは http://127.0.0.1:8000/ で起動する
bash
(venv) $ python manage.py runserver Performing system checks... System check identified no issues (0 silenced). August 24, 2018 - 14:55:45 Django version 2.1, using settings 'testproj.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
http://localhost:8000/ にアクセスすると表示できる
http://127.0.0.1:8000/ にアクセスすると表示できる
localhost = 127.0.0.1 (標準規格 RFC 5735

開発サーバーでDjangoを起動する
開発サーバーのIPは 192.168.99.1 とする
Djangoは http://127.0.0.1:8000/ で起動している
PCのブラウザから http://localhost:8000/http://127.0.0.1:8000/ ではアクセス出来ない
PCのブラウザから http://192.168.99.1:8000/ でもアクセス出来ない
Djangoを 192.168.99.1:8000 で起動しなおす
bash
(venv) $ python manage.py runserver 192.168.99.1:8000 Performing system checks... System check identified no issues (0 silenced). August 24, 2018 - 15:01:49 Django version 2.1, using settings 'testproj.settings' Starting development server at http://192.168.99.1:8000/ Quit the server with CONTROL-C.
これで http://192.168.99.1:8000/ にアクセスできる
うまくいけば、Djangoのエラーが表示される -> Djangoの DisallowedHost エラー
違いは?
127.0.0.1:8000 ローカルループバックネットワークI/Fにbind
192.168.99.1 はeth1などのネットワークI/Fにbind
ローカルループバックはそのマシン内部からの通信にだけ使われる
192.168.99.1 に繋がっているネットワークからの通信を受け取るには 192.168.99.1 にbindする
全てのネットワークインターフェースにbindするには 0.0.0.0 を指定
127.0.0.1 にも 192.168.99.1 にもbindする。
他のネットワークにも繋がっていればそっちにもbindされる
想定外のネットワークに繋がる可能性もある

PC内の仮想マシンでDjangoを起動する
VirtualBoxVagrant 等の仮想マシンでDjangoサーバーを起動する
Djangoサーバーは http://127.0.0.1:8000/ で起動している
PCのブラウザから http://localhost:8000/http://127.0.0.1:8000/ ではアクセス出来ない
PCにとっての localhost は、仮想マシンにとっての localhost ではない
仮想マシンのIPが 172.16.0.2 だとすると、アクセスするべきURLは http://172.16.0.2:8000/ ?
Djangoサーバーは 127.0.0.1 にbindしているのでNG
Djangoサーバーを 172.16.0.2:8000 にbindしてPCから http://172.16.0.2:8000/ にアクセスする
うまくいけば、Djangoのエラーが表示される -> Djangoの DisallowedHost エラー
VirtualBoxVagrantを使っている場合、ポートフォワードする設定が一般的
仮想マシンの8000ポートをローカルの8000ポートにポートフォワードする
TBD: 絵で説明
仮想マシン内の 127.0.0.1:8000 を ホストマシン(PC)の 127.0.0.1:8000 に繋ぐ
PCのブラウザから http://127.0.0.1:8000/ にアクセス
繋がらない?
仮想マシン内のDjangoサーバーを 127.0.0.1:8000 で起動しよう


ssh接続したサーバーの場合
sshコマンドのポートフォワードが使える
開発サーバーの任意のポートを接続元PCのポートに繋げられる
VirtualBoxのポートフォワード設定と同じ概念
ssh -L 8000:localhost:8000 server.example.com
接続先は server.example.com
接続元PCの 8000 ポートを、接続先からみて localhost:8000 に繋ぐ