VcXsrvを起動したのにリモートで起動したアプリが表示されなくてハマった

June 04, 2022

Windowsマシン上でVcXsrvというXサーバを起動すれば、リモートのLinuxマシンで環境変数DISPLAYに”windowsマシンのIP:0.0″をexportしてアプリ(X11アプリケーション)を起動すると、Windowsマシン上の画面に表示されるはずが、表示されない、という現象に遭遇しました。

Xサーバのポートは6000から割り当てられるそうなので、Linuxマシンから”nc -vz WindowsマシンのIP 6000″というコマンドで疎通確認をしてみたところ、タイムアウトしました。どうやらWindowsマシン上の6000ポートが解放されていないか、そもそもXサーバがListenしていな模様。

原因を特定するため、Windowsマシンのコマンドプロンプトから”netstat -an”というコマンドでLISTENING状態にあるポートを調べたら、6000ポートがありました。具体的には”TCP 0.0.0.0:6000 0.0.0.0:0 LISTENING”のように表示されました。よって、VcXsrvは問題なく起動しており、6000ポートで待ち受けているようです。また、VcXsrvは起動するときのWizardでいろいろ設定できますが、その中で”Disable access control”をチェックしていましたので、VcXsrv側がアクセスを拒否しているとは考えられません。疎通確認ではタイムアウトしていましたので、そもそもアクセスしていないと思いますが。以上のことから、VcXsrvは問題ないと判断しました。

ということは、Windowsファイアウォールが怪しい。設定→ネットワークとインターネット→Windowsファイアウォール→詳細設定とたどっていくとたどり着く「セキュリティが強化されたWindows Defender ファイアウォール」の設定画面で、受信の規則にあるVcXsrv windows xserverをダブルクリックしてみた確認したところ、「接続を許可する」になっていました。あれ?ブロックされていない、と思い、一旦はファイアウォール以外に原因があるかと思ってほかにも探ってみましたが、結局わからず。で、もう一回このプロパティをみたところ、「詳細設定」のタブで、プロファイルが「パブリック」になってました。つまり、パブリックなネットワーク(識別されていないネットワークが割り当てられる模様)に接続されたPCからのアクセスでないと、この規則は適用されない、ということになります。リモートのLinuxマシンは、プライベートなネットワーク上にいますので、この規則は当然適用されないことになります。そこで、このプロファイルを「プライベート」に変えてみたところ、リモートで実行したアプリがWindows上に表示されるようになりました。