Lascia che Xorg ascolti su TCP, ma solo su localhost?


12

Ho un programma client X che ha bisogno di accedere a un server X. È in grado di accedere al server X solo tramite TCP, non con altri metodi come i socket di dominio unix. Funzionerà sullo stesso host del server, per semplificare le cose.

Quindi, come posso fare in modo che il mio server Xorg ascolti sulla porta TCP 6000, ma solo per le connessioni da localhost?

Ho trovato Come far ascoltare X.org alle connessioni remote sulla porta 6000? , che spiega come abilitare l'accesso per gli host remoti, ma non voglio davvero l'accesso remoto (per motivi di sicurezza, principalmente).

Ho pensato di in qualche modo inoltrare il trasporto predefinito a TCP, ma in realtà non ho trovato informazioni su quale sia il trasporto predefinito.

(Sto usando kdm come display manager qui, ma penso di poter trasferire soluzioni per entrambi display manager o persino cambiare display manager.)

Qualche idea?

Questo è l'11.04 su un'installazione mista di Kubuntu-Ubuntu-XUbuntu (originariamente Kubuntu, ma ho aggiunto Ubuntu-desktop e xubuntu-desktop. All'avvio ora sta dicendo Xubuntu 11.04). Ora sto usando il desktop gnome-classico, credo, di KDM.


Per tutti chiedersi cosa sia questo client X: in realtà è un'implementazione SSH Java ( JSch ) che tenta di eseguire l'inoltro X a un altro host. Java non può davvero accedere ai socket di dominio unix, credo. Lo stesso problema si applicherebbe anche a un altro mio progetto (ora in pausa), in cui volevo implementare un client X in puro Java (ad esempio leggendo / scrivendo un socket, non usando una libreria di finestre).
Paŭlo Ebermann,

@Paulo, java in realtà può usare socket di dominio unix (puoi scrivere una libreria nativa che fornirà l'accesso alle syscall necessarie, o semplicemente trovare già scritte). Ma poi, in effetti, perdi effettivamente il vantaggio principale di Java: alta portabilità. Quindi, se hai davvero bisogno di qualcosa, potresti facilmente scrivere la libreria client X in Java che funzionerebbe su PF_LOCAL. Si noti inoltre che l'interfaccia TCP over loopback ha un sovraccarico molto più elevato rispetto al socket unix standard.
Ulidtko

Sì, ho trovato alcune librerie, ma questo non mi aiuterà finché non conosco l'indirizzo UDS effettivo. Questo è documentato da qualche parte?
Paŭlo Ebermann,

1
@Paulo, i socket di dominio unix in genere utilizzano lo spazio dei nomi del filesystem. I loro indirizzi sono nomi di file . I rispettivi nodi di file sono "file socket speciali". Sul mio sistema ho numerose connessioni a /tmp/.X11-unix/X0- questo è un esempio di indirizzo AF_UNIX (usa netstat -xper vedere il tuo). Le specifiche del protocollo X11 dovrebbero determinare gli indirizzi esatti a cui connettersi. E DEVI davvero leggerlo se stai scrivendo la libreria client per quel protocollo.
Ulidtko,

1
/tmp/.X11-unix/X0esiste come socket qui (anche OpenSUSE), controllerò di nuovo a casa (sul sistema Ubuntu indicato nella domanda). Ora devo solo vedere come inoltrarlo a un socket TCP a 6000.
Paŭlo Ebermann

Risposte:


8

Sembra una soluzione alternativa sarebbe l'uso di socat. Ecco una riga di comando che sembra funzionare, se il server X non è già in esecuzione su TCP:

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

Allora posso fare

xlogo -display localhost:0

Stranamente, non sembra funzionare se lascio che ascolti su 6001 e quindi specifichi il display localhost:1invece di localhost:0- Capisco No protocol specified. Sembra che dovrò leggere di nuovo il protocollo X. (E su JSch poi si chiude Invalid MIT-MAGIC-COOKIE-1 key, ma questo è un altro problema.)


Sì!! Ero stato alla ricerca di un modo per fare xserver-allow-tcp=true dopo X era già stato avviato con -nolisten tcp a /etc/X11/xinit/xserverrcsenza riavviare. Solo nel mio caso, bind=0.0.0.0per consentire i miei host esterni.
Marcos,

5

Il codice Xorg attualmente non ha alcuna opzione per controllare su quali interfacce ascoltare. Non dovrebbe essere difficile aggiungere, ma dovrebbe essere ancora più semplice semplicemente configurare il firewall per bloccare le connessioni in entrata alla porta 6000 da altre macchine.


2

Solo qualche altro pensiero ...

  1. Consentilo ma bloccalo con xhost (e / o filtro di rete)

Il modo tradizionale per farlo è che il server X ascolti sul socket TCP e usi xhost per determinare quali host possono connettersi. Vedi la pagina man per xhost (1). (Inoltre, ovviamente, anche l'indirizzo IP e il filtraggio delle porte potrebbero essere utili qui, come notato in precedenza.

  1. Ascolta solo su interfaccia locale

Per il commento di alanc sopra, non c'è nessun codice lì ora, ma quasi!

Ricorda che (quasi) tutti gli host hanno almeno due interfacce, l'interfaccia di loopback lo0 (sempre 127.0.0.1) e il normale ethernet eth0 (o wlan0 o altro, che diciamo 192.168.0.128) e molti ne hanno di più. Di solito i server TCP / IP (ad esempio, server X) consentiranno connessioni in entrata a uno qualsiasi dei loro indirizzi IP su una qualsiasi delle loro interfacce, ma la maggior parte dei software ti permetterà di specificare un indirizzo IP se lo desideri. Il lavoro effettivo viene svolto da bind (2), che accetta INADDR_ANY (0.0.0.0) o un indirizzo IP reale.

Il server Xorg implementa -name indirizzo-locale ma sfortunatamente questo è solo per XDMCP (vedi il file os / xdmcp.c che lo implementa correttamente per quanto ne so.) La connessione effettiva per il protocollo X, credo, è fatta da SocketINETCreateListener nel file /usr/include/X11/Xtrans/Xtranssock.c, che imposta l'indirizzo su INADDR_ANY e quindi si lega ad esso senza ulteriore elaborazione. Ciò che sarebbe necessario è il flag -from (che è gestito da os / xdmcp.c come FromAddress) per connettersi in qualche modo alla variabile 'sockname' appena prima di SocketCreateListener () in Xtranssock.c. Il problema, ovviamente, è che tutte le cose di trasporto sono realmente fatte in modo neutro rispetto al trasporto, quindi è un po 'complicato ottenere le informazioni in Xtranssock.c.

I percorsi dei file e così via potrebbero variare, sono stati esaminati con Ubuntu 10.04 LTS e si noti che i nomi delle funzioni in Xtranssock.c sono stati modificati da una macro TRANS. http://cgit.freedesktop.org/xorg/xserver/tree/os/xdmcp.c

Spero che sia di qualche utilità.

Cordiali saluti

Jonathan.


Per ora, sto usando l'autenticazione con i cookie magici, quindi non saranno consentite nemmeno connessioni dallo stesso host. xhostallargherebbe l'accesso, non lo ridurrebbe.
Paŭlo Ebermann,

E non credo che entrerò nel mio server X, ma grazie per il suggerimento su dove farlo.
Paŭlo Ebermann,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.