Network Users' Group ``wheel'' / Dai ISHIJIMA's Page /
ネットワーク系情報 / Ubuntu LinuxのXorgでTCPをlistenさせる方法

初版: 2025-10-27
最終更新日: 2025-10-29


Ubuntu LinuxのXorgでTCP(6000-)をListenする方法


☆はじめに

Ubuntu Linux 22.04.5LTSでは、 セキュリティ向上のため、XサーバであるXorgはTCPをリスンしない設定 「-nolisten tcp」で動いています。 このページでは、セキュリティレベルは下がりますが、 他のクライアントからの要求を受ける設定を紹介します。


☆初期設定では

初期設定では、Xorgに「-nolisten tcp」オプションが付加されて動いています。 これは「ps axlw | grep Xorg」などのコマンドで確認できます。 たとえば、IDが9999番のユーザであれば
/usr/lib/xorg/Xorg vt2 -displayfd 3 -auth /run/user/9999/gdm/Xauthority -nolisten tcp -background none -noreset -keeptty -novtswitch -verbose 3
という具合です。


☆「-nolisten tcp」を外すには

Xorgのオプションで「-nolisten tcp」を外すには、 gdm3の設定ファイルである「/etc/gdm3/custom.conf」を編集します。 「[security]」の項目に「DisallowTCP = false」を記入し
[security]
DisallowTCP = false
とします。

この設定ファイル「/etc/gdm3/custom.conf」を編集したあと

sudo /etc/init.d/gdm3 restart
などとすると、現在のログインセッションが切れます。 そして、再ログインして「ps axlw | grep Xorg」などで確認すると
/usr/lib/xorg/Xorg vt2 -displayfd 3 -auth /run/user/9999/gdm/Xauthority -background none -noreset -keeptty -novtswitch -verbose 3
となります。ただし「-listen tcp」も付かない状態です。


☆「-listen tcp」を付けるには

TCPの6000番台をリスンするためには、 明示的に「-listen tcp」を付ける必要がありそうです。 これは「/usr/bin/Xorg」スクリプトを編集します。
#!/bin/sh
#
# Execute Xorg.wrap if it exists otherwise execute Xorg directly.
# This allows distros to put the suid wrapper in a separate package.

basedir=/usr/lib/xorg
if [ -x "$basedir"/Xorg.wrap ]; then
	exec "$basedir"/Xorg.wrap "$@" -listen tcp
else
	exec "$basedir"/Xorg "$@" -listen tcp
fi
「"$@"」で渡されるオプションに、さらに「-listem tcp」を追記します。

このように「/usr/bin/Xorg」スクリプトを編集したあと、 再ログインすると、

/usr/lib/xorg/Xorg vt2 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -background none -noreset -keeptty -novtswitch -verbose 3 -listen tcp
のように「-listen tcp」を付けてXorgが動きます。


☆「xhost」で他のクライアントからの要求を受け付けるようにする

動いているXサーバが他のクライアントからの要求を受けるためには、 明示的にそのクライアントを指定するか、 セキュリティは下がりますが、どのクライアントからも要求を受ける、 いわゆる「総受け」状態にします。 詳細は「xhost」コマンドのマニュアルを参照してください。 「総受け」状態にするなら
xhost +
とします。


☆$DISPLAYでクライアントからの要求を出すXサーバを指定する

クライアントがどのXサーバに接続するかは 「$DISPLAY」環境変数で決定します。 通常は「:0.0」などが設定されており、 クライアントは自サーバに要求を出します。

他のサーバでクライアントを表示したい場合は、 たとえば、Xサーバが192.168.100.10で動いているのであれば、 「$DISPLAY」に「192.168.100.10:0」といった値を指定します。 bsh系であれば

export DISPLAY=192.168.100.10:0
とし、csh系であれば
setenv DISPLAY 192.168.100.10:0
とします。


☆Xephyrなどを使う場合は

Xサーバ上で入れ子的にXサーバを動かすXephyrコマンドなどを使う場合は、 ディスプレイ番号を明示的に指定して、 さらに「-listen tcp」オプションを渡します。 たとえば、3番でXephyrを動かすのであれば、
Xephyr :3 -listen tcp
のようにします。 詳細はXephyrのマニュアルを参照してください。

このXephyrに表示したい場合は、 「$DISPLAY」に「192.168.100.10:3」のように、 IPアドレスに「:」を付けてディスプレイ番号を指定します。


☆なぜXサーバで直接TCPをListenするか

多くの場合、こういう設定は必要ではありません。 Xサーバが動いているクライアントから、 (処理能力のある他の)サーバPCにリモートログインする際、 SSHを使えばX over SSHでサーバPCで動くXクライアントを 手元にあるXサーバが動いているPCのスクリーンに動かすことか可能です。

しかし、ある種のXクライアント(たとえば、C●MS●Lなど)は、 直接Xサーバと通信しないと描画をしません。 そのような場合は、セキュリティが下がりますが、 こういった設定が役に立ちます。 「xhost」コマンドを上手に使って、関係ないクライアントが 手元のXサーバにアクセスしないようにして使ってください。