WSL2内のIPアドレス

関連

WSL2+docker そして外部通信がブロックされてしまう問題対策

Windowsでポートフォワーディング

https://ascii.jp/elem/000/001/909/1909920/#eid1909928

WSL2では、仮想アダプタが起動するごとに生成されてBクラスのプライベートアドレスのIPアドレスが自動で付与されるが、困ったことにWindows起動毎に毎回アドレスが違う

しかも内部的なスイッチングなので、外からも見えないので簡単にアクセスできない。上記の「ポートフォワーディング」設定で外部からのアクセスを転送することはできるが、再起動するとIPが変わってアクセスできなくなるので非常に困っている。

このあたりの解決策は別途検討するとして、ホスト端末とWSL2間ではlocalhostでヨロシクやってくれる。ポートフォワーディングをしなくても、例えばWSL2内でHTTPサーバーがポート8080番で起動していたとすると、ホスト側からブラウザでhttp://localhost:8080でアクセスできる。

ホスト側でも8080番でサーバーが起動できてしまうが、優先度的にWSL2が高くてWSL2側のレスポンスが返ってくる。

なので、ホスト端末とWSL2間だけで通信したい場合は、上記のポートフォワーディングはしなくてもいい。

検証したときの簡易Pythonサーバー

#!/usr/bin/env python3
import os
import http.server as serv
from urllib.parse import urlparse
from urllib.parse import parse_qs
port = 8882
host = '0.0.0.0'

class callback(serv.BaseHTTPRequestHandler):
    def do_GET(self):
        parsed = urlparse(self.path)
        params = parse_qs(parsed.query)
        print(parsed)
        print(params)
        body = "hello<br>"
        self.send_response(200)
        self.send_header('Content-type', 'text/html; charset=utf-8')
        self.send_header('Content-length', len(body.encode()))
        self.end_headers()
        
        self.wfile.write(body.encode())
        
httpd = serv.HTTPServer((host, port), callback)
print('start server port=%s' % port)
httpd.serve_forever()

ただとにかくわかりづらく、通信できなくてずっと悩んだりしたので、なんとかしてほしい。