Eu tenho algum programa cliente X que precisa acessar um servidor X. Ele só pode acessar o servidor X por TCP, não por outros métodos, como soquetes de domínio unix. Ele será executado no mesmo host que o servidor, para facilitar as coisas.
Então, como posso fazer meu servidor Xorg escutar na porta TCP 6000, mas apenas para conexões do host local?
Encontrei Como fazer o X.org ouvir conexões remotas na porta 6000? , que explica como habilitar o acesso a hosts remotos, mas eu realmente não quero acesso remoto (principalmente por razões de segurança).
Pensei em encaminhar de alguma forma o transporte padrão para o TCP, mas não encontrei informações sobre qual é 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é mudar o gerenciador de exibição.)
Alguma ideia?
Isso ocorre no 11.04 em uma instalação mista do Kubuntu-Ubuntu-XUbuntu (originalmente Kubuntu, mas eu adicionei o ubuntu-desktop e o xubuntu-desktop. Na inicialização, agora está dizendo o Xubuntu 11.04). Agora estou usando a área de trabalho gnome-clássica, eu acho, do KDM.
/tmp/.X11-unix/X0
- este é um exemplo de endereço AF_UNIX (usenetstat -x
para ver o seu). A especificação do protocolo X11 deve determinar os endereços exatos aos quais se conectar. E você realmente DEVE lê-lo se estiver escrevendo a biblioteca do cliente para esse protocolo./tmp/.X11-unix/X0
existe como um soquete aqui (OpenSUSE), também, vou verificar novamente em casa (no sistema Ubuntu mencionado na pergunta). Agora eu só tenho que ver como encaminhar isso para um soquete TCP em 6000.Respostas:
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 estiver em execução no TCP:Então eu posso fazer
Estranhamente, não parece funcionar se eu o deixar ouvir no 6001 e depois especificar a exibição em
localhost:1
vez delocalhost:0
- eu entendoNo protocol specified
. Parece que vou ter que ler o protocolo X novamente. (E, em JSch, ele termina comInvalid MIT-MAGIC-COOKIE-1 key
, mas esse é outro problema.)fonte
xserver-allow-tcp=true
após X já havia sido iniciado com-nolisten tcp
em/etc/X11/xinit/xserverrc
sem reiniciar. Apenas no meu caso,bind=0.0.0.0
para permitir meus hosts externos.O código Xorg atualmente não tem nenhuma opção para controlar em quais interfaces escutar. 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.
fonte
Apenas alguns outros pensamentos ...
A maneira tradicional de fazer isso é o servidor X escutar no soquete TCP e usar o xhost para determinar quais hosts têm permissão para se conectar. Veja a página de manual do xhost (1). (Além disso, é claro, o endereço IP e a filtragem de portas também ajudariam aqui, como as sugestões anteriores observaram.)
Pelo comentário de Alan acima, não há código lá 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 qualquer outra coisa, digamos que seja 192.168.0.128) e muitos têm mais. Geralmente, os servidores TCP / IP (ou seja, servidor X) permitem conexões de entrada com qualquer um dos seus endereços IP em qualquer uma das suas interfaces, mas a maioria dos softwares permite especificar um endereço IP, se desejar. O trabalho real é realizado pelo bind (2), que utiliza INADDR_ANY (0.0.0.0) ou um endereço IP real.
O servidor Xorg implementa -name local-address, mas infelizmente isso é apenas para o XDMCP (consulte o arquivo os / xdmcp.c que o implementa corretamente, tanto quanto eu sei.) A conexão real para o protocolo X, acredito, é feita por SocketINETCreateListener no arquivo /usr/include/X11/Xtrans/Xtranssock.c, que define o endereço como INADDR_ANY e depois o vincula sem processamento adicional. O que seria necessário é o sinalizador -from (que é tratado por os / xdmcp.c como FromAddress) para, de alguma forma, conectar-se à variável 'sockname' antes de SocketCreateListener () no Xtranssock.c. O problema, é claro, é que todas as coisas de transporte são realmente feitas de maneira neutra ao transporte, por isso é um pouco complicado colocar as informações no Xtranssock.c.
Os caminhos dos arquivos e assim por diante podem variar, foram observados no Ubuntu 10.04 LTS e observe que os nomes das funções no Xtranssock.c foram alterados por uma macro TRANS. http://cgit.freedesktop.org/xorg/xserver/tree/os/xdmcp.c
Espero que seja de alguma utilidade.
Atenciosamente
Jonathan.
fonte
xhost
ampliaria o acesso, não o diminuiria.