Mengakses localhost dari Internet dengan SSH Tunneling

2 min read

Disclaimer
Saya bekerja di AWS, semua opini adalah dari saya pribadi. (I work for AWS, my opinions are my own.)
Mengakses Localhost dari Internet
Photo by Philipp Katzenberger on Unsplash

TeknoCerdas.com – Salam cerdas untuk kita semua. Untuk mengakses localhost dari internet kebanyakan developer mungkin akan menggunakan tools populer seperti ngrok. Tapi jika anda sudah punya server seperti VPS yang dapat diakses dari internet maka cukup gunakan SSH tunneling untuk mengakses localhost dari internet. Cara ini juga lazim disebut dengan SSH reverse tunneling.

Akses ke localhost dari internet kadang sering dibutuhkan terutama untuk melakukan tes integrasi dengan pihak ketiga. Beberapa contohnya adalah mengetes Facebook atau Google OAuth, GitHub web hook, Slack web hook dan masih banyak lagi.

Baca Juga
Tutorial SSH: Menonaktifkan Login Menggunakan Password

Untuk mengakses localhost dari internet dengan SSH yang dibutuhkan adalah sebuah server yang memiliki IP publik dan konfigurasi firewall yang sesuai untuk memperbolehkan akses dari internet ke server tersebut.

Pada contoh ini kita akan melakukan forwarding port 8080 di server ke port 9090 di lokal komputer.

+----------+   v.x.y.z:8080  +------------+  127.0.0.1:9090   +-----------+
| Internet | --------------> | SSH Server | ----------------> | Localhost |
+----------+                 +------------+                   +-----------+

1. Pastikan Firewall Terbuka (Server)

Buka firewall pada port 8080 di sisi server agar koneksi dari internet dapat diteruskan ke komputer lokal. Jika anda menggunakan Ubuntu Linux anda dapat menggunakan perintah ufw untuk memperbolehkan akses perto 8080 TCP.

$ sudo ufw allow 8080/tcp

Pada distribusi Linux lain dapat menggunakan iptables secara langsung. Namun jika menggunakan hosting di cloud seperti AWS, GCP, DO dan lainnya silahkan atur lewat konfigurasi security group atau firewall masing-masing provider.

2. Modifikasi Konfigurasi SSH Daemon (Server)

Secara default port forwarding hanya dapat dilakukan jika bind_address pada server hanya local loopback atau 127.0.0.1. Jika ingin bind ke semua interface termasuk 0.0.0.0 maka harus mengubah konfigurasi GatewayPorts pada SSH.

Karena kita ingin port forwarding ini untuk dapat diakses lewat internet maka bind ke 0.0.0.0 wajib dilakukan. Untuk itu ubah file /etc/ssh/sshd_config.

$ vi /etc/ssh/sshd_config

Kemudian tambahkan baris berikut ini.

GatewayPorts yes

Simpan kembali file konfigurasi tersebut lalu reload SSH service.

$ sudo systemctl reload ssh

3. Menyalakan Web Server (Lokal)

Pada contoh ini saya menggunakan web server bawaan dari Python dan membuat sebuah file teknocerdas.txt sebagai file yang akan diakses nantinya. Isi dari file tersebut adalah sebagai berikut:

Teknocerdas.com - Berita teknologi yang mencerdaskan

Simpan file tersebut. Diasumsikan file tersebut berada pada /tmp/webserver/teknocerdas.txt. Nyalakan web server bawaan dari Python 3 pada direktori /tmp/webserver.

$ python3 -m http.server --bind 127.0.0.1 --directory /tmp/webserver 9090

Sekarang coba akses alamat http://localhost:9090/teknocerdas.txt lewat web browser.

Localhost Web Server untuk SSH Tunnel
Web server yang berjalan pada komputer lokal port 9090

4. Membuat SSH Tunnel (Lokal)

Sekarang waktunya untuk membuat SSH reverse tunnel yang akan meneruskan paket dari server port 8080 ke lokal komputer port 9090. Perintah yang digunakan adalah:

$ ssh -R 0.0.0.0:8080:127.0.0.1:9090 -C -N user@server-ip

Penjelasan perintah SSH diatas.

  • -R menunjukkan penggunaan Reverse Tunnel artinya dari server ke lokal.
  • 0.0.0.0:8080:127.0.0.1:9090 SSH pada server akan melakukan bind ke 0.0.0.0 (semua interface) port 8080 agar bisa diakses lewat internet. Paket akan diteruskan ke alamat 127.0.0.1 port 9090 pada komputer lokal.
  • -C mengaktifkan kompresi.
  • -N tidak perlu mengeksekusi perintah pada server karena yang digunakan hanyala port forwarding.
  • user@server-ip login sebagai user ke server dengan alamat server-ip.

Manual lengkap dapat dilihat dengan perintah man ssh atau online manual di https://www.openssh.com/manual.html.

5. Tes Koneksi Tunnel

Pada SSH server jalankan perintah berikut untuk mengetahui apakah ada service yang berjalan pada semua network interface dan port 8080.

$ ss -lnt4
State          Recv-Q          Send-Q                   Local Address:Port                   Peer Address:Port         Process
LISTEN         0               128                            0.0.0.0:8080                        0.0.0.0:*
LISTEN         0               4096                     127.0.0.53%lo:53                          0.0.0.0:*
LISTEN         0               128                            0.0.0.0:22                          0.0.0.0:*

Dapat terlihat sudah ada service yang berjalan pada 0.0.0.0:8080 itu artinya SSH reverse tunnel telah berjalan.

Pada komputer anda atau perangkat lain coba buka alamat IP dari server SSH port 8080 pada browser.

http://SERVER-IP:8080/teknocerdas.txt.

Harusnya tampilan terbuka dengan isi dari file teknocerdas.txt. Itu artinya localhost berhasil diakses lewat internet menggunakan SSH tunneling.

Localhost berhasil diakses lewat internet
Localhost berhasil diakses lewat internet melalui mesin SSH server

Jika dipadukan dengan layanan dari Cloudflare maka anda dapat gratis SSL certificate untuk domain tanpa perlu repot.

Cukup mudah bukan? Selamat mencoba.