J'ai un programme client X qui a besoin d'accéder à un serveur X. Il ne peut accéder au serveur X que par TCP, pas par d'autres méthodes comme les sockets de domaine Unix. Il fonctionnera sur le même hôte que le serveur, pour faciliter les choses.
Alors, comment puis-je faire en sorte que mon serveur Xorg écoute sur le port TCP 6000, mais uniquement pour les connexions de l'hôte local?
J'ai trouvé Comment faire pour que X.org écoute les connexions à distance sur le port 6000? , ce qui explique comment activer l'accès pour les hôtes distants, mais je ne veux pas vraiment l'accès à distance (pour des raisons de sécurité, principalement).
J'ai pensé à transférer le transport par défaut vers TCP, mais je n'ai pas vraiment trouvé d'informations sur le transport par défaut.
(J'utilise kdm comme gestionnaire d'affichage ici, mais je pense que je peux transférer des solutions pour le gestionnaire d'affichage, ou même changer de gestionnaire d'affichage.)
Des idées?
C'est le 11.04 sur une installation mixte Kubuntu-Ubuntu-XUbuntu (à l'origine Kubuntu, mais j'ai ajouté ubuntu-desktop et xubuntu-desktop. Au démarrage, il est maintenant dit Xubuntu 11.04). J'utilise maintenant le bureau gnome-classic, je pense, de KDM.
/tmp/.X11-unix/X0
- c'est un exemple d'adresse AF_UNIX (utiliseznetstat -x
pour voir la vôtre). La spécification du protocole X11 doit déterminer les adresses exactes auxquelles se connecter. Et vous DEVEZ vraiment le lire si vous écrivez une bibliothèque cliente pour ce protocole./tmp/.X11-unix/X0
existe aussi comme socket ici (OpenSUSE), je vais vérifier à nouveau à la maison (sur le système Ubuntu nommé dans la question). Maintenant, je n'ai plus qu'à voir comment transmettre cela à un socket TCP à 6000.Réponses:
On dirait qu'une solution de contournement serait l'utilisation de
socat
. Voici une ligne de commande qui semble fonctionner, si le serveur X ne fonctionne pas déjà sur TCP:Alors je peux faire
Étrangement, cela ne semble pas fonctionner si je le laisse écouter sur 6001, puis spécifie l'affichage
localhost:1
au lieu delocalhost:0
- je comprendsNo protocol specified
. On dirait que je vais devoir relire le protocole X. (Et sur JSch, il s'arrête alors avecInvalid MIT-MAGIC-COOKIE-1 key
, mais c'est un autre problème.)la source
xserver-allow-tcp=true
après que X ait déjà été démarré avec-nolisten tcp
in/etc/X11/xinit/xserverrc
sans redémarrer. Seulement dans mon cas,bind=0.0.0.0
pour autoriser mes hôtes externes.Le code Xorg n'a actuellement aucune option pour contrôler les interfaces sur lesquelles écouter. Il ne devrait pas être difficile à ajouter, mais il devrait être encore plus facile de simplement configurer votre pare-feu pour bloquer les connexions entrantes vers le port 6000 à partir d'autres machines.
la source
Juste quelques autres réflexions ...
La méthode traditionnelle consiste à écouter le serveur X sur le socket TCP et à utiliser xhost pour déterminer les hôtes autorisés à se connecter. Voir la page de manuel de xhost (1). (En outre, bien sûr, le filtrage des adresses IP et des ports aiderait ici aussi, comme l'ont noté les suggestions précédentes.)
Selon le commentaire d'Alanc ci-dessus, il n'y a pas de code maintenant, mais presque!
Rappelez-vous que (presque) tous les hôtes ont au moins deux interfaces, l'interface de bouclage lo0 (toujours 127.0.0.1) et l'étheth Ethernet normal (ou wlan0 ou autre, qui est disons 192.168.0.128) et beaucoup en ont plus. Habituellement, les serveurs TCP / IP (c'est-à-dire le serveur X) autorisent les connexions entrantes vers n'importe laquelle de leurs adresses IP sur n'importe laquelle de leurs interfaces, mais la plupart des logiciels vous permettent de spécifier une adresse IP si vous le souhaitez. Le travail réel est effectué par bind (2), qui prend INADDR_ANY (0.0.0.0) ou une véritable adresse IP.
Le serveur Xorg implémente -name local-address mais malheureusement ce n'est que pour XDMCP (voir le fichier os / xdmcp.c qui l'implémente correctement pour autant que je sache.) La connexion réelle pour le protocole X, je crois, est effectuée par SocketINETCreateListener dans le fichier /usr/include/X11/Xtrans/Xtranssock.c, qui définit l'adresse sur INADDR_ANY, puis s'y lie sans autre traitement. Ce qui serait nécessaire est le drapeau -from (qui est traité par os / xdmcp.c comme FromAddress) pour se connecter en quelque sorte à la variable 'sockname' juste avant SocketCreateListener () dans Xtranssock.c. Le problème, bien sûr, est que toutes les opérations de transport sont réellement effectuées de manière neutre pour le transport, il est donc un peu délicat d'entrer les informations dans Xtranssock.c.
Les chemins de fichiers et ainsi de suite peuvent varier, a été examiné avec Ubuntu 10.04 LTS, et notez que les noms de fonction dans Xtranssock.c ont été modifiés par une macro TRANS. http://cgit.freedesktop.org/xorg/xserver/tree/os/xdmcp.c
J'espère que cela vous sera utile.
Sincères amitiés
Jonathan.
la source
xhost
élargirait l'accès, ne le rétrécirait pas.