@ledsun blog

Hのキーがhellで、Sのキーがslaveだ、と彼は思った。そしてYのキーがyouだ。

WSL2からWindowsのホストで起動したchromedriverに接続する

2つの壁があります。

  • chromedriverの接続制限
  • Windows Defender ファイアーウォール

chromedriverの接続制限

chromedriverを起動すると次のメッセージが表示されます。

PS C:\Users\led_l> .\Downloads\chromedriver_win32\chromedriver.exe
Starting ChromeDriver 102.0.5005.61 (0e59bcc00cc4985ce39ad31c150065f159d95ad3-refs/branch-heads/5005@{#819}) on port 9515
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
ChromeDriver was started successfully.

Only local connections are allowed.

WSLとWindowsのホストは異なるIPアドレスを持つため接続出来ません。

ChromeDriver - WebDriver for Chrome - Security Considerations

If you need to connect to it from a remote host, use --allowed-ips switch on the command line to specify a list of IP addresses that are allowed to connect to ChromeDriver.

とあります。 --allowed-ipsを使用すればこの制限は回避できます。

ヘルプを見てみましょう。

PS C:\Users\led_l> .\Downloads\chromedriver_win32\chromedriver.exe --help
Usage: C:\Users\led_l\Downloads\chromedriver_win32\chromedriver.exe [OPTIONS]

Options
  --port=PORT                     port to listen on
  --adb-port=PORT                 adb server port
  --log-path=FILE                 write server log to file instead of stderr, increases log level to INFO
  --log-level=LEVEL               set log level: ALL, DEBUG, INFO, WARNING, SEVERE, OFF
  --verbose                       log verbosely (equivalent to --log-level=ALL)
  --silent                        log nothing (equivalent to --log-level=OFF)
  --append-log                    append log file instead of rewriting
  --replayable                    (experimental) log verbosely and don't truncate long strings so that the log can be replayed.
  --version                       print the version number and exit
  --url-base                      base URL path prefix for commands, e.g. wd/url
  --readable-timestamp            add readable timestamps to log
  --enable-chrome-logs            show logs from the browser (overrides other logging options)
  --allowed-ips=LIST              comma-separated allowlist of remote IP addresses which are allowed to connect to ChromeDriver
  --allowed-origins=LIST          comma-separated allowlist of request origins which are allowed to connect to ChromeDriver. Using `*` to allow any host origin is dangerous!

--allowed-ips=LIST comma-separated allowlist of remote IP addresses which are allowed to connect to ChromeDriver

例えば、次のように実行します。

ver. Using `*` to allow any host origin is dangerous!
PS C:\Users\led_l> .\Downloads\chromedriver_win32\chromedriver.exe --allowed-ips=172.24.23.228
Starting ChromeDriver 102.0.5005.61 (0e59bcc00cc4985ce39ad31c150065f159d95ad3-refs/branch-heads/5005@{#819}) on port 9515
Remote connections are allowed by an allowlist (172.24.23.228).
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
ChromeDriver was started successfully.

Remote connections are allowed by an allowlist (172.24.23.228).

設定が反映されていそうな表示がされます。

WSLのIPアドレスは?

設定に必要なWSLのIPアドレスはどうやって得られるでしょうか? Accessing network applications with WSL | Microsoft Docsによると次のコマンドで得られます。

ip addr | grep eth0

WSLで実行してみましょう。

ledsun@MSI:~►ip addr | grep eth0                                                                                   22:52
6: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 172.22.121.198/20 brd 172.22.127.255 scope global eth0

172.22.121.198であることがわかります。 これでchromedriverの接続制限は回避できます。

Windows Defender ファイアーウォール

Windowsからすると、WSLからchromedriverへの接続は外部からのアクセスです。 Windows Defender ファイアーウォールの遮断対象になります。 手っ取り早く接続確認をするには、システムとセキュリティ > Windows Defender ファイアーウォールWindows Defender ファイアーウォールの有効化または無効化を選んで、無効にします。

システムとセキュリティ > Windows Defender ファイアーウォール

接続確認

Windows側でchromedriverを起動します。

PS C:\Users\led_l> .\Downloads\chromedriver_win32\chromedriver.exe --allowed-ips=172.22.121.198
Starting ChromeDriver 102.0.5005.61 (0e59bcc00cc4985ce39ad31c150065f159d95ad3-refs/branch-heads/5005@{#819}) on port 9515
Remote connections are allowed by an allowlist (172.22.121.198).
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
ChromeDriver was started successfully.

WSLからtelnetで接続します。 その前に、WSLからみたWindowsIPアドレスを取得します。

Accessing network applications with WSL | Microsoft Docsによると次のコマンドで得られます。

ledsun@MSI:~►cat /etc/resolv.conf |grep nameserver                                                                 22:56
nameserver 172.22.112.1

あらためてtelnet コマンドを実行します。

ledsun@MSI:~[130]►telnet 172.22.112.1 9515                                                                 12.252s 22:56
Trying 172.22.112.1...
Connected to 172.22.112.1.
Escape character is '^]'.

Connected to 172.22.112.1.

が表示されれば接続成功です。

Trying 172.22.112.1...

で止まってしまった場合は、Windows Defender ファイアーウォールが有効になっていないか確認してみてください。

まとめ

WSLからWindowsホストで起動したchromedirverに接続することは可能でした。 手順がとても面倒なので、できればやりたくない感じなのがわかりました。