WSL2の中のX clientから VcXsrv に xauth で接続したい

投稿者: Anonymous

WSLでUbuntu18.04 を使っています。WSLからWSL2に上げてみたところ、VcXsrvに接続できなくなりました。

magic cookieを用いた昔ながらのリモート接続を実現しようとしていますが、うまくできません。
Xサーバの側でセキュリティチェックを全部外せば動くので、実用上はそれでもよいのですが、動かない理由が分からないのが気持ち悪いので、できたら解明したいと思っています。

いままでは WSL の中から DISPLAY=localhost:0.0 につなぎにいくと、Windows側のVcXsrvにつなぎに行っていました。これは、WSLではIPのスタックがWindowsのものだったため、成り立っていました。VcXsrvではローカルマシンからの接続はうけつけています。それはxhostで確認できます。

C:Program FilesVcXsrv>set DISPLAY=localhost:0.0

C:Program FilesVcXsrv>xhost
access control enabled, only authorized clients can connect
INET:myhost.mshome.net
LOCAL:
INET:myhost
INET6:myhost

追記:いただいたコメントを参考に、xhostベースで、WSL2からのアクセスのみ許可するやり方がわかりましたので、末尾に書きます。

WSL2になり、IPのスタックがWindowsと独立になり、WindowsとWSL2とではIPとしては別ホストになりました。IPアドレスをそれぞれで確認すると、Windowsでは次のようになります。

C:Program FilesVcXsrv>ipconfig /all

Windows IP 構成

   ホスト名. . . . . . . . . . . . . . .: myhost
...
イーサネット アダプター イーサネット:
...
   IPv4 アドレス . . . . . . . . . . . .: 192.168.100.13(優先)

WSL2側では次のようになります。

$ ip a
...
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
...
    inet 172.18.66.30/20 brd 172.18.79.255 scope global eth0
       valid_lft forever preferred_lft forever

そのため、DISPLAY=localhost:0.0 では、少なくとも動きません。

$ export DISPLAY=localhost:0.0
$ xclock
Error: Can't open display: localhost:0.0

DISPLAYにWindowsのIPアドレスを指定すると(予想通り)認証を通過できずに拒絶されます:

$ export DISPLAY=192.168.100.13:0.0
$ xclock
Authorization required, but no authorization protocol specified
Error: Can't open display: 192.168.100.13:0.0

この場合、Xサーバ側でcookieを生成し、それをクライアント側の .Xauthority に登録しておけばつながるはずと考えました。

Xのセッションで magic cookie がどのタイミングで作られるのか、知らないのですが、ふつうはgdmなどのディスプレイマネージャが作成するという記述を見かけました。
vcxsrvに付属のランチャーコマンドXLaunchを単に実行しただけでは .Xauthority ファイルは特に作られませんでした。

そこで、Windows側でxauth generate を使ってcookieを生成してみました。

C:Program FilesVcXsrv>xauth generate localhost:0.0
xauth:  file usershideo.Xauthority does not exist

C:Program FilesVcXsrv>xauth list
myhost/unix:0  MIT-MAGIC-COOKIE-1  c97dd91b6d02fdf4e4717b2b450b354f

C:Program FilesVcXsrv>

これをWSL2側で $HOME/.Xauthority に追加してみます。(ローカルなDNSを立てており、適当なドメイン名でIPは引くことができます)

$ hostname
myhost
$ xauth add 192.168.100.13:0.0 . c97dd91b6d02fdf4e4717b2b450b354f
xauth:  file /home/hideo/.Xauthority does not exist
$ xauth list
myhost.hidehome.net:0  MIT-MAGIC-COOKIE-1  c97dd91b6d02fdf4e4717b2b450b354f
$ export DISPLAY=192.168.100.13:0.0
$ xclock
Invalid MIT-MAGIC-COOKIE-1 keyError: Can't open display: 192.168.100.13:0.0
$ export DISPLAY=myhost.hidehome.net:0.0
$ xclock
Invalid MIT-MAGIC-COOKIE-1 keyError: Can't open display: skylake-win.hidehome.net:0.0

xauthの使い方を正しく理解できていない気がしているのが、動かせている方がいたら教えてください。

この質問を書いている途中で、xhostを使ってWSL2からやってくるリクエストを全部受け付けるようにできるのではないかと思いましたので、試みましたが、xhostが要求を受け付けてくれませんでした。

C:Program FilesVcXsrv>set DISPLAY=localhost:0.0

C:Program FilesVcXsrv>xhost +inet:172.18.66.30
172.18.66.30 being added to access control list
xhost:  must be on local machine to add or remove hosts.

C:Program FilesVcXsrv>set DISPLAY=

C:Program FilesVcXsrv>xhost +inet:172.18.66.30
xhost:  unable to open display ""

C:Program FilesVcXsrv>

解決

cookie を生成する時に、xauth generate localhost:0.0 . timeout 0 のように、timeout 0を指定してみて下さい。利用するアプリケーションによっては、xauth generate localhost:0.0 . trusted timeout 0 のようにtrustedも指定する必要があるかもしれません。

timeoutのデフォルト値は60(秒)であり、cookieを生成してから利用するまでに60秒以上かかっている事からエラーになっていると思われます。
ドキュメントには 0 で無期限になるという記述が見当たりませんが、手元で試した感じでは大丈夫そうです。
もし駄目ならば、86400 等の十分に大きい値を指定してみて下さい。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *