Пусть Xorg прослушивает TCP, но только на localhost?

У меня есть программа для 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.

12
задан 13 April 2017 в 15:23

3 ответа

Код Xorg в настоящее время не имеет никакой возможности контролировать, какие интерфейсы слушать. Это не должно быть сложно добавить, но должно быть еще проще просто настроить брандмауэр, чтобы блокировать входящие подключения к порту 6000 с других компьютеров.

0
ответ дан 13 April 2017 в 15:23

Просто некоторые другие мысли ...

  1. Разрешить, но блокировать с помощью xhost (и / или сетевой фильтрации)

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

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

За комментарий Аланса выше сейчас там нет кода, но почти!

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

Сервер Xorg реализует -name local-address, но, к сожалению, это только для 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

Надеюсь, что это пригодится.

С наилучшими пожеланиями

Джонатан.

0
ответ дан 13 April 2017 в 15:23

Похоже, что обходным путем будет использование 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, но это еще одна проблема.)

0
ответ дан 13 April 2017 в 15:23

Другие вопросы по тегам:

Похожие вопросы: