SSH Reverse Proxy

VirtualBox menyediakan beberapa tipe network adapter yang bisa dipakai oleh setiap Virtual Machinenya. Salah satu jenis network adapter yang tersedia adalah NAT. Secara default, VM yang menggunakan NAT network adapter dan VM akan otomatis mendapatkan IP 10.0.2.15 (tentu bila VM diset menggunakan DHCP). Dengan IP NAT ini, VM bisa mengakses jaringan lokal & juga Internet melalui gateway IP 10.0.2.2. Akan tetapi kelemahan sistem NAT ini adalah, Host tidak bisa mengakses VM tersebut secara langsung. Misalnya pada Macbook saya punya VM Linux (hostname = svn). Meskipun VM tersebut memiliki SSH Server, saya tidak bisa mengakses SSH server tersebut dari Terminal-nya Mac.

Salah satu alternatif cara yang bisa saya gunakan untuk mengakses Virtual Machine yang menggunakan NAT Adapter adalah dengan Reverse SSH.

Dari dalam VM saya lakukan SSH ke Host dengan perintah berikut ini :

[oracle@svn ~]$ ssh -R 8080:localhost:22 ttirtawi@10.0.2.2
Password:
Last login: Mon Oct 13 11:49:32 2014 from localhost
ttirtawi@macbookpro:~$ 

Opsi -R 8080:localhost:22 dapat dibaca seperti ini : buatlah sebuah “tunnel” dari port 8080 milik Host (10.0.2.2) ke port 22 milik VM ‘SVN’. Dengan adanya tunnel tersebut setiap kali Host membuka koneksi SSH ke port 8080 miliknya sendiri, request SSH tersebut akan diteruskan ke port 22 milik VM ‘SVN’ tersebut. Pemilihan port 8080 sifatnya bebas, selama port tersebut aktif digunakan oleh Host. Sementara 22 adalah port SSH server milik VM.

Nah dari Host, saya tinggal lakukan SSH ke localhost port 8080 seperti contoh berikut ini :

ttirtawi@macbookpro:~$ ssh -p 8080 oracle@localhost
oracle@localhost's password: 
Last login: Mon Oct 13 03:49:03 2014 from localhost
[oracle@svn ~]$ 
[oracle@svn ~]$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:49:df:4e brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
    inet6 fe80::a00:27ff:fe49:df4e/64 scope link 
       valid_lft forever preferred_lft forever
[oracle@svn ~]$ 
[oracle@svn ~]$ hostname
svn
[oracle@svn ~]$ 

Otomatis saya akan langsung terhubung ke VM tersebut. Ini tangkapan layar dari langkah-langkah tadi :

VNC Via SSH Tunnel Dengan Putty

Di tulisan sebelumnya saya menyebut soal penggunaan SSH tunnel untuk mengakses VNC. SSH tunnel dipakai bila VNC Server hanya bisa diakses dari localhost. Bila kita menggunakan SSH dengan command line, tunneling bisa dilakukan dengan menggunakan tambahan opsi -L. Namun bila saya sedang menggunakan Windows, saya hanya punya Putty sebagai SSH client. Tulisan ini adalah contoh bagaimana menggunakan Putty untuk membuat SSH tunnel. Untuk mengakses VNC dari Windows saya menggunakan aplikasi RealVNC. Aplikasi RealVNC dapat diunduh gratis dari websitenya RealVNC.

  1. Sama seperti yang sudah saya contohkan di tulisan sebelumnya, saya tidak bisa langsung mengakses VNC melalui IP publik.

    Saya akan mendapati error “Connection refused” seperti pada gambar di bawah ini :

  2. Saya perlu membuat SSH tunnel terlebih dulu dengan menggunakan Putty. Dengan menggunakan Putty saya akan mengakses IP publik VNC Server (192.168.10.41)

  3. Di sisi kiri Putty ada opsi untuk membuat SSH Tunnel.

  4. Masukkan informasi “Source port” & “Destination” lalu klik tombol Add. Source adalah port Windows, sementara Destination adalah IP loopback VNC Server.

    Ini artinya semua request ke port 5902 Windows akan di-forward ke port 5902 milik VNC Server.

  5. Hasil akhirnya seperti ini :

  6. Lalu kita kembali lagi ke halaman muka Putty (seperti pada gambar poin#2) untuk mulai membuka SSH session ke VNC Server.

  7. Bila kita belum pernah mengakses server ini sebelumnya via SSH, Putty akan menampilkan informasi untuk menerima SSH Key dari remote server. Untuk melanjutkan koneksi kita bisa klik tombol Yes.

  8. Setelah koneksi SSH sukses kita bisa kembali lagi ke aplikasi RealVNC. Hanya saja kali ini saya tidak lagi menggunakan IP publik VNC Server tapi menggunakan IP loopback Windows (127.0.0.1). Jadi seolah-olah saya mengakses IP lokal Windows di port 5902. Padahal yang terjadi adalah VNC akan meneruskan request saya ini melalui SSH ke port 5902 milik VNC Server.

  9. Biasanya akan muncul jendela peringatan unencrypted connection, kali ini kita bisa abaikan saja peringatan ini dengan mengklik tombol Continue.

  10. Saat koneksi ke VNC Server sukses, akan muncul jendela yang meminta kita untuk memasukkan VNC password.

  11. Bila kita memasukkan VNC password yang benar, kita langsung mendapati halaman desktop VNC Servernya. Karena mesin vm01 pada contoh ini menggunakan Gnome Desktop Environment, yang muncul pertama kali ada halaman login Gnome. Setelah login saya segera mendapati desktop mesin vm01.