web-dev-qa-db-ja.com

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

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

では、どのようにすればTCPポート6000でリッスンするようにXorgサーバーを作成できますが、ローカルホストからの接続のみになりますか?

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

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

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

何か案は?

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

12
Paŭlo Ebermann

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

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

それから私はできる

xlogo -display localhost:0

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

7
Paŭlo Ebermann

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

5
alanc

ちょっと他の考え...

  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を参照してください)。Xプロトコルの実際の接続はSocketINETCreateListenerによって行われます。ファイル/usr/include/X11/Xtrans/Xtranssock.cで、アドレスをINADDR_ANYに設定し、さらに処理することなくアドレスにバインドします。必要なのは、Xtranssock.cのSocketCreateListener()の直前の変数「sockname」に接続するための-fromフラグ(FromAddressとしてos/xdmcp.cによって処理される)です。もちろん、問題は、すべてのトランスポートが実際にトランスポート中立な方法で行われるため、Xtranssock.cに情報を取り込むのは少し難しいことです。

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

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

敬具

ジョナサン。

2
Jonathan