Пусть 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-classic рабочий стол из KDM.

Похоже, что обходным путем будет использование 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:1 вместо localhost:0 – я не получаю No protocol specified . Кажется, мне придется снова прочитать протокол X. (И над JSch он завершает работу с Invalid MIT-MAGIC-COOKIE-1 key , но это еще одна проблема.)

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

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

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

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

  1. Только слушать локальный интерфейс

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

Помните, что (почти) все хосты имеют по крайней мере два интерфейса, loopback-интерфейс 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, но, к сожалению, это только для 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

Надеюсь, это полезно.

С уважением

Джонатан.