Xorg'un TCP'yi dinlemesine izin verin, sadece localhost'u dinlesin?


12

Bir X sunucusuna erişmesi gereken bazı X istemci programım var. X sunucusuna yalnızca TCP yoluyla erişebilir, unix etki alanı yuvaları gibi diğer yöntemlerle erişemez. İşleri kolaylaştırmak için sunucu ile aynı ana bilgisayarda çalışacaktır.

Peki, Xorg sunucumu TCP bağlantı noktası 6000'de nasıl dinleyebilirim, ancak yalnızca localhost'tan bağlantılar için?

Buldum X.org portu 6000 tarihinde uzak bağlantılar dinlemek nasıl yapılır? Bu, uzak ana bilgisayarlar için erişimin nasıl etkinleştirileceğini açıklar, ancak gerçekten uzaktan erişim istemiyorum (özellikle güvenlik nedeniyle).

Bir şekilde TCP'ye varsayılan aktarımı iletmeyi düşündüm, ancak varsayılan aktarımın ne olduğu hakkında gerçekten bilgi bulamadım.

(Burada ekran yöneticim olarak kdm kullanıyorum, ancak ekran yöneticisi için çözüm aktarabilirim, hatta ekran yöneticisini değiştirebilirim.)

Herhangi bir fikir?

Bu, karışık bir Kubuntu-Ubuntu-XUbuntu kurulumunda 11.04'te (başlangıçta Kubuntu, ancak ubuntu-masaüstü ve xubuntu-masaüstü ekledim. Önyüklemede şimdi Xubuntu 11.04 diyor). Şimdi KDM'den gnome-classic masaüstü kullanıyorum.


Bu X istemcisinin ne olduğunu merak etmek için: Aslında , başka bir ana bilgisayara X iletimi yapmaya çalışan bir Java SSH uygulamasıdır ( JSch ). Java gerçekten unix alan soketlerine erişemiyor. Aynı sorun, saf Java'da bir X istemcisi uygulamak istediğim başka bir (şimdi duraklatılmış) projem için de geçerlidir (örneğin, bir pencere kitaplığı kullanmadan bir soket okuyarak / yazarak).
Paŭlo Ebermann

@Paulo, java aslında olabilir Unix alan soketi (eğer gerekli sistem çağrıları erişim sağlamak, ya da sadece zaten yazılı bulacaksınız yerli kütüphane yazabilirsiniz) kullanın. Ama sonra, fwiw, java'nın ana faydasını etkili bir şekilde kaybedersiniz: yüksek taşınabilirlik. Bu yüzden gerçekten çok ihtiyacınız varsa, Java'da PF_LOCAL üzerinde çalışacak olan X istemci kitaplığını kolayca yazabilirsiniz. Ayrıca TCP over loopback arabiriminin standart unix soketinden çok daha yüksek ek yüke sahip olduğunu unutmayın.
ulidtko

Evet, bazı kütüphaneler buldum, ancak gerçek UDS adresini bilmediğim sürece bu bana yardımcı olmayacak. Bu bir yerde belgelendi mi?
Paŭlo Ebermann

1
@Paulo, unix etki alanı yuvaları genellikle dosya sisteminin ad alanını kullanır. Adresleri dosya isimleridir . İlgili dosya düğümleri "özel soket dosyaları" dır. Benim sistemde ben sayısız bağlantılara sahip /tmp/.X11-unix/X0- bu olduğunu (kullanım AF_UNIX adresi örneği netstat -xkendi görmek için). X11 protokol belirtimi, bağlanacak tam adresleri belirlemelidir. Ve bu protokol için istemci kitaplığı yazıyorsanız gerçekten okumalısınız.
ulidtko

1
/tmp/.X11-unix/X0burada (OpenSUSE) bir soket olarak da var, evde tekrar kontrol edeceğim (soruda adı geçen Ubuntu sisteminde). Şimdi bunun
6000'de

Yanıtlar:


8

Bir geçici çözüm kullanımı gibi görünüyor socat. X sunucusu zaten TCP'de çalışmazsa, işe yarayan bir komut satırı aşağıdadır:

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

Sonra yapabilirim

xlogo -display localhost:0

Ben 6001 tarihinde dinleyelim ve sonra ekranı belirtirseniz Garip bir şekilde, bu işin görünmüyor localhost:1yerine localhost:0alıyorum - No protocol specified. Görünüşe göre X protokolünü tekrar okumak zorunda kalacağım. (Ve JSch üzerinden sonra kapanır Invalid MIT-MAGIC-COOKIE-1 key, ancak bu başka bir sorun.)


Evet!! Ben marka için bir yol arayan olmuştu xserver-allow-tcp=true X zaten başladı edildikten sonra -nolisten tcp içinde /etc/X11/xinit/xserverrcyeniden başlatmadan. Sadece benim durumumda, bind=0.0.0.0harici ana makinelerime izin vermek için.
Marcos

5

Xorg kodunun şu anda hangi arabirimlerin dinleneceğini denetleme seçeneği yoktur. Eklemek zor olmamalı, ancak güvenlik duvarınızı diğer makinelerden 6000 numaralı bağlantı noktasına gelen bağlantıları engelleyecek şekilde yapılandırmak daha da kolay olmalıdır.


2

Sadece başka düşünceler ...

  1. İzin ver ancak xhost (ve / veya ağ filtrelemesi) ile engelle

Bunu yapmanın geleneksel yolu, X sunucusunun TCP soketini dinlemesi ve hangi ana makinelerin bağlanmasına izin verildiğini belirlemek için xhost kullanmasıdır. Xhost için kılavuz sayfasına bakınız (1). (Ayrıca, önceki önerilerin de belirttiği gibi, IP adresi ve bağlantı noktası filtrelemesi de burada yardımcı olacaktır.)

  1. Sadece yerel arayüzde dinle

Alanc'ın yukarıdaki yorumuna göre, şu anda orada kod yok, ama neredeyse!

(Hemen hemen) tüm ana bilgisayarların en az iki arabirimi olduğunu, geri döngü arabirimi lo0 (her zaman 127.0.0.1) ve normal ethernet eth0 (veya wlan0 veya her neyse, 192.168.0.128) ve daha fazlasının olduğunu unutmayın. Genellikle TCP / IP sunucuları (örn. X sunucusu) herhangi bir arabirimindeki IP adreslerinden herhangi birine gelen bağlantılara izin verir, ancak çoğu yazılım isterseniz bir IP adresi belirtmenize izin verir. Gerçek çalışma, INADDR_ANY (0.0.0.0) veya gerçek bir IP adresi alan bind (2) tarafından yapılır.

Xorg sunucusu -name local-adresini uygular, ancak ne yazık ki bu sadece XDMCP içindir (bildiğim kadarıyla doğru şekilde uygulayan os / xdmcp.c dosyasına bakın.) X protokolü için gerçek bağlantı, sanırım SocketINETCreateListener tarafından yapılır /usr/include/X11/Xtrans/Xtranssock.c dosyasında, adresi INADDR_ANY olarak ayarlar ve daha sonra başka işlem yapmadan ona bağlanır. İhtiyaç duyulan şey, Xtranssock.c'deki SocketCreateListener () öğesinden hemen önce bir şekilde 'sockname' değişkenine bağlanmak için (FromAddress olarak os / xdmcp.c tarafından ele alınan) -from bayrağıdır. Sorun, elbette, tüm taşıma işlerinin gerçekten taşıma nötr bir şekilde yapılmasıdır, bu nedenle bilgileri Xtranssock.c'ye almak biraz zor.

Dosya yolları vb. Değişebilir, Ubuntu 10.04 LTS ile bakıldı ve Xtranssock.c'deki işlev adlarının bir makro TRANS ile değiştiğine dikkat edin. http://cgit.freedesktop.org/xorg/xserver/tree/os/xdmcp.c

Umarım bu bir işe yarar.

Saygılarımla

Jonathan.


Şimdilik, sihirli çerez kimlik doğrulamasını kullanıyorum, bu nedenle aynı ana bilgisayardan bağlantılara bile izin verilmeyecek. xhosterişimi genişletir, küçültmez.
Paŭlo Ebermann

Ve X sunucumu hackleyeceğimi düşünmüyorum, ancak bunu nerede yapacağınıza dair öneri için teşekkürler.
Paŭlo Ebermann

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.