Czy Xorg nasłuchuje na TCP, ale tylko na lokalnym hoście?

12

Mam jakiś program kliencki X, który potrzebuje dostępu do serwera X. Jest w stanie uzyskać dostęp do serwera X tylko przez TCP, a nie innymi metodami, takimi jak gniazda domeny unix. Będzie działał na tym samym hoście, co serwer, aby ułatwić.

Jak więc zmusić mój serwer Xorg do nasłuchiwania na porcie TCP 6000, ale tylko w przypadku połączeń z hosta lokalnego?

Znalazłem Jak zmusić X.org do słuchania połączeń zdalnych na porcie 6000? , który wyjaśnia, jak włączyć dostęp dla zdalnych hostów, ale tak naprawdę nie chcę dostępu zdalnego (głównie ze względów bezpieczeństwa).

Myślałem o jakimś przekazaniu domyślnego transportu do TCP, ale tak naprawdę nie znalazłem informacji o tym, jaki jest domyślny transport.

(Używam tutaj kdm jako menedżera wyświetlania, ale myślę, że mogę przenieść rozwiązania dla menedżera wyświetlania, a nawet zmienić menedżera wyświetlania.)

Jakieś pomysły?

To jest 11.04 w mieszanej instalacji Kubuntu-Ubuntu-XUbuntu (pierwotnie Kubuntu, ale dodałem ubuntu-desktop i xubuntu-desktop. Podczas uruchamiania mówi teraz Xubuntu 11.04). Myślę, że teraz używam klasycznego pulpitu gnome z KDM.

Paŭlo Ebermann
źródło
Dla wszystkich zastanawiających się, czym jest ten klient X: W rzeczywistości jest to implementacja Java SSH ( JSch ), która próbuje przekierować X na inny host. Myślę, że Java naprawdę nie ma dostępu do gniazd domeny unix. Ten sam problem dotyczyłby również mojego innego (teraz wstrzymanego) projektu, w którym chciałem zaimplementować klienta X w czystej Javie (np. Przez odczyt / zapis gniazda, nie używając jakiejś biblioteki okienkowej).
Paŭlo Ebermann
@Paulo, java faktycznie może korzystać z gniazd domeny unix (możesz napisać rodzimą bibliotekę, która zapewni dostęp do potrzebnych wywołań systemowych lub po prostu znaleźć już napisane). Ale wtedy, fwiw, skutecznie tracisz główną zaletę Java: wysoką przenośność. Więc jeśli naprawdę potrzebujesz, możesz z łatwością napisać bibliotekę klienta X w Javie, która działałaby na PF_LOCAL. Zauważ też, że interfejs TCP over loopback ma znacznie większy narzut niż standardowe gniazdo unix.
ulidtko
Tak, znalazłem kilka bibliotek, ale to mi nie pomoże, dopóki nie znam rzeczywistego adresu UDS. Czy to gdzieś jest udokumentowane?
Paŭlo Ebermann
1
@Paulo, gniazda domeny unix zwykle używają przestrzeni nazw systemu plików. Ich adresy to nazwy plików . Odpowiednie węzły plików to „specjalne pliki gniazd”. W moim systemie mam wiele połączeń z /tmp/.X11-unix/X0- jest to przykład adresu AF_UNIX (użyj, netstat -xaby zobaczyć swój własny). Specyfikacja protokołu X11 powinna określać dokładne adresy do połączenia. I naprawdę MUSISZ go przeczytać, jeśli piszesz bibliotekę klienta dla tego protokołu.
ulidtko
1
/tmp/.X11-unix/X0istnieje również jako gniazdo (OpenSUSE), sprawdzę ponownie w domu (w systemie Ubuntu wymienionym w pytaniu). Teraz muszę tylko zobaczyć, jak przekazać to do gniazda TCP o godzinie 6000.
Paŭlo Ebermann

Odpowiedzi:

8

Wygląda na to, że obejście byłoby przydatne socat. Oto linia poleceń, która wydaje się działać, jeśli serwer X nie działa jeszcze w TCP:

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

Więc mogę to zrobić

xlogo -display localhost:0

O dziwo, wydaje się, że to nie działa, jeśli pozwolę mu słuchać na 6001, a następnie określę wyświetlanie localhost:1zamiast localhost:0- Rozumiem No protocol specified. Wygląda na to, że będę musiał ponownie przeczytać protokół X. (A po JSch to kończy się Invalid MIT-MAGIC-COOKIE-1 key, ale to kolejny problem.)

Paŭlo Ebermann
źródło
Tak!! I szukał sposobu, aby xserver-allow-tcp=true po X już rozpoczął -nolisten tcp się /etc/X11/xinit/xserverrcbez ponownego uruchamiania. Tylko w moim przypadku, bind=0.0.0.0aby zezwolić moim zewnętrznym hostom.
Marcos,
5

Kod Xorg obecnie nie ma żadnej opcji kontrolowania, które interfejsy nasłuchują. Nie powinno być trudne do dodania, ale powinno być jeszcze łatwiej po prostu skonfigurować zaporę ogniową, aby blokować połączenia przychodzące do portu 6000 z innych komputerów.

alanc
źródło
2

Tylko kilka innych myśli ...

  1. Zezwalaj, ale blokuj za pomocą xhost (i / lub filtrowania sieci)

Tradycyjnym sposobem na to jest, aby serwer X nasłuchiwał na gnieździe TCP i używał xhost do ustalenia, które hosty mogą się łączyć. Zobacz stronę podręcznika dla xhost (1). (Dodatkowo, jak wspomniały wcześniejsze sugestie, pomocne byłoby tutaj również filtrowanie adresów IP i portów).

  1. Nasłuchuj tylko na interfejsie lokalnym

Według powyższego komentarza Alanc'a nie ma już kodu, ale prawie!

Pamiętaj, że (prawie) wszystkie hosty mają co najmniej dwa interfejsy, interfejs pętli zwrotnej lo0 (zawsze 127.0.0.1) i normalny ethernet eth0 (lub wlan0 lub cokolwiek, co powiedzmy 192.168.0.128), a wielu ma więcej. Zwykle serwery TCP / IP (tj. Serwer X) zezwalają na połączenia przychodzące na dowolny z ich adresów IP na dowolnym interfejsie, ale większość oprogramowania pozwala ci podać adres IP, jeśli chcesz. Rzeczywista praca jest wykonywana przez bind (2), który przyjmuje INADDR_ANY (0.0.0.0) lub prawdziwy adres IP.

Serwer Xorg implementuje -name adres-lokalny, ale niestety jest to tylko dla XDMCP (patrz plik os / xdmcp.c, który implementuje go poprawnie, o ile wiem). Rzeczywiste połączenie dla protokołu X, jak sądzę, jest realizowane przez SocketINETCreateListener w pliku /usr/include/X11/Xtrans/Xtranssock.c, który ustawia adres na INADDR_ANY, a następnie łączy się z nim bez dalszego przetwarzania. Potrzebna byłaby flaga -from (którą zajmuje się os / xdmcp.c jako FromAddress), aby jakoś połączyć się ze zmienną „sockname” tuż przed SocketCreateListener () w Xtranssock.c. Problem polega oczywiście na tym, że wszystkie rzeczy związane z transportem są naprawdę wykonywane w sposób neutralny dla transportu, więc wprowadzenie informacji do Xtranssock.c jest nieco trudne.

Ścieżki do plików i tak dalej mogą się różnić, przeglądano w Ubuntu 10.04 LTS i zauważ, że nazwy funkcji w Xtranssock.c zostały zmienione przez makro TRANS. http://cgit.freedesktop.org/xorg/xserver/tree/os/xdmcp.c

Mam nadzieję, że to się przyda.

Z poważaniem

Jonathan.

Jonathan
źródło
Na razie korzystam z magicznego uwierzytelniania plików cookie, dlatego nawet połączenia z tego samego hosta nie będą dozwolone. xhostposzerzy dostęp, a nie zmniejszy go.
Paŭlo Ebermann
I nie sądzę, że włamię się na mój serwer X, ale dziękuję za sugestię, gdzie to zrobić.
Paŭlo Ebermann
9 lat później i to się nie zmieniło. gitlab.freedesktop.org/xorg/lib/libxtrans/blob/master/…
daveloyall