Membuat Persistent SSH Tunnel Menggunakan AutoSSH dan Systemctl
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:
$
symbol ini menandakan perintah command line;~
symbol ini menandakan home directory;<username>
adalah username anda pada remote server yang anda gunakan untuk membuat tunnel.<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.
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: