みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

Windowsで実行するWebサーバーにアクセスする

Pythonhttp.serverを使用すれば,開発用のWebサーバーをすぐに実行できます.カレントディレクトリのファイルをHTTPプロトコルで配信できます.まずはテストのために適当なindex.html を作成して保存します.以下のコマンドを実行すれば完成です.

python -m http.server

Windows 10 ProにインストールしたPython 3.9で上記を実行すると以下のようになります.

Serving HTTP on :: port 8000 (http://[::]:8000/) ...

この状態で同じマシンのブラウザーを使って,http://localhost:8000/にアクセスするとindex.html が表示されます.ローカルホストならばとても簡単です.

以下ではIPv4を利用します.

プライベートネットワークからアクセス

bindオプションで,IPアドレスを指定できます.プライベートネットワークのルーターのIPアドレスが192.168.1.1で,Webサーバーを実行中のマシンのIPアドレスが192.168.1.3の場合は以下のようになります.

python -m http.server --bind 192.168.1.3

プライベートネットワークに接続した他のパソコン(192.168.11.4など)からhttp://192.168.1.3:8000/にアクセスしてみますが,失敗します.初回ならば自動的にWindows Security Alertが表示され,ファイアウォールの設定について確認するダイアローグが表示されます.

f:id:atsuhiro-me:20220318232419p:plain:w360

Windows 10では,ファイアウォールがデフォルトでこのような通信をブロックするように設定されているので,Pythonに明示的に許可を与えなければなりません.プライベートネットワークでのPythonの通信を許可すれば,他のパソコンからアクセスできるようになります.

VPNを使ってアクセス

プライベートネットワークのルーターのIPアドレスが192.168.1.1で,Webサーバーを実行中のマシンのIPアドレスが192.168.1.3であり,このルーターを経由してインターネットに接続されていて,OpenVPNHostとして接続されておりConnectorのIPアドレスが100.96.1.3である場合は,以下のようにWebサーバーを実行します.

python -m http.server --bind 100.96.1.3

同じVPNに接続した別のPCからhttp://100.96.1.3:8000/アクセスを試みても失敗します.これは,Windows 10がデフォルトでパブリックネットワークからの通信をファイアウォールがブロックするよう設定されているからです.明示的にPythonに許可を与えなければなりません.

f:id:atsuhiro-me:20220318234103p:plain:w360

なお,Windows Security Alertの初期状態ではパブリックネットワークの通信がブロックされる設定になっているので,明示的に許可しなければなりません.

まとめ

デフォルトで通信がブロックされる設定はセキュリティの観点から推奨されるのだと思いますが,ファイアウォールのデフォルトの動作を知らないとうまく通信できないので苦労しました.