네트워크 네임스페이스, ssh, X11

네트워크 네임스페이스, ssh, X11

ssh -Y ...한 컴퓨터(=클라이언트)에서 다른 컴퓨터(=서버, 실제로 내 LAN에 있지만 관련이 없음)에 연결한 다음 서버(=서버) NNS에서 새 네트워크 네임스페이스를 시작합니다 . (기본 네임스페이스에서) xterm을 시작하면 내 클라이언트에 완벽하게 표시되고 마지막으로 xterm에서 기본이 아닌 NNS를 추가합니다.

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 내에서 그래픽 애플리케이션을 시작하여 서버에 표시합니다(, 이 경우 클라이언트는 잊어버리세요).

이 두 가지(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가 제안한 대로 유닉스 소켓을 사용하는 대신 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 를 억제하는 방법). 또한 이는 상상의 범위에서 표준이 아닙니다.

관련 정보