Нехай Xorg слухає на TCP, але тільки до localhost?


12

У мене є якась клієнтська програма X, якій потрібен доступ до X-сервера. Доступ до X-сервера має лише TCP, а не іншими методами, такими як сокети домену Unix. Він буде працювати на тому ж хості, що і сервер, щоб полегшити роботу.

Отже, як я можу змусити мій сервер Xorg слухати на порту TCP 6000, але тільки для з'єднань з localhost?

Я знайшов Як змусити X.org слухати віддалені з'єднання на порту 6000? , що пояснює, як дозволити доступ для віддалених хостів, але я не дуже хочу віддалений доступ (в основному з міркувань безпеки).

Я думав про те, щоб якось переслати транспорт за замовчуванням на TCP, але я не знайшов інформації про те, що таке транспорт за замовчуванням.

(Тут я використовую kdm як мій диспетчер дисплеїв, але, думаю, я можу передати рішення для менеджера дисплеїв, або навіть переключити менеджер дисплеїв.)

Будь-які ідеї?

Це 11.04 на змішаній установці Kubuntu-Ubuntu-XUbuntu (спочатку Kubuntu, але я додав ubuntu-desktop і xubuntu-desktop. Під час завантаження зараз йдеться про Xubuntu 11.04). Зараз я використовую класичний робочий стіл gnome, я думаю, від KDM.


Для всіх цікавить, що це за клієнт X: Насправді це реалізація Java SSH ( JSch ), яка намагається зробити переадресацію X на інший хост. Думаю, Java не може отримати доступ до сокетів домену Unix. Ця ж проблема стосуватиметься і іншого (зараз призупиненого) проекту шахти, де я хотів реалізувати клієнт X у чистому Java (наприклад, читаючи / записуючи сокет, не використовуючи деяку бібліотеку вікон).
Paŭlo Ebermann

@Paulo, java насправді може використовувати сокети домену Unix (ви можете написати рідну бібліотеку, яка надасть доступ до необхідних системних дзвінків, або просто знайти вже написане). Але тоді, фіві, ви фактично втрачаєте головну перевагу Java: високу портативність. Отже, якщо вам потрібно було дуже важко, ви можете досить легко написати бібліотеку клієнтів X у Java, яка працюватиме над PF_LOCAL. Зауважимо також, що інтерфейс TCP over loopback має набагато вищі накладні витрати, ніж у стандартного сокета Unix.
ulidtko

Так, я знайшов деякі бібліотеки, але це не допоможе мені, якщо я не знаю фактичної UDS-адреси. Це десь задокументовано?
Paŭlo Ebermann

1
@Paulo, Unix доменних розеток зазвичай використовує простір імен файлової системи. Їх адреси - це імена файлів . Відповідні вузли файлів - це "спеціальні файли сокетів". У моїй системі у мене є численні з'єднання з /tmp/.X11-unix/X0- це є прикладом AF_UNIX адреси (використання , netstat -xщоб побачити свої власні). Специфікація протоколу X11 повинна визначати точні адреси для підключення. І ви дійсно ОБОВ'ЯЗКОВИТИсь, якщо ви пишете клієнтську бібліотеку для цього протоколу
ulidtko

1
/tmp/.X11-unix/X0існує як сокет тут (OpenSUSE), я теж ще раз перевірю вдома (в системі Ubuntu, названій у запитанні). Тепер мені залишається лише побачити, як переслати це до сокета 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щоб дозволити моїм зовнішнім господарям.
Маркос

5

Код Xorg на даний момент не має можливості контролювати інтерфейси для прослуховування. Додавати це не важко, але ще простіше просто налаштувати брандмауер для блокування вхідних з'єднань до порту 6000 з інших машин.


2

Просто деякі інші думки ...

  1. Дозволити це, але заблокувати за допомогою xhost (та / або мережевої фільтрації)

Традиційний спосіб зробити це - для X-сервера прослуховувати сокет TCP і використовувати xhost, щоб визначити, з якими хостами можна підключитися. Дивіться сторінку чоловіка для xhost (1). (Додатково, звичайно, тут допоможуть і IP-адреси та фільтрація портів, як уже зазначалось у попередніх пропозиціях.)

  1. Слухайте лише в локальному інтерфейсі

За коментарем alanc вище, коду зараз там немає, але майже!

Пам’ятайте, що (майже) всі хости мають принаймні два інтерфейси, інтерфейс зворотного циклу lo0 (завжди 127.0.0.1) та звичайний ethernet eth0 (або wlan0 чи що завгодно, що скажемо, 192.168.0.128) та багато інших. Зазвичай TCP / IP-сервери (тобто X-сервер) дозволять вводити з'єднання з будь-якою їх IP-адресою на будь-якому їх інтерфейсі, але більшість програмного забезпечення дозволить вам вказати IP-адресу, якщо ви хочете. Фактична робота виконується шляхом прив’язки (2), яка приймає або INADDR_ANY (0.0.0.0), або реальну IP-адресу.

Сервер Xorg реалізує локальну адресу -name, але, на жаль, це лише для XDMCP (див. Файл os / xdmcp.c, який реалізує його правильно, наскільки я знаю.) Фактичне підключення до протоколу X, я вважаю, здійснює SocketINETCreateListener у файлі /usr/include/X11/Xtrans/Xtranssock.c, який встановлює адресу INADDR_ANY і потім пов'язує з нею без подальшої обробки. Що потрібно, це прапор -from (який обробляється os / xdmcp.c як FromAddress), щоб якось підключитися до змінної 'sockname' перед SocketCreateListener () в Xtranssock.c. Проблема, звичайно, полягає в тому, що всі транспортні речі справді робляться транспортно-нейтральними способами, тому трохи важко отримати інформацію на Xtranssock.c.

Шлях до файлів тощо може бути різним, було розглянуто в Ubuntu 10.04 LTS, і зауважте, що назви функцій у Xtranssock.c змінювались макросом TRANS. http://cgit.freedesktop.org/xorg/xserver/tree/os/xdmcp.c

Сподіваюся, що це приносить користь.

З повагою

Джонатан.


Наразі я використовую магічну автентифікацію файлів cookie, тому навіть з'єднання від одного хоста забороняються. xhostрозширив би доступ, а не зменшив би його.
Paŭlo Ebermann

І я не думаю, що я зламаю свій X-сервер, але дякую за пропозицію, де це зробити.
Paŭlo Ebermann

Через 9 років і це не змінилося. gitlab.freedesktop.org/xorg/lib/libxtrans/blob/master/…
daveloyall
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.