VNC adalah remote desktop paling tua yang masih dipakai luas di Linux: protokolnya sederhana, servernya ada di semua distribusi besar, dan kliennya bisa diunduh untuk hampir semua sistem operasi. Chapter Remote Desktop
sudah memetakan posisinya di antara RDP dan SPICE serta menyebut aturan keamanannya; bab ini membedah VNC sampai ke detail praktisnya. Kita akan membongkar protokol RFB di baliknya, membedakan dua filosofi server, menghitung port dari nomor display, menulis skrip xstartup yang menentukan desktop apa yang muncul, lalu menutup dengan pola terowongan SSH. Lingkungan latihan tidak memiliki server VNC terpasang, jadi seluruh berkas konfigurasi kita bangun sungguhan di sandbox dan pola teksnya kita periksa — pola yang persis dibaca tigervncserver pada mesin sesungguhnya.
RFB: Protokol Sederhana di Balik Nama VNC #
VNC adalah nama keluarga perangkat lunak, sedangkan bahasa yang dipakainya bernama RFB (Remote Framebuffer), protokol terbuka dengan spesifikasi pendek. Mekanismenya sederhana: server menyimpan framebuffer — potret isi layar — lalu mengirim daftar persegi gambar yang berubah setiap kali layar berganti; arah sebaliknya hanya membawa event keyboard dan mouse dari klien. Saking sederhananya, klien dan server tidak harus sejenis: klien RealVNC di Windows dapat menyambung ke server TigerVNC di Debian, maupun sebaliknya. Desain ini sekaligus menjelaskan batasannya: tidak ada suara, clipboard minimal, dan performa bergantung pada implementasi kedua sisi, bukan pada protokolnya.
Di Linux, server yang paling sering dijumpai: TigerVNC (implementasi umum di Debian dan Fedora, dengan server X virtual bernama Xvnc), TurboVNC (varian performa untuk aplikasi 3D), x11vnc (khusus membagikan sesi nyata), dan RealVNC Server (versi komersial dari tim asli penemu VNC). Di sisi klien, pilihan populer adalah TigerVNC viewer (vncviewer), RealVNC Viewer, dan Remmina — klien serbaguna di Linux yang juga bicara RDP dan SPICE dari jendela yang sama.
Dua Filosofi Server: Membagikan Layar Nyata atau Membuat Sesi Virtual #
Semua server VNC mengirim isi layar, tetapi mereka berbeda pendapat tentang layar yang mana. x11vnc menempel pada sesi X yang sudah berjalan di display fisik :0 — yang dilihat klien persis apa yang tampil di monitor mesin itu, dan gerakan mouse klien ikut menggerakkan kursor user yang duduk di depan mesin. Sebaliknya TigerVNC menciptakan sesi virtual baru lewat Xvnc, server X tanpa kartu grafis yang menggambar ke memori; desktopnya tidak pernah tampil di monitor mana pun. Pilihan filosofi mengikuti kasusnya:
| Aspek | x11vnc (sesi nyata) | TigerVNC/Xvnc (sesi virtual) |
|---|---|---|
| Sumber layar | display fisik :0 yang sedang berjalan | server X virtual baru, misalnya :1 |
| Perintah khas | x11vnc -display :0 | tigervncserver :1 |
| Yang dilihat klien | isi monitor mesin, apa adanya | desktop terpisah milik sesi VNC |
| Kasus cocok | membantu user di depan mesin itu | desktop headless untuk admin jarak jauh |
Satu konsekuensi penting dari sesi virtual: program yang berjalan di dalamnya tidak mati ketika klien memutus sambungan. Desktop beserta seluruh aplikasinya tetap hidup di memori server, menunggu kita menyambung kembali — perilaku yang membuat VNC sesi virtual cocok untuk menjalankan aplikasi grafis lama di server tanpa monitor.
Aritmetika Display dan Port 5900+N #
Satu sesi VNC adalah satu display bernomor, dan port jaringannya selalu 5900 ditambah nomor display: sesi pertama :1 mendengarkan di 5901, :2 di 5902, dan seterusnya. Konvensi ini diwarisi dari dunia X yang memakai display :0 untuk sesi fisik pertama. Saat mengelola mesin jauh, arah bacanya sering dibalik: kita melihat daftar port yang terbuka, lalu menebak sesi mana yang masih hidup. Skrip berikut memeriksa snapshot output ss — persis seperti hasil ss -tln di server-kantor:
cat > ss-snapshot.txt <<'SNAP'
LISTEN 0 5 127.0.0.1:5901 0.0.0.0:*
LISTEN 0 5 127.0.0.1:5902 0.0.0.0:*
LISTEN 0 128 0.0.0.0:3389 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
SNAP
awk '{
port = $4
sub(/.*:/, "", port)
if (port >= 5900 && port <= 5999)
printf "port %-5s = display :%d (server VNC)\n", port, port - 5900
else
printf "port %-5s = bukan VNC\n", port
}' ss-snapshot.txtOutput yang Dihasilkan:
port 5901 = display :1 (server VNC)
port 5902 = display :2 (server VNC)
port 3389 = bukan VNC
port 22 = bukan VNCcat > ss-snapshot.txt <<'SNAP': snapshot empat barisssdisimpan sebagai fixture latihan; pada mesin nyata, teks ini adalah outputss -tlnyang diambil lewat SSH.port = $4; sub(/.*:/, "", port): kolom keempat barisssberisialamat:port; regex.*:yang rakus memakan semua karakter sampai titik dua terakhir, menyisakan angka port.port >= 5900 && port <= 5999: hanya rentang VNC yang dilabeli;3389(milik xrdp) dan22(SSH) dicatat sebagai bukan VNC.port - 5900: aritmetika kebalikannya — dari nomor port, kita menemukan nomor display pemiliknya.
Dua baris listener VNC pada snapshot itu juga memperlihatkan sikap yang benar: keduanya hanya mendengarkan di 127.0.0.1, sehingga dari luar mesin tidak ada port VNC yang bisa disentuh sama sekali.
Skrip xstartup: Menentukan Desktop yang Muncul #
Sesi virtual TigerVNC tidak dilahirkan oleh display manager; ia dibesarkan oleh skrip ~/.vnc/xstartup yang dijalankan setiap kali tigervncserver menciptakan display baru. Kalau berkas itu tidak ada, tidak bisa dieksekusi, atau gagal di tengah jalan, klien disambut gejala klasik: layar abu-abu polos dengan kursor berbentuk X. Karena itu xstartup adalah berkas pertama yang diperiksa saat sesi VNC bermasalah. Bentuk paling ringkas yang berfungsi:
mkdir -p ~/.vnc
cat > ~/.vnc/xstartup <<'XSTARTUP'
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
exec startxfce4
XSTARTUP
chmod +x ~/.vnc/xstartup
cat ~/.vnc/xstartupOutput yang Dihasilkan:
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
exec startxfce4#!/bin/sh: shebang menandai berkas ini dieksekusi sebagai skrip shell pada saat sesi dibuat.unset SESSION_MANAGER: variabel ini menunjuk ke session manager desktop lama; bila terbawa ke sesi virtual, window manager baru menolak hidup karena merasa sesinya sudah ada.unset DBUS_SESSION_BUS_ADDRESS: alamat bus D-Bus milik desktop lama tidak berlaku di sesi baru; tanpaunset, aplikasi gagal saling bicara.exec startxfce4:execmenggantikan proses shell dengan sesi XFCE, bukan menjalankannya sebagai proses anak. Akibatnya sinyal mati dari server VNC diterima langsung oleh desktop dan sesi berakhir bersih. Desktop lain tinggal mengganti satu kata:startlxde,mate-session, ataudbus-run-session -- startplasma-x11.chmod +x ~/.vnc/xstartup: bit eksekusi adalah syarat yang paling sering dilupakan — dan penyebab nomor satu layar abu-abu.
Blok berikut mengulang skenario kelalaian klasik itu secara utuh: xstartup ditulis ulang tanpa chmod +x, pemeriksaan menangkapnya, lalu diperbaiki di tempat. Karena sandbox latihan dibersihkan antar blok, berkasnya ditulis ulang di awal blok — blok seperti ini memang dirancang mandiri agar bisa diulang terpisah:
mkdir -p ~/.vnc
printf '#!/bin/sh\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\nexec startxfce4\n' > ~/.vnc/xstartup
if [ -x ~/.vnc/xstartup ]; then
echo "mode : $(stat -c %a ~/.vnc/xstartup) (dapat dieksekusi)"
else
echo "mode : tidak dieksekusi -> layar abu-abu menanti"
chmod +x ~/.vnc/xstartup
echo "mode : $(stat -c %a ~/.vnc/xstartup) setelah chmod +x"
fi
echo "desktop : $(sed -n 's/^exec //p' ~/.vnc/xstartup)"Output yang Dihasilkan:
mode : tidak dieksekusi -> layar abu-abu menanti
mode : 775 setelah chmod +x
desktop : startxfce4printf ... > ~/.vnc/xstartup: berkas baru lahir dengan izin dasar dikurangiumask— dan hasilnya tidak pernah menyertakan bit eksekusi; di sinilah kelalaian klasik bermula.[ -x ~/.vnc/xstartup ]:testmemeriksa bit eksekusi — pemeriksaan pertama saat sesi virtual menolak menampilkan desktop.stat -c %a: mode permission dalam bentuk angka, tanpa kolom waktu yang berisik — pada sandbox latihan (umask002) hasilnya775; di komputer pembaca dengan umask yang lebih umum (022), hasilnya755.sed -n 's/^exec //p': mengambil barisexec, menghapus kataexec-nya, lalu mencetak sisanya — nama desktop yang akan tampil.
Menjalankan Server dan Menyambung dari Klien #
Sebelum sesi pertama dibuat, TigerVNC meminta password khusus lewat vncpasswd dan menyimpannya di ~/.vnc/passwd. Setelah itu tigervncserver -localhost yes :1 menciptakan display :1, menjalankan xstartup, dan mendengarkan di port 5901. Berikut contoh tampilan penciptaan sesi pertama di server-kantor:
You will require a password to access your desktops.
Password:
Verify:
Would you like to enter a view-only password (y/n)? n
New 'server-kantor:1 (budi)' desktop is server-kantor:1
Creating default startup script /home/budi/.vnc/xstartup
Creating default config file /home/budi/.vnc/config
Starting applications specified in /home/budi/.vnc/xstartup
Log file is /home/budi/.vnc/server-kantor:1.logBaris New 'server-kantor:1 (budi)' mengonfirmasi display :1 — portnya 5901 menurut aritmetika bab ini. Baris Creating default startup script hanya muncul sekali: pada mesin yang sudah punya xstartup buatan sendiri, baris itu diganti Starting applications specified in, dan berkas log sesi tersimpan untuk ditelusuri saat sesi menolak berjalan. Dari sisi klien, koneksi cukup ditunjukkan ke localhost:5901 setelah terowongan terpasang; Remmina menyediakan pengelolaan sesi yang sama lewat antarmuka grafisnya.
Skenario khasnya utuh begini: server-kantor di rak tanpa monitor menjalankan dua sesi virtual — :1 milik budi, :2 milik siti — masing-masing dengan desktop dan aplikasinya sendiri. Keduanya hidup berhari-hari tanpa klien tersambung; admin masuk dari laptop, melanjutkan pekerjaan persis di titik terakhir, lalu tinggal memutus klien tanpa menutup apa pun.
Keamanan: Password Pendek, Kanal Terbuka #
Autentikasi VNC klasik memakai challenge-response berbasis DES dengan password yang hanya membaca delapan karakter pertama — ruang brute force yang kecil. Setelah pintu itu terbuka, protokol RFB klasik mengirim isi layar apa adanya, tanpa enkripsi: siapa pun yang bisa menyadap tautan ikut menonton. Solusinya bukan mempercayai password yang lebih panjang, melainkan memindahkan seluruh kanal ke SSH dan membiarkan server VNC bersembunyi di loopback. Pola perintahnya:
ssh -fN -L 5901:localhost:5901 budi@server-kantorBaca dari tengah: klien SSH menyambung ke budi@server-kantor, lalu opsi -L 5901:localhost:5901 membuka port 5901 di laptop yang isinya diteruskan lewat kanal terenkripsi menuju localhost:5901 sebagaimana dilihat dari server-kantor — tepat di display :1 yang bersembunyi di loopback. Opsi -N menjaga sesi murni sebagai terowongan tanpa shell, dan -f meletakkannya ke background. Klien VNC lalu disetel ke localhost:5901, dan seluruh perjalanan gambarnya tersandi.
VNC menuntut klien terpasang di kedua sisi, tidak punya suara maupun redirect printer, dan hemat bandwidth-nya biasa saja. Di kantor yang didominasi Windows, ada satu protokol yang klien-nya sudah terpasang bawaan di setiap PC, lengkap dengan enkripsi bawaan: RDP. Chapter berikutnya memasang xrdp — penerjemah yang membuat server Linux berbicara RDP sehingga Remote Desktop Windows menyambung tanpa perangkat lunak tambahan apa pun.
Referensi lanjut: tigervncserver(1) untuk opsi pembuatan sesi virtual dan berkas konfigurasinya, serta x11vnc(1) untuk mode berbagi sesi nyata.