Membuat Persistent SSH Tunnel Menggunakan AutoSSH dan Systemctl

Mahendra Data
5 min readMar 30, 2020

--

Source: https://pixabay.com/illustrations/wormhole-space-time-light-tunnel-739872/

Kadang kita memerlukan network tunnel, misalnya untuk mengamankan koneksi internet atau membuat proxy untuk mengakses konten tertentu. Secure Shell (SSH) dapat digunakan sebagai cara alternatif untuk membuat network tunnel tersebut dengan mudah. Pada artikel ini saya akan membahas cara membuat SSH tunnel yang persistent (terus menerus atau tahan lama) menggunakan autossh dan systemctl. Sistem Operasi yang saya gunakan adalah Mint 19.3, namun secara umum cara ini bisa dipakai di semua distribusi Linux lainnya.

Sebelum kita lanjutkan, konsensus dalam artikel ini adalah:

  1. $ symbol ini menandakan perintah command line;
  2. ~ symbol ini menandakan home directory;
  3. <username> adalah username anda pada remote server yang anda gunakan untuk membuat tunnel.
  4. <remote server> adalah IP atau domain dari remote server.

Konfigurasi SSH

Membuat SSH Key

Langkah pertama adalah membuat SSH key. SSH key ini kita perlukan agar kita dapat login ke remote server tanpa menggunakan password. Anda bisa melewati langkah ini bila anda telah memiliki SSH key.

Buat SSH key tanpa password menggunakan perintah:

$ ssh-keygen -t rsa -b 4096

Anda bisa menekan enter hingga selesai untuk membuat SSH key menggunakan default parameter dan tanpa password. Secara default, private key disimpan di ~/.ssh/id_rsa sedangkan public key disimpan di ~/.ssh/id_rsa.pub.

Konfigurasi SSH Key di Remote Server

SSH key yang telah kita buat harus kita copy ke remote server. Ada beberapa cara, yang paling mudah adalah menggunakan perintah:

$ ssh-copy-id -i ~/.ssh/id_rsa <username>@<remote server>

Masukkan password remote server anda. Bila langkah ini berhasil, maka sekarang anda dapat login ke remote server tanpa menggunakan password. Anda dapat mencoba login tanpa password dengan perintah:

$ ssh -i ~/.ssh/id_rsa <username>@<remote server>

Konfigurasi SSH Config

Untuk memudahkan kita dalam membuat tunnel, kita perlu melakukan konfigurasi beberapa parameter SSH dengan menuliskannya ke dalam file ~/.ssh/config. Buat atau modifikasi file ~/.ssh/config dengan menambahkan konfigurasi berikut ini

Host my.ssh.tunnel
# mandatory configuration
User <username>
IdentityFile ~/.ssh/id_rsa
Hostname <remote server>
DynamicForward 8080
# optional configuration
ServerAliveInterval 240
ServerAliveCountMax 3
ExitOnForwardFailure yes
Compression yes
ControlMaster auto
ControlPath ~/.ssh/%r@%h:%p.sock

Pada konfigurasi tersebut saya membuat host alias my.ssh.tunnel (anda dapat menggantinya dengan nama lain) menggunakan tunnel dengan jenis DynamicForward. Jenis tunnel ini dapat digunakan sebagai proxy server untuk web browser. Anda bisa mengganti atau menambahkan jenis tunnel sesuai dengan kebutuhan anda, misalnya denganLocalForward.

Uji Coba SSH Tunnel

Setelah melakukan konfigurasi ssh config sebenarnya anda sudah bisa menggunakan tunnel tersebut dengan perintah:

$ ssh -fN my.ssh.tunnel

Perintah tersebut akan membuat koneksi SSH tunnel secara background. Anda bisa mencobanya dengan melakukan konfigurasi web browser terlebih dahulu. Cara konfigurasi web browser berbeda-beda, berikut adalah contoh konfigurasi pada Mozilla Firefox.

Gambar 1. Konfigurasi Proxy pada Mozilla Firefox

Pilih Manual proxy configuration, isi SOCKS Host dengan alamat localhost misalnya 127.0.0.1, dan isi port dengan DynamicForward yang anda gunakan pada ~/.ssh/config misalnya 8080 .

Sekarang buka tab baru pada Mozilla Firefox dan buka alamat berikut https://whatismyipaddress.com/. Bila tunnel yang kita buat sukses, maka alamat IP yang tampil pada halaman tersebut adalah IP dari remote server kita.

Jalankan perintah berikut ini untuk mematikan SSH tunnel yang sebelumnya kita buat.

$ ssh -O exit my.ssh.tunnel

Persistent SSH Tunnel Menggunakan AutoSSH

Sebenarnya dengan perintah ssh seperti contoh sebelumnya sudah cukup untuk membuat tunnel, tapi bila koneksi ssh tersebut terputus (misal karena timeout) maka SSH tunnel yang kita buat tidak akan otomatis terhubung kembali, kita harus melakukannya secara manual dari awal.

Instalasi AutoSSH

AutoSSH dapat kita gunakan untuk melakukan proses reconnect tersebut dengan otomatis. Langkah pertama adalah dengan melakukan instalasi AutoSSH dengan perintah:

$ sudo apt install autossh

Bila autossh telah ada di komputer anda sebelumnya, maka anda bisa melewati langkah instalasi ini.

Menjalankan AutoSSH

Langkah kedua adalah membuat SSH tunnel menggunakan AutoSSH secara background dengan perintah:

$ autossh -M 0 -f -N my.ssh.tunnel

Cobalah membuka https://whatismyipaddress.com/ untuk mengecek apakah SSH tunnel tersebut telah berjalan.

Menghentikan AutoSSH

Satu-satunya cara untuk menghentikan AutoSSH yang telah kita jalankan sebelumnya adalah dengan perintah kill. Namun untuk bisa menggunakan perintah kill kita perlu mengetahui PID dari proses AutoSSH yang berjalan secara background tersebut. Gunakan perintah berikut untuk mencari tau PID dari AutoSSH yang telah kita jalankan sebelumnya.

$ ps x | grep autossh

Output perintah tersebut kurang lebih seperti ini

10287 ? Ss 0:00 /usr/lib/autossh/autossh -M 0 -N my.ssh.tunnel

Pada contoh output tersebut 10287 adalah PID dari AutoSSH tunnel yang kita buat. Hentikan proses tersebut dengan perintah:

$ kill 10287

Manajemen AutoSSH Background Process Menggunakan Systemctl

Menghentikan AutoSSH dengan perintah kill seperti contoh sebelumnya bagi saya sangat merepotkan. Saya ingin proses start, stop dan pengecekan status background process SSH tunnel tersebut dilakukan dengan mudah.

Akhirnya saya menemukan cara mengelola SSH tunnel tersebut menggunakan systemctl. Pada Ubuntu Linux dan distro turunannya seperti Mint Linux, systemctl secara default telah terpasang sehingga dapat langsung anda gunakan.

Konfigurasi Systemctl Tanpa Root Privilege

systemctl dapat digunakan tanpa root privilege. Langkah pertama, buatlah directory ~/.config/systemd/user dengan perintah:

$ mkdir -p ~/.config/systemd/user

Kemudian buatlah file dengan extension .service dalam directory tersebut, misalnya ~/.config/systemd/user/my.ssh.tunnel.service dengan isi berikut:

[Unit]
Description=AutoSSH tunnel service to My SSH Tunnel Server
[Service]
Environment="AUTOSSH_GATETIME=0"
ExecStart=/usr/bin/autossh -M 0 -N my.ssh.tunnel
Restart=on-failure
RestartSec=10
TimeoutSec=10
[Install]
WantedBy=default.target

Reload service tersebut dengan perintah

$ systemctl --user daemon-reload

Perintah tersebut perlu anda jalankan tiap kali menambah atau melakukan modifikasi file .service dalam directory ~/.config/systemd/user.

Manajemen AutoSSH Tunnel Menggunakan Systemctl

Untuk mengaktifkan tunnel tersebut, jalankan perintah:

$ systemctl --user start my.ssh.tunnel.service

Untuk mengecek status tunnel tersebut, jalankan perintah:

$ systemctl --user status my.ssh.tunnel.service

Untuk menghentikan tunnel tersebut, jalankan perintah:

$ systemctl --user stop my.ssh.tunnel.service

Demikian, sekarang kita bila mengelola SSH Tunnel kita dengan mudah. Selamat mencoba.

Referensi

Panduan dan penjelasan lebih detail dari perintah dan langkah-langkah yang digunakan dalam artikel ini dapat anda baca di:

--

--

Mahendra Data

Lecturer at Faculty of Computer Science, Universitas Brawijaya • System Administrator • https://www.linkedin.com/in/mahendra-data/