同一ネットワーク上にあるUbuntuサーバーからWSLへHTTPリクエストを送る

はじめに

同一ネットワーク上にあるUbuntuサーバーからWSLで起動したAPIサーバーにHTTPリクエストを送ろうとしたらうまくできなかった。すぐ終わりそうだと思ったら意外とハマったのでメモしとく。

概要

ネットワーク図

簡単に書くと上図のような構成になっている。今回うまくいかなかった、またはよく分からなかったのは以下の部分。

  • リクエスト先として指定するIPアドレス
  • どこでリクエストがブロックされているのか(Windowsマシンに届く前か、WSLに届く前か)

解決法

まず大前提として、リクエスト先のIPアドレスはWSLのIPアドレスではなく、WindowsのIPアドレスを指定する。これはipconfigコマンドで知ることができる。となると、Windowsマシンでポートを一時的に開ける必要があることもわかる。今回はひとまず、TCPの18080を開放した。次はWindowsでのIPアドレスとポートをWSLのIPアドレスとポートにマッピングするような設定を行う必要がある。これはnetshコマンドを使って以下のように設定できる。

# 192.168.1.yyy:18080 => 192.168.zzz.zzz:8080
netsh interface portproxy add v4tov4 listenport=18080 listenaddr=192.168.1.yyy connectport=8080 connectaddress=192.168.zzz.zzz

# 設定できているか確認
netsh interface portproxy show all

これでUbuntuサーバーからWindowsマシンのIPアドレスとポートを指定してリクエストを送ると、WSLで起動したAPIサーバーにリクエストが届くようになる。

感想

WSLのネットワーク事情だったりIP層の基礎的なところがよくわかってなかったのでかなり手こずってしまった。次回はもう少しいい感じに問題解決できるようにしたい。

参考