XorgにTCPをリッスンさせますが、ローカルホストのみにリッスンさせますか?


12

Xサーバーにアクセスする必要があるXクライアントプログラムがあります。UNIXドメインソケットなどの他の方法ではなく、TCPでのみXサーバーにアクセスできます。物事を簡単にするために、サーバーと同じホストで実行されます。

XorgサーバーがTCPポート6000でリッスンするようにするにはどうすればよいですか?ただし、localhostからの接続のみになりますか?

X.orgにポート6000のリモート接続をリッスンさせる方法を見つけましたか?、リモートホストのアクセスを有効にする方法を説明していますが、リモートアクセスは本当に必要ではありません(主にセキュリティ上の理由から)。

どういうわけかデフォルトのトランスポートをTCPに転送することを考えましたが、デフォルトのトランスポートとは何かについての情報は実際には見つかりませんでした。

(ここではディスプレイマネージャーとしてkdmを使用していますが、ディスプレイマネージャーのソリューションを転送したり、ディスプレイマネージャーを切り替えたりすることもできます。)

何か案は?

これは、11.04のKubuntu-Ubuntu-XUbuntuの混合インストール(元はKubuntuですが、ubuntu-desktopとxubuntu-desktopを追加しました。ブート時にXubuntu 11.04と表示されます)。KDMのgnome-classicデスクトップを使用していると思います。


このXクライアントとは何なのか疑問に思う人にとっては、実際には、別のホストへのX転送を試行するJava SSH実装(JSch)です。Javaは本当にUnixドメインソケットにアクセスできないと思います。同じ問題は、別の(現在一時停止中の)私のプロジェクトにも当てはまります。そこで、純粋なJavaでXクライアントを実装したかった(たとえば、ウィンドウライブラリを使用せずにソケットを読み書きする)。
パエロエベルマン

@ Paulo、javaは実際にUNIXドメインソケット使用できます(必要なsyscallへのアクセスを提供するネイティブライブラリを作成するか、すでに作成されているものを見つけることができます)。しかし、その後、あなたは事実上、Javaの主な利点である高い移植性を失います。したがって、本当に難しい場合は、PFクライアントで動作するXクライアントライブラリをjavaで簡単に作成できます。また、TCP over loopbackインターフェイスには、標準のUNIXソケットよりもはるかに高いオーバーヘッドがあることに注意してください。
-ulidtko

はい、いくつかのライブラリを見つけましたが、実際のUDSアドレスがわからない限り、これは役に立ちません。これはどこかに文書化されていますか?
パエロエベルマン

1
@ Paulo、unixドメインソケットは通常、ファイルシステムの名前空間を使用します。それらのアドレスはファイル名です。それぞれのファイルノードは「特別なソケットファイル」です。私のシステムには、多数の接続あります。/tmp/.X11-unix/X0これ AF_UNIXアドレスの例です(netstat -x自分のアドレスを確認するために使用します)。X11プロトコル仕様は、接続先の正確なアドレスを決定する必要があります。また、そのプロトコルのクライアントライブラリを作成している場合は、必ず読む必要があります。
ulidtko

1
/tmp/.X11-unix/X0ここにもソケット(OpenSUSE)として存在するので、(質問で指定されたUbuntuシステムで)自宅でもう一度確認します。今、私は6000でTCPソケットにこれを転送する方法を参照してくださいする必要があり
サンパウロEbermann

回答:


8

回避策のように見えsocatます。XサーバーがTCPでまだ実行されていない場合に機能するように見えるコマンドラインを次に示します。

socat -d -d TCP-LISTEN:6000,fork,bind=localhost UNIX-CONNECT:/tmp/.X11-unix/X0

それから私はできる

xlogo -display localhost:0

奇妙なことに、6001でリッスンしてから-I getのlocalhost:1代わりにディスプレイを指定すると、動作しないようです。Xプロトコルをもう一度読む必要があるようです。(そしてJSch上ではで終了しますが、これは別の問題です。)localhost:0No protocol specifiedInvalid MIT-MAGIC-COOKIE-1 key


はい!!私が作る方法を探していたxserver-allow-tcp=true Xが既に使用を開始した後 -nolisten tcp/etc/X11/xinit/xserverrc再起動せず。私の場合のみbind=0.0.0.0、外部ホストを許可します。
マルコス

5

Xorgコードには現在、リッスンするインターフェイスを制御するオプションがありません。追加するのは難しくありませんが、他のマシンからポート6000への着信接続をブロックするようにファイアウォールを構成する方が簡単です。


2

ちょっと他の考え...

  1. 許可するが、xhost(および/またはネットワークフィルタリング)でブロックする

これを行う従来の方法は、XサーバーがTCPソケットをリッスンし、xhostを使用して接続が許可されているホストを判別することです。xhost(1)のマニュアルページを参照してください。(もちろん、以前の提案で指摘したように、ここでもIPアドレスとポートフィルタリングが役立ちます。)

  1. ローカルインターフェイスでのみリッスンする

上記のalancのコメントによると、現在コードはありませんが、ほぼ!

(ほとんど)すべてのホストには少なくとも2つのインターフェイス、ループバックインターフェイスlo0(常に127.0.0.1)と通常のイーサネットeth0(またはwlan0または192.168.0.128など)があり、多くのホストにはさらに多くのインターフェイスがあることに注意してください。通常、TCP / IPサーバー(Xサーバー)は、任意のインターフェイス上の任意のIPアドレスへの着信接続を許可しますが、ほとんどのソフトウェアでは、必要に応じてIPアドレスを指定できます。実際の作業は、INADDR_ANY(0.0.0.0)または実際のIPアドレスをとるbind(2)によって行われます。

Xorgサーバーは-name local-addressを実装していますが、残念ながらこれはXDMCP専用です(私の知る限り、これを正しく実装するファイルos / xdmcp.cを参照してください)。ファイル/usr/include/X11/Xtrans/Xtranssock.cで、アドレスをINADDR_ANYに設定し、それ以上処理せずにバインドします。必要なのは、Xtranssock.cのSocketCreateListener()の直前の変数「sockname」に何らかの方法で接続するための-fromフラグ(os / xdmcp.cでFromAddressとして処理される)です。もちろん問題は、すべてのトランスポートが実際にトランスポート中立な方法で行われるため、情報をXtranssock.cに取り込むのは少し難しいことです。

ファイルパスなどは異なる場合があり、Ubuntu 10.04 LTSで見られ、Xtranssock.cの関数名がマクロTRANSによって変更されたことに注意してください。 http://cgit.freedesktop.org/xorg/xserver/tree/os/xdmcp.c

それが役に立つことを願っています。

敬具

ジョナサン。


今のところ、マジッククッキー認証を使用しているため、同じホストからの接続も許可されません。xhostアクセスを縮小するのではなく、アクセスを拡大します。
パエロエベルマン

そして、Xサーバーにハッキングするつもりはありませんが、どこでそれを行うかの提案に感謝します。
パエロエベルマン

9年後、これは変わっていません。gitlab.freedesktop.org/xorg/lib/libxtrans/blob/master/...
daveloyall
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.