Saya memiliki beberapa program klien X yang memerlukan akses ke server X. Itu hanya dapat mengakses server X melalui TCP, bukan dengan metode lain seperti soket domain unix. Ini akan berjalan pada host yang sama dengan server, untuk mempermudah.
Jadi, bagaimana saya bisa membuat server Xorg saya untuk mendengarkan pada port TCP 6000, tetapi hanya untuk koneksi dari localhost?
Saya menemukan Cara membuat X.org mendengarkan koneksi jarak jauh pada port 6000? , yang menjelaskan cara mengaktifkan akses untuk host jarak jauh, tapi saya tidak benar-benar ingin akses jarak jauh (untuk alasan keamanan, terutama).
Saya berpikir tentang bagaimana meneruskan transport default ke TCP, tetapi saya tidak benar-benar menemukan informasi tentang apa transport default itu.
(Saya menggunakan kdm sebagai manajer tampilan saya di sini, tetapi saya pikir saya dapat mentransfer solusi untuk manajer tampilan, atau bahkan mengganti manajer tampilan.)
Ada ide?
Ini adalah pada 11,04 pada instalasi Kubuntu-Ubuntu-XUbuntu campuran (awalnya Kubuntu, tapi saya menambahkan ubuntu-desktop dan xubuntu-desktop. Pada boot sekarang mengatakan Xubuntu 11,04). Saya sekarang menggunakan desktop gnome-classic, saya pikir, dari KDM.
/tmp/.X11-unix/X0
- ini adalah contoh alamat AF_UNIX (gunakannetstat -x
untuk melihat milik Anda). Spesifikasi protokol X11 harus menentukan alamat yang tepat untuk terhubung. Dan Anda benar-benar HARUS membacanya jika Anda menulis pustaka klien untuk protokol itu./tmp/.X11-unix/X0
ada sebagai soket di sini (OpenSUSE), juga, saya akan periksa lagi di rumah (pada sistem Ubuntu yang disebutkan dalam pertanyaan). Sekarang saya hanya perlu melihat bagaimana meneruskan ini ke soket TCP pada 6000.Jawaban:
Sepertinya solusi akan menjadi penggunaan
socat
. Berikut ini adalah baris perintah yang tampaknya berfungsi, jika server X belum berjalan pada TCP:Maka saya bisa melakukannya
Anehnya, tampaknya tidak berfungsi jika saya membiarkannya mendengarkan 6001 dan kemudian menentukan tampilan
localhost:1
bukanlocalhost:0
- saya dapatkanNo protocol specified
. Sepertinya saya harus membaca protokol X lagi. (Dan lebih dari JSch kemudian berhentiInvalid MIT-MAGIC-COOKIE-1 key
, tapi ini masalah lain.)sumber
xserver-allow-tcp=true
setelah X sudah dimulai dengan-nolisten tcp
di/etc/X11/xinit/xserverrc
tanpa restart. Hanya dalam kasus saya,bind=0.0.0.0
untuk memungkinkan host eksternal saya.Kode Xorg saat ini tidak memiliki opsi untuk mengendalikan antarmuka mana yang ingin didengarkan. Seharusnya tidak sulit untuk menambahkan, tetapi seharusnya bahkan lebih mudah untuk hanya mengkonfigurasi firewall Anda untuk memblokir koneksi masuk ke port 6000 dari mesin lain.
sumber
Hanya beberapa pemikiran lain ...
Cara tradisional untuk melakukan ini adalah agar server X mendengarkan pada soket TCP dan menggunakan xhost untuk menentukan host mana yang diizinkan untuk terhubung. Lihat halaman manual untuk xhost (1). (Selain itu, tentu saja, alamat IP dan penyaringan port akan membantu di sini juga, seperti saran sebelumnya telah dicatat.)
Per komentar Alanc di atas, tidak ada kode di sana sekarang, tetapi hampir!
Ingatlah bahwa (hampir) semua host memiliki setidaknya dua antarmuka, antarmuka loopback lo0 (selalu 127.0.0.1) dan ethernet normal eth0 (atau wlan0 atau apa pun, yang katakanlah adalah 192.168.0.128) dan banyak yang lainnya. Biasanya server TCP / IP (yaitu, X server) akan memungkinkan koneksi masuk ke alamat IP mereka pada antarmuka mereka, tetapi sebagian besar perangkat lunak akan membiarkan Anda menentukan alamat IP jika Anda mau. Pekerjaan aktual dilakukan oleh bind (2), yang mengambil INADDR_ANY (0.0.0.0) atau alamat IP asli.
Server Xorg mengimplementasikan -nama local-address tetapi sayangnya ini hanya untuk XDMCP (lihat file os / xdmcp.c yang mengimplementasikannya dengan benar sejauh yang saya tahu.) Koneksi aktual untuk protokol X, saya percaya, dilakukan oleh SocketINETCreateListener dalam file /usr/include/X11/Xtrans/Xtranssock.c, yang menetapkan alamat menjadi INADDR_ANY dan kemudian mengikatnya tanpa diproses lebih lanjut. Apa yang dibutuhkan adalah flag -dari (yang ditangani oleh os / xdmcp.c sebagai FromAddress) untuk terhubung entah bagaimana ke variabel 'sockname' sebelum SocketCreateListener () di Xtranssock.c. Masalahnya, tentu saja, adalah bahwa semua hal transportasi benar-benar dilakukan dengan cara transportasi netral sehingga agak sulit untuk mendapatkan informasi ke Xtranssock.c.
Jalur file dan sebagainya mungkin beragam, dilihat dengan Ubuntu 10,04 LTS, dan perhatikan bahwa nama fungsi di Xtranssock.c diubah oleh makro TRANS. http://cgit.freedesktop.org/xorg/xserver/tree/os/xdmcp.c
Semoga itu berguna.
Salam
Jonathan.
sumber
xhost
akan memperlebar akses, bukan menyusutkannya.