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.
/tmp/.X11-unix/X0
- jest to przykład adresu AF_UNIX (użyj,netstat -x
aby 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./tmp/.X11-unix/X0
istnieje 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.Odpowiedzi:
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:Więc mogę to zrobić
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:1
zamiastlocalhost:0
- RozumiemNo 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.)źródło
xserver-allow-tcp=true
po X już rozpoczął-nolisten tcp
się/etc/X11/xinit/xserverrc
bez ponownego uruchamiania. Tylko w moim przypadku,bind=0.0.0.0
aby zezwolić moim zewnętrznym hostom.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.
źródło
Tylko kilka innych myśli ...
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).
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.
źródło
xhost
poszerzy dostęp, a nie zmniejszy go.