WSL初心者あるある
概要
サーバ側はWindowsのEclipseとかでtomcatなりapacheなりが動いていて、WSLでアプリやらスクリプトやらからWindowsのサーバにlocalhost
でリクエストを送ったけど、なんかタイムアウトするなぁというとき。
この場合のlocalhost
はWSL自身のローカルを指すのでいくら待ってもWindowsにはリクエストが飛びません。
対処方法はいくつかありますが、たいてい個別にしか紹介されていないのでまとめました。
ほかにもあればぜひコメントを。
- ipconfigをみてIPアドレスを特定する
- ポートフォワーディングを設定する
- ホスト側のサーバにバインドしているアドレスを変更する
WindowsのIPアドレスを特定する
一番有名な方法。cmdでipconfigを見る場合。
ipconfig
イーサネット アダプター vEthernet (WSL)
のIPv4 アドレス
をWSLからの通信先として使用しましょう。
イーサネット アダプター vEthernet (WSL):
接続固有の DNS サフィックス . . . . .:
リンクローカル IPv6 アドレス. . . . .: xxxx::xxxx:xxxx:xxxx:xxxx%xx
IPv4 アドレス . . . . . . . . . . . .: 172.xx.xxx.x ★ここ
サブネット マスク . . . . . . . . . .: xxx.xxx.xxx.x
デフォルト ゲートウェイ . . . . . . .:
次のコマンドでWSL上で確認することもできます。
シェルスクリプトとかからリクエスト投げるときはこちらがおすすめです。
結果にはIPアドレスがそのまま表示されます。
ip route show | grep -i default | awk '{ print $3}'
ポートフォワーディングを使用する
netsh
コマンドでこのアドレスからの通信をこのアドレスに転送しますよーという設定をしておく。
この方法の場合、127.0.0.1
がWSLのローカルIPアドレスなのでWSLでの通信先指定はlocalhost
でもいけるはず。
netsh interface portproxy add v4tov4 listenport=<port> listenaddress=0.0.0.0 connectport=<port> connectaddress=127.0.0.1
ホスト側のサーバにバインドしているアドレスを変更する
Windows側でサーバを起動していると思いますのでそちらの設定がいじれる場合(いじり方はサーバによりけりなのでここでは割愛)はこの方法も使えます。
だいたいはlocalhost
になっていて特定のIPで受け付ける形になっていますが、0.0.0.0
にしてなんでも受け入れるよ状態にすることでもできるようです。
お察しかもしれませんが、なんでも受け入れる状態はセキュリティ上良くないのであまり推奨はしません。
が、とりあえず動くかを確認するまでなら一瞬こちらを試してみてもいいかもしれません。
参考文献