Deixe o Xorg ouvir no TCP, mas apenas no localhost?

11

Eu tenho algum programa cliente X que precisa de acesso a um servidor X. Só é capaz de acessar o servidor X pelo TCP, não por outros métodos, como sockets de domínio unix. Ele será executado no mesmo host do servidor, para facilitar as coisas.

Então, como posso fazer meu servidor Xorg escutar na porta TCP 6000, mas apenas para conexões de localhost?

Eu encontrei Como fazer com que o X.org ouça conexões remotas na porta 6000? , o que explica como ativar o acesso para hosts remotos, mas eu realmente não quero acesso remoto (por motivos de segurança, principalmente).

Pensei em encaminhar de alguma forma o transporte padrão para o TCP, mas realmente não encontrei informações sobre o transporte padrão.

(Estou usando o kdm como meu gerenciador de exibição aqui, mas acho que posso transferir soluções para o gerenciador de exibição ou até mesmo para alternar o gerenciador de exibição.)

Alguma idéia?

Isso é no 11.04 em uma instalação mista do Kubuntu-Ubuntu-XUbuntu (originalmente o Kubuntu, mas eu adicionei o ubuntu-desktop e o xubuntu-desktop. Na inicialização, ele agora está dizendo o Xubuntu 11.04). Agora estou usando o desktop gnome-classic, do KDM.

    
por Paŭlo Ebermann 08.05.2011 / 20:51

3 respostas

7

Parece que uma solução alternativa seria o uso de socat . Aqui está uma linha de comando que parece funcionar, se o servidor X ainda não rodar no TCP:

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

Então eu posso fazer

xlogo -display localhost:0

Estranhamente, parece que não funciona se eu deixar ouvir em 6001 e, em seguida, especificar a exibição localhost:1 em vez de localhost:0 - recebo No protocol specified . Parece que vou ter que ler o protocolo X novamente. (E sobre JSch, em seguida, sai com Invalid MIT-MAGIC-COOKIE-1 key , mas isso é outro problema.)

    
por Paŭlo Ebermann 10.05.2011 / 16:17
5

O código Xorg atualmente não possui nenhuma opção para controlar quais interfaces devem ser ouvidas. Não deve ser difícil adicionar, mas deve ser ainda mais fácil simplesmente configurar seu firewall para bloquear conexões de entrada para a porta 6000 de outras máquinas.

    
por alanc 09.05.2011 / 05:32
1

Apenas alguns outros pensamentos ...

  1. Permitir, mas bloquear com xhost (e / ou filtragem de rede)

A maneira tradicional de fazer isso é o servidor X escutar no soquete TCP e usar xhost para determinar quais hosts podem se conectar. Veja man page para xhost (1). (Além disso, é claro, o endereço IP e a filtragem de porta também ajudariam aqui, conforme observado por sugestões anteriores.)

  1. Apenas ouça na interface local

Por comentário de alanc acima, não há código agora, mas quase!

Lembre-se de que (quase) todos os hosts têm pelo menos duas interfaces, a interface de loopback lo0 (sempre 127.0.0.1) e a ethernet normal eth0 (ou wlan0 ou o que quer que seja, 192.168.0.128) e muitos têm mais. Geralmente, os servidores TCP / IP (ou seja, o servidor X) permitem conexões de entrada para qualquer um dos seus endereços IP em qualquer uma de suas interfaces, mas a maioria dos softwares permite que você especifique um endereço IP, se desejar. O trabalho real é feito por bind (2), que leva INADDR_ANY (0.0.0.0) ou um endereço IP real.

O servidor Xorg implementa -name local-address mas infelizmente isso é somente para o XDMCP (veja o arquivo os / xdmcp.c que o implementa corretamente até onde eu sei). A conexão real para o protocolo X, eu acredito, é feito por SocketINETCreateListener no arquivo /usr/include/X11/Xtrans/Xtranssock.c, que define o endereço para INADDR_ANY e, em seguida, vincula a ele sem processamento adicional. O que seria necessário é o sinalizador -from (que é tratado por os / xdmcp.c como FromAddress) para conectar-se de alguma forma à variável 'sockname' antes de SocketCreateListener () em Xtranssock.c. O problema, é claro, é que todas as coisas de transporte são realmente feitas de uma maneira neutra em termos de transporte, então é um pouco complicado obter as informações no Xtranssock.c

Os caminhos de arquivo e assim por diante podem variar, foi examinado com o Ubuntu 10.04 LTS e observe que os nomes de função no Xtranssock.c foram alterados por uma macro TRANS. link

Espero que seja de alguma utilidade.

Atenciosamente

Jonathan.

    
por Jonathan 01.06.2011 / 20:03