ネットワークネームスペース、ssh、X11

ネットワークネームスペース、ssh、X11

ssh -Y ...あるコンピュータ(=クライアント)から別のコンピュータ(=サーバー、実際には私のLANにはありますが関係ありません)に接続し、サーバー(=サーバー)NNSで新しいネットワーク名前空間を起動します。 (デフォルトの名前空間で)xtermを起動すると、私のクライアントに完全に表示され、最後にxtermでデフォルト以外のNSSを追加します。

ip netns exec NNSName bash

新しい NNS にいることを確認でき、

ip netns identify $$

新しい NNS では、OpenVPN などの複雑なプログラムを実行できます。

問題は次のとおりです。新しいNNSでグラフィカルアプリケーションを起動したいのですがxeyes(一時的に)実行できません。常に次のような言葉を聞いてください。Unable to open DISPLAY=...

もちろん、私は明らかなものだけを試しました:

DISPLAY=:0.0
DISPLAY=:10.0
DISPLAY=localhost:10.0
DISPLAY=localhost:20.0
DISPLAY=ClientName:10.0
DISPLAY=ClientIPAddress:10.0

純粋なデバッグ目的で常にxhost +クライアントに存在します。

私は次のことに問題はありません:

  1. ssh -Y ....サーバーで実行され、クライアントからサーバーへの接続を介してクライアントに表示されます。xeyes

  2. サーバーで新しいNNSを起動し、NNS内でグラフィカルアプリケーションを起動してサーバーに表示します(つまり(この場合、クライアントは忘れてください)。

これら2つ(sshと名前空間)を組み合わせて使用​​すると、サーバーの新しいNNSで実行されているクライアントアプリケーションに表示されることはできません。

標準のTCPポート6010はネイティブNNSを持つsshセッションに属しているようですが、新しいNNSには独自のポートが必要です。もちろん、新しい NNS で ssh サーバーを起動し、クライアントからサーバーの新しい NNS に直接接続できますが、疑問に思います。これを行うより簡単な方法はありますか?つまりクライアントのX11サーバー上のサーバーの新しいNNSで実行されているグラフィックアプリケーションを表示しますか?

答え1

私は同様の状況に直面し、これが私の解決策でした。

背景情報:異なるIPアドレスにバインドするには、名前空間内で複数のSelenium Firefoxインスタンスを拡張する必要があります。しかし、ご存知のようにエラーが発生しました。

Error: Can't open display: localhost:10.0

Mariusが提案したように、UNIXソケットを使用する代わりに、SSHD X11Forwardingをlocalhostの代わりに*にバインドし(設定に「X11UseLocalhost no」を追加します)、socatを使用して単純なTCP接続をリダイレクトしました。

そうする場合は、安全への影響に注意してください! ! !

sshdでこの変更を行った後、次からログインするとディスプレイが自動的に変更されます。

 DISPLAY=localhost:10.0

次の場合:

 DISPLAY=10.0.0.1:10.0

その後はリダイレクトするだけです。

ip netns exec my-NNS socat tcp-listen:6010,reuseaddr,fork tcp:192.168.5.130:6010 &

これにより、xeyes、firefox、x-whatever-you-wantを使用できます。

ip netns exec my-NNS xeyes &

望むより!

答え2

実際、標準的なアプローチはないようです。

最も明確な解決策があります。ネットワーク名前空間内でサーバーを起動し、ssh一般的なオプションを使用してリモートシステムからサーバーに接続します。

ssh -Y [email protected]

その後、リモートシステムのX11サーバー上ですべてのグラフィックプログラムを起動できます。例えば、同じテーマに対する様々な変形vncも可能である。

またはiptables、一般的に使用されるツールである、、netcatを使用できますsocat。これは一つ方法socat:秘密は、localhostサーバーのスペースと新しいネットワーク名前空間が分離されていても、X11 unixソケットは分離されないことです。実際には、ネットワークネームスペースからすぐにグラフィカルアプリケーションを開くことができ、そのアプリケーションは親コンピュータのXサーバーに表示されます。したがって、ネットワークネームスペースを親システムの新しいUnixソケットに書き込むことで、新しいソケットに送信されたデータを次にリダイレクトできます。顧客Xサーバーは、新しいネットワーク名前空間に接続する必要なしに、サーバーシステムからの一般的なSSH X11配信を通じてより簡単なソリューションを提供します。

実行方法は次のとおりです。新しいネットワークネームスペースから

export DISPLAY=:1

/tmp/.X11-unix/X1まだ何も接続されていない新しいUnixソケットに書き込まれます。リモートクライアントで次のコマンドを使用します。

socat exec:'ssh me@remoteserver socat unix-l\:/tmp/.X11-unix/X1 -' unix:/tmp/.X11-unix/X0

(エスケープに注意してください:)。上記のコマンドは、unix/:1サーバーソケットの入力をunix/:0クライアントソケットに送信します。ローカル(=クライアントで)制御を緩め、xhostソケットの所有権を確認(==)する必要があるかもしれません。これは以前の方法よりはるかに簡単です。新しいネットワーク名前空間にSSHサーバーを設定したり、IPアドレスを取得したりする必要はありません。また、特定のリモートユーザーを許可したり、MITマジッククッキーを使用したりするなど、X11認証に関するすべての問題を回避します(これが可能かどうかはわかりません)。unix/:1:1/tmp/.X11-unix/X1xhostsocat

これを行う他の方法もあります(たとえば、-nolisten tcpクライアント:1を抑制する方法)。また、これは想像上の範囲では標準ではありません。

関連情報