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 +
クライアントに存在します。
私は次のことに問題はありません:
ssh -Y ....
サーバーで実行され、クライアントからサーバーへの接続を介してクライアントに表示されます。xeyes
サーバーで新しい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/X1
xhost
socat
これを行う他の方法もあります(たとえば、-nolisten tcp
クライアント:1
を抑制する方法)。また、これは想像上の範囲では標準ではありません。