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 dazu bringen, den TCP-Port 6000 abzuhören, aber nur auf Verbindungen von localhost?
Ich habe gefunden, wie X.org Remoteverbindungen auf Port 6000 abhören kann. , in dem erklärt wird, wie der Zugriff für Remote-Hosts aktiviert wird, ich möchte jedoch keinen Remote-Zugriff (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.
/tmp/.X11-unix/X0
- dies ist ein Beispiel für eine AF_UNIX-Adresse (verwenden Sie diesenetstat -x
, um Ihre eigene zu sehen). Die X11-Protokollspezifikation sollte die genauen Adressen bestimmen, mit denen eine Verbindung hergestellt werden soll. Und Sie MÜSSEN es wirklich lesen, wenn Sie eine Client-Bibliothek für dieses Protokoll schreiben./tmp/.X11-unix/X0
Existiert hier auch ein Socket (OpenSUSE), werde ich zu Hause nochmal nachschauen (auf dem in der Frage genannten Ubuntu-System). Jetzt muss ich nur noch sehen, wie man das um 6000 an einen TCP-Socket weiterleitet.Antworten:
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:Dann kann ich machen
Seltsamerweise scheint es nicht zu funktionieren, wenn ich es auf 6001 hören lasse und dann das Display spezifiziere
localhost:1
anstattlocalhost:0
- das bekomme ichNo protocol specified
. Scheint, ich muss das X-Protokoll noch einmal lesen. (Und über JSch hört es dann aufInvalid MIT-MAGIC-COOKIE-1 key
, aber das ist ein anderes Problem.)quelle
xserver-allow-tcp=true
nachdem X bereits ohne Neustart mit-nolisten tcp
in gestartet worden war/etc/X11/xinit/xserverrc
. Nur in meinem Fall,bind=0.0.0.0
um meine externen Hosts zuzulassen.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.
quelle
Nur ein paar andere Gedanken ...
Die herkömmliche Methode besteht darin, dass der X-Server den TCP-Socket überwacht und mit xhost ermittelt, welche Hosts eine Verbindung herstellen dürfen. Siehe Manpage für xhost (1). (Zusätzlich würde natürlich auch hier die IP-Adress- und Portfilterung helfen, wie frühere Vorschläge angemerkt haben.)
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 annimmt.
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. Dies wurde mit Ubuntu 10.04 LTS untersucht. Beachten Sie, 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.
quelle
xhost
würde den Zugang erweitern, nicht verkleinern.