Xorg가 TCP를 듣도록하고 로컬 호스트 만 듣도록 하시겠습니까?


12

X 서버에 액세스해야하는 X 클라이언트 프로그램이 있습니다. 유닉스 도메인 소켓과 같은 다른 방법이 아닌 TCP를 통해서만 X 서버에 접근 할 수 있습니다. 서버와 동일한 호스트에서 실행되므로 작업이 쉬워집니다.

그렇다면 Xorg 서버가 TCP 포트 6000에서 수신 대기하고 로컬 호스트의 연결에 대해서만 수신하도록하려면 어떻게해야합니까?

X.org가 포트 6000에서 원격 연결을 수신하도록하는 방법을 찾았 습니까? , 원격 호스트에 대한 액세스를 활성화하는 방법을 설명하지만 실제로는 보안상의 이유로 원격 액세스를 원하지 않습니다.

어떻게 든 기본 전송을 TCP로 전달하는 것에 대해 생각했지만 기본 전송이 무엇인지에 대한 정보를 찾지 못했습니다.

(여기서 kdm을 디스플레이 관리자로 사용하고 있지만 디스플레이 관리자 용 솔루션을 전송하거나 디스플레이 관리자를 전환 할 수 있다고 생각합니다.)

어떤 아이디어?

이것은 Kubuntu-Ubuntu-XUbuntu 혼합 설치 (원래 Kubuntu에서 11.04에 있지만 우분투 데스크탑과 xubuntu-desktop을 추가했습니다. 부팅시 Xubuntu 11.04라고 말합니다). 나는 이제 KDM의 gnome-classic 데스크톱을 사용하고 있다고 생각합니다.


이 X 클라이언트가 무엇인지 궁금해하는 사람들을 위해 : 실제로 다른 호스트로 X 전달을 시도 하는 Java SSH 구현 ( JSch )입니다. 자바는 실제로 유닉스 도메인 소켓에 액세스 할 수 없다고 생각합니다. 동일한 문제가 다른 (현재 일시 중지 된) 내 프로젝트에도 적용됩니다. 여기서 순수한 Java로 X 클라이언트를 구현하고 싶었습니다 (예 : 창 라이브러리를 사용하지 않고 소켓을 읽거나 쓰면).
Paŭlo Ebermann

@Paulo, java는 실제로 유닉스 도메인 소켓을 사용할 있습니다 (필요한 syscall에 액세스 할 수있는 네이티브 라이브러리를 작성하거나 이미 작성된 것을 찾을 수 있습니다). 그러나 다음으로 자바의 주요 이점 인 높은 이식성을 효과적으로 잃게됩니다. 따라서 정말로 열심히 필요하다면 PF_LOCAL에서 작동하는 X 클라이언트 라이브러리를 java로 쉽게 작성할 수 있습니다. 또한 TCP over 루프백 인터페이스는 표준 unix 소켓보다 훨씬 높은 오버 헤드를가집니다.
ulidtko

예, 일부 라이브러리를 찾았지만 실제 UDS 주소를 모르는 한 도움이되지 않습니다. 이것은 어딘가에 기록되어 있습니까?
Paŭlo Ebermann

1
@Paulo, 유닉스 도메인 소켓은 일반적으로 파일 시스템의 네임 스페이스를 사용합니다. 그들의 주소는 filenames 입니다. 각 파일 노드는 "특수 소켓 파일"입니다. 내 시스템에 나는 수많은 연결이 /tmp/.X11-unix/X0-이 입니다 (사용 AF_UNIX 주소의 예를 들어 netstat -x자신을 볼 수). X11 프로토콜 사양은 연결할 정확한 주소를 결정해야합니다. 해당 프로토콜의 클라이언트 라이브러리를 작성하는 경우 반드시 읽어야합니다.
ulidtko

1
/tmp/.X11-unix/X0여기 소켓 (OpenSUSE)으로 존재합니다. 나는 집에서 (질문에 명명 된 우분투 시스템에서) 다시 확인하겠습니다. 이제 6000에서 TCP 소켓으로 이것을 전달하는 방법
만보아야합니다

답변:


8

해결 방법이의 사용 인 것 같습니다 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되지만 이것은 또 다른 문제입니다.)


예!! 내가 만들 수있는 방법을 찾고 있었다 xserver-allow-tcp=true X가 이미 시작 된 후 -nolisten tcp/etc/X11/xinit/xserverrc다시 시작하지 않고. 내 경우에만 bind=0.0.0.0외부 호스트를 허용합니다.
Marcos

5

Xorg 코드에는 현재 어떤 인터페이스를 수신할지 제어 할 수있는 옵션이 없습니다. 추가하는 것은 어렵지 않지만 다른 컴퓨터에서 포트 6000으로 들어오는 연결을 차단하도록 방화벽을 구성하는 것이 훨씬 쉬워야합니다.


2

다른 생각들 ...

  1. 허용하지만 xhost (및 / 또는 네트워크 필터링)로 차단

이를 수행하는 일반적인 방법은 X 서버가 TCP 소켓에서 수신 대기하고 xhost를 사용하여 연결할 수있는 호스트를 판별하는 것입니다. xhost (1)에 대한 매뉴얼 페이지를 참조하십시오. (또한, 이전 제안에서 언급했듯이 IP 주소 및 포트 필터링도 여기에서 도움이 될 것입니다.)

  1. 로컬 인터페이스에서만 청취

위의 alanc의 의견에 따르면 현재 코드는 없지만 거의 있습니다!

(거의) 모든 호스트에는 루프백 인터페이스 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로 설정 한 후 추가 처리없이 바인딩합니다. -from 플래그 (os / xdmcp.c에서 FromAddress로 처리)는 Xtranssock.c에서 SocketCreateListener () 바로 앞에 변수 'sockname'에 연결하는 것입니다. 물론 문제는 모든 전송 작업이 전송 중립적 인 방식으로 수행되므로 정보를 Xtranssock.c로 가져 오는 것이 약간 까다 롭다는 것입니다.

파일 경로 등은 다를 수 있으며 Ubuntu 10.04 LTS에서 살펴본 결과 Xtranssock.c의 함수 이름은 매크로 TRANS에 의해 변경되었습니다. http://cgit.freedesktop.org/xorg/xserver/tree/os/xdmcp.c

그것이 약간의 사용이 되길 바랍니다.

친절한 안부

홍옥.


지금은 매직 쿠키 인증을 사용하고 있으므로 동일한 호스트의 연결조차도 허용되지 않습니다. xhost축소하지 않고 액세스를 넓 힙니다.
Paŭlo Ebermann 2016 년

그리고 나는 X 서버를 해킹 할 것이라고 생각하지 않지만 그렇게 할 곳에 대한 제안에 감사드립니다.
Paŭlo Ebermann 2016 년

9 년 후에도 변경되지 않았습니다. gitlab.freedesktop.org/xorg/lib/libxtrans/blob/master/…
daveloyall
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.