Biarkan Xorg mendengarkan pada TCP, tetapi hanya ke localhost?

12

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.

Paŭlo Ebermann
sumber
Untuk semua bertanya-tanya apa klien X ini: Ini sebenarnya implementasi Java SSH ( JSch ) yang mencoba melakukan penerusan X ke host lain. Java tidak dapat benar-benar mengakses soket domain unix, saya pikir. Masalah yang sama juga berlaku untuk proyek tambang saya yang lain (sekarang dihentikan sementara), di mana saya ingin mengimplementasikan klien X di Jawa murni (misalnya dengan membaca / menulis soket, tidak menggunakan perpustakaan windowing).
Paŭlo Ebermann
@ Paulo, java sebenarnya dapat menggunakan soket domain unix (Anda dapat menulis perpustakaan asli yang akan memberikan akses ke syscalls yang diperlukan, atau baru saja menemukan sudah ditulis). Tapi kemudian, Anda secara efektif kehilangan manfaat utama java: portabilitas tinggi. Jadi, jika Anda benar-benar membutuhkannya, Anda dapat dengan mudah menulis pustaka klien X di java yang dapat digunakan pada PF_LOCAL. Perhatikan juga bahwa antarmuka TCP over loopback memiliki overhead yang jauh lebih tinggi daripada soket unix standar.
ulidtko
Ya, saya menemukan beberapa perpustakaan, tetapi ini tidak akan membantu saya selama saya tidak tahu alamat-UDS yang sebenarnya. Apakah ini didokumentasikan di suatu tempat?
Paŭlo Ebermann
1
@ Paulo, unix soket domain biasanya menggunakan namespace sistem berkas. Alamat mereka adalah nama file . File node masing-masing adalah "file socket khusus". Di sistem saya, saya memiliki banyak koneksi /tmp/.X11-unix/X0- ini adalah contoh alamat AF_UNIX (gunakan netstat -xuntuk 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.
ulidtko
1
/tmp/.X11-unix/X0ada 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.
Paŭlo Ebermann

Jawaban:

8

Sepertinya solusi akan menjadi penggunaan socat. Berikut ini adalah baris perintah yang tampaknya berfungsi, jika server X belum berjalan pada TCP:

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

Maka saya bisa melakukannya

xlogo -display localhost:0

Anehnya, tampaknya tidak berfungsi jika saya membiarkannya mendengarkan 6001 dan kemudian menentukan tampilan localhost:1bukan localhost:0- saya dapatkan No protocol specified. Sepertinya saya harus membaca protokol X lagi. (Dan lebih dari JSch kemudian berhenti Invalid MIT-MAGIC-COOKIE-1 key, tapi ini masalah lain.)

Paŭlo Ebermann
sumber
Iya!! Saya telah mencari cara untuk membuat xserver-allow-tcp=true setelah X sudah dimulai dengan -nolisten tcp di /etc/X11/xinit/xserverrctanpa restart. Hanya dalam kasus saya, bind=0.0.0.0untuk memungkinkan host eksternal saya.
Marcos
5

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.

alanc
sumber
2

Hanya beberapa pemikiran lain ...

  1. Izinkan tetapi blokir dengan xhost (dan / atau penyaringan jaringan)

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.)

  1. Hanya dengarkan di antarmuka lokal

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.

Jonathan
sumber
Untuk saat ini, saya menggunakan otentikasi cookie ajaib, sehingga koneksi dari host yang sama tidak akan diizinkan. xhostakan memperlebar akses, bukan menyusutkannya.
Paŭlo Ebermann
Dan saya tidak berpikir saya akan meretas ke server X saya, tetapi terima kasih atas sarannya di mana melakukannya.
Paŭlo Ebermann
9 tahun kemudian dan ini belum berubah. gitlab.freedesktop.org/xorg/lib/libxtrans/blob/master/…
daveloyall