Gesang_[at]_localbox Just my point of view

10Sep/080

Reverse SSH tunnel

Beberapa waktu lalu saya mendapatkan tugas untuk mengadministrasi server linux, tapi berhubung jam kerja sudah habis saya putuskan untuk dikerjakan dari rumah. Tapi ada sedikit halangan yaitu server linux tersebut(Linux B) berada di LAN dan terhubung ke internet melalui modem yang tidak bisa port forwarding, tetapi untungnya gateway di rumah menggunakan linux jadi bisa port forwarding. Dengan kondisi ini maka saya putuskan untuk menggunakan reverse SSH tunnel agar saya bisa mengakses server linux(linux B) dari rumah melalui ssh. Maka sebelum pulang kerumah ada beberapa hal yang harus saya lakukan untuk melakukan hal tersebut. Untuk lebih jelasnya berikut ini network map-nya.


Untuk melakukan reverse SSH tunnel berdasarkan skenario yang ada di gambar diatas sebaiknya autentikasi ssh-nya menggunakan key agar kita tidak repot memasukan password dan bisa dijalankan memalui crontab. Berikut langkah-langkah yang harus dilakukan untuk menjalankan ssh dengan autentikasi key.

di server linux(Linux B) kita generate ssh-key dengan perintah sebagai berikut:

# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): <-- enter
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): <-- tekan enter, tanpa passphare
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is: <-- tekan enter, tanpa passphare
f4:58:8a:43:5b:73:2d:89:25:6c:7b:76:25:91:be:3e root@localhost

dari output diatas terdapat 2 key yang sersimpan di direktori /[user-home]/.ssh yaitu id_rsa sebagi private key dan id_rsa.pub sebagai public key.

Selanjutnya kita harus mengkopi public key (id_rsa.pub) ke Workstation linux(10.10.0.5), hal ini bisa dilakukan dengan USB disk atau melalui scp, pada kasus ini jika menggunakan scp berati kita terlebih dahulu harus mengatifkan port forwarding di gateway linux(Linux A) agar bisa melakukan scp ke Workstation linux(10.10.0.5). Untuk kita harus login ke Gateway linux(123.123.123.123) dan jalankan perintah berikut:

# iptables -t nat -I PREROUTING -p tcp -i ppp0 --dport 42222 -j DNAT --to 10.10.0.5:22
# iptables -A FORWARD -i ppp0 -o eth0 -p tcp --dport 22 -j ACCEPT

Setelah port forwarding aktif selajutnya kita login ke Linux B dan untuk melakukan scp dengan perintah sebagai berikut:

# cd /[home user]/.ssh
# scp -P 42222 id_rsa.pub user@123.123.123.123:/home/user

selanjutnya login ke Workstation linux secara langsung atau melalui ssh dari Linux B dengan perintah sebagai berikut:

# ssh user@123.123.123.123 -p 42222

setelah masuk ke Workstation linux baik secara langsung atau melalui ssh maka jalankan perintah berikut:

$ cd /home/user
$ cat id_rsa.pub >> .ssh/authorized_keys
$ rm id_rsa.pub

Kemudian pastikan pada file konfigurasi (/etc/ssh/sshd_config) SSH server dari Workstation linux untuk baris berikut ada dan jika tidak ada maka masukan baris berikut ini:

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys

Kemudian restart SSH server-nya, misal untuk ubuntu atau debian dengan perintah(sebagai root):

# /etc/init.d/ssh restart

Selanjutnya kita mengaktifkan port forwarding di gateway linux menggunakan iptables, karena sebelumnya diatas sudah di buat dan menggunakan port yang sama maka bisa dilanjutkan ke langkah berikutnya.

Masuk lagi ke Linux B dan buatlah script dengan nama /usr/sbin/tunnel.sh isi sebagai berikut

#!/bin/sh
REMOTE_HOST="123.123.123.123" # ip address dari gateway
LISTEN_PORT=22022 # listening port pada Workstation linux

COMMAND="ssh -p 42222 -N -f -R ${LISTEN_PORT}:localhost:22 user@$REMOTE_HOST"
pgrep -f "$COMMAND" > /dev/null 2>&1 || $COMMAND

# end of file

Keterangan

  • -p 42222 merupakan port yang di forward oleh gateway, hal ini menyesesuaikan skenario yg ada, jika mesin tujuan tidak di belakang gateway dan port ssh nya tidak dirubah maka opsi ini bisa di hilangkan.
  • ${LISTEN_PORT} merupakan listening port mesin tujuan yang pada kasus ini adalah Workstation linux
  • localhost:22 port yang di tunnel dari server linux(Linux B), pada kasus ini adalah ssh server.
  • user@$REMOTE_HOST user yang di gunakan untuk ssh dan ip address/host dari mesin tujuan.
  • pgrep -f "$COMMAND" > /dev/null 2>&1 || $COMMAND, jika COMMAND tersebut masih aktif maka batalkan dan jika tidak aktif maka di jalankan.

Ubah file permission-nya agar bisa dieksekusi

# chmod +x /usr/sbin/tunnel.sh

Nah, sampai sini reverse ssh tunnel sudah bisa di jalankan

# /usr/sbin/tunnel.sh

Sekarang kita bisa melakukan ssh ke Linux B dari Workstation linux dengan perintah:

$ ssh root@localhost -p 22022

Agar koneksi reverse ssh tunnel bisa lancar dan otomatis melakukan koneksi jika down maka masukanlah ke crontab. Misal kita set agar setiap 5 menit melakukan koneksi, maka di Linux B jalankan perintah:

# crontab -e

dan masukan baris berikut ini

0-59/5 * * * * /usr/sbin/tunnel.sh

Untuk kasus lain misal kita ingin memforward port 80(web server) dari remote host melalui reverse ssh tunnel ke port 8088 host/komputer lokal yang melewati port 808 gateway linux berarti tinggal merubah scriptnya dan port forwarding pada gateway, misal sebagai berikut

#!/bin/sh
REMOTE_HOST="123.123.123.123" # ip address dari gateway
LISTEN_PORT=8808 # listening port pada Workstation linux

COMMAND="ssh -p 808 -N -f -R ${LISTEN_PORT}:localhost:80 user@$REMOTE_HOST"
pgrep -f "$COMMAND" > /dev/null 2>&1 || $COMMAND

# end of file

Dan iptables di gateway linux:

# iptables -t nat -I PREROUTING -p tcp -i ppp0 --dport 808 -j DNAT --to 10.10.0.5:22
# iptables -A FORWARD -i ppp0 -o eth0 -p tcp --dport 22 -j ACCEPT

Maka kita dapat mengakses web server dari remote host di komputer lokal kita dengan url sebagai berikut:

http://localhost:8808

Nah, demikian tulisan kali ini dan semoga bermanfaat.

thx.

Comments (0) Trackbacks (0)

No comments yet.


Leave a comment


No trackbacks yet.