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

12

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.

Paŭlo Ebermann
fonte
Para todos que se perguntam o que é esse cliente X: Na verdade, é uma implementação Java SSH ( JSch ) que tenta fazer o encaminhamento do X para outro host. Java não pode realmente acessar soquetes de domínio unix, eu acho. O mesmo problema também se aplicaria a outro projeto (agora pausado), onde eu queria implementar um cliente X em Java puro (por exemplo, lendo / gravando um soquete, sem usar alguma biblioteca de janelas).
Paŭlo Ebermann
@Paulo, o java realmente pode usar soquetes de domínio unix (você pode escrever uma biblioteca nativa que fornecerá acesso aos syscalls necessários ou apenas encontre já gravados). Mas então, fwiw, você perde efetivamente o principal benefício do java: alta portabilidade. Portanto, se você precisasse muito, poderia escrever com facilidade a biblioteca do cliente X em java, que funcionaria sobre PF_LOCAL. Observe também que a interface TCP over loopback tem uma sobrecarga muito maior que o soquete unix padrão.
Ulidtko
Sim, encontrei algumas bibliotecas, mas isso não vai me ajudar, desde que eu não saiba o endereço UDS real. Isso está documentado em algum lugar?
Paŭlo Ebermann
1
@Paulo, soquetes de domínio unix geralmente usam o espaço para nome do sistema de arquivos. Seus endereços são nomes de arquivos . Os respectivos nós de arquivo são "arquivos de soquete especiais". No meu sistema, tenho inúmeras conexões /tmp/.X11-unix/X0- este é um exemplo de endereço AF_UNIX (use netstat -xpara 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.
Ulidtko 10/05
1
/tmp/.X11-unix/X0existe 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.
Paŭlo Ebermann 10/10

Respostas:

8

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:

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, não parece funcionar se eu o deixar ouvir no 6001 e depois especificar a exibição em localhost:1vez de localhost:0- eu entendo No protocol specified. Parece que vou ter que ler o protocolo X novamente. (E, em JSch, ele termina com Invalid MIT-MAGIC-COOKIE-1 key, mas esse é outro problema.)

Paŭlo Ebermann
fonte
Sim!! Eu estava procurando uma maneira de fazer xserver-allow-tcp=true após X já havia sido iniciado com -nolisten tcp em /etc/X11/xinit/xserverrcsem reiniciar. Apenas no meu caso, bind=0.0.0.0para permitir meus hosts externos.
Marcos
5

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.

alanc
fonte
2

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 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.)

  1. Ouça apenas na interface local

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.

Jonathan
fonte
Por enquanto, estou usando a autenticação de cookie mágico, portanto, mesmo as conexões do mesmo host não serão permitidas. xhostampliaria o acesso, não o diminuiria.
Paŭlo Ebermann
E acho que não vou invadir meu servidor X, mas obrigado pela sugestão de onde fazê-lo.
Paŭlo Ebermann
9 anos depois e isso não mudou. gitlab.freedesktop.org/xorg/lib/libxtrans/blob/master/…
daveloyall