it-swarm.com.de

Lassen Sie Xorg auf TCP lauschen, aber nur auf localhost?

Ich habe ein X-Client-Programm, das Zugriff auf einen X-Server benötigt. Es kann nur über TCP auf den X-Server zugreifen, nicht über andere Methoden wie Unix-Domain-Sockets. Es wird auf demselben Host wie der Server ausgeführt, um die Arbeit zu vereinfachen.

Wie kann ich meinen Xorg-Server veranlassen, auf TCP Port 6000 zu lauschen, aber nur auf Verbindungen von localhost?

Ich habe Wie kann X.org Remoteverbindungen auf Port 6000 überwachen? gefunden, wodurch erklärt wird, wie der Zugriff für Remotehosts aktiviert wird, aber ich möchte eigentlich keinen Remotezugriff (hauptsächlich aus Sicherheitsgründen). .

Ich dachte darüber nach, den Standardtransport irgendwie an TCP weiterzuleiten, fand aber keine Informationen darüber, was der Standardtransport ist.

(Ich verwende hier kdm als Display-Manager, aber ich denke, ich kann Lösungen entweder für den Display-Manager übertragen oder sogar den Display-Manager wechseln.)

Irgendwelche Ideen?

Dies ist am 11.04 in einer gemischten Kubuntu-Ubuntu-XUbuntu-Installation (ursprünglich Kubuntu, aber ich habe ubuntu-desktop und xubuntu-desktop hinzugefügt. Beim Booten heißt es jetzt Xubuntu 11.04). Ich benutze jetzt den gnome-klassischen Desktop von KDM.

12
Paŭlo Ebermann

Sieht aus wie eine Problemumgehung wäre die Verwendung von socat . Hier ist eine Befehlszeile, die zu funktionieren scheint, wenn der X-Server noch nicht auf TCP läuft:

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

Dann kann ich machen

xlogo -display localhost:0

Seltsamerweise scheint es nicht zu funktionieren, wenn ich es auf 6001 hören lasse und dann die Anzeige localhost:1 anstelle von localhost:0 spezifiziere - ich erhalte No protocol specified. Scheint, ich muss das X-Protokoll noch einmal lesen. (Und über JSch wird es dann mit Invalid MIT-MAGIC-COOKIE-1 key beendet, aber das ist ein anderes Problem.)

7
Paŭlo Ebermann

Der Xorg-Code hat derzeit keine Option zum Steuern, welche Schnittstellen abgehört werden sollen. Das Hinzufügen sollte nicht schwierig sein, aber es sollte noch einfacher sein, Ihre Firewall so zu konfigurieren, dass eingehende Verbindungen zu Port 6000 von anderen Computern blockiert werden.

5
alanc

Nur ein paar andere Gedanken ...

  1. Zulassen, aber mit xhost blockieren (und/oder Netzwerkfilterung)

Die herkömmliche Methode besteht darin, dass der X-Server den Socket TCP überwacht und mit xhost ermittelt, welche Hosts eine Verbindung herstellen dürfen. Siehe Manpage für xhost (1). (Natürlich würde auch hier die Filterung von IP-Adressen und Ports helfen, wie bereits erwähnt.)

  1. Lauschen Sie nur auf der lokalen Schnittstelle

Laut dem obigen Kommentar von alanc gibt es derzeit keinen Code, aber fast!

Denken Sie daran, dass (fast) alle Hosts mindestens zwei Schnittstellen haben, die Loopback-Schnittstelle lo0 (immer 127.0.0.1) und die normale Ethernet-Schnittstelle eth0 (oder wlan0 oder was auch immer, sagen wir 192.168.0.128) und viele weitere. Normalerweise erlauben TCP/IP-Server (dh X-Server) eingehende Verbindungen zu einer ihrer IP-Adressen an einer ihrer Schnittstellen, aber die meisten Programme lassen Sie eine IP-Adresse angeben, wenn Sie möchten. Die eigentliche Arbeit erledigt bind (2), das entweder INADDR_ANY (0.0.0.0) oder eine echte IP-Adresse verwendet.

Der Xorg-Server implementiert -name local-address, aber leider nur für XDMCP (siehe Datei os/xdmcp.c, die es meines Wissens korrekt implementiert). Die eigentliche Verbindung für das X-Protokoll wird, glaube ich, von SocketINETCreateListener hergestellt in der Datei /usr/include/X11/Xtrans/Xtranssock.c, die die Adresse auf INADDR_ANY setzt und dann ohne weitere Verarbeitung daran bindet. Was benötigt wird, ist das Flag -from (das von os/xdmcp.c als FromAddress behandelt wird), um sich kurz vor SocketCreateListener () in Xtranssock.c mit der Variablen 'sockname' zu verbinden. Das Problem ist natürlich, dass alle Transportaufgaben wirklich transportneutral erledigt werden, so dass es ein bisschen schwierig ist, die Informationen in Xtranssock.c zu bekommen.

Dateipfade und so weiter können variieren, wurde mit Ubuntu 10.04 LTS untersucht und beachtet, dass sich die Funktionsnamen in Xtranssock.c durch ein Makro TRANS geändert haben. http://cgit.freedesktop.org/xorg/xserver/tree/os/xdmcp.c

Hoffe, das ist von Nutzen.

Mit freundlichen Grüßen

Jonathan.

2
Jonathan