Port forwarding dg NAT

Ceritanya saya punya mesin, katakanlah bernama C, yang cuma bisa diakses dari dalam jaringan lokal. Saya juga punya mesin bernama M yang bisa diakses dari jaringan lokal DAN juga dari internet. Nah, berhubung si C bisa diakses oleh M, tentu saja saya bisa mengakses C dari internet dg menghubungi M terlebih dahulu.

Cara yang biasa saya lakukan adalah dg membuat koneksi ke M melalui SSH. Setelah di dalam M, saya buka lagi koneksi ke C, lagi-lagi melalui SSH. Intinya saya harus menyiapkan koneksi ke M via SSH terlebih dahulu sebelum saya bisa menghubungi si C. Caranya sendiri pernah saya tuliskan sebelumnya: port forwarding dengan SSH atau dengan membuat socks proxy.

Lama-lama saya malas juga membuat koneksi SSH ke M setiap saya ingin menghubungi C. Mengingat saya memiliki akses administrator di mesin M, akhirnya saya mencoba cara lain, yaitu port forwarding dg NAT alias Network Address Translation. Cara kerja NAT akan saya bahas di lain waktu (kalau ingat, kalau lagi gak malas, kalau mau :P) jadi skr lgs ke inti solusinya saja.

Pertama-tama, aktifkan dulu IP forwarding. (oh iya.. perintah2 ini dikerjakan di mesin M)

# echo 1 > /proc/sys/net/ipv4/ip_forward

Pastikan perintah di atas dijalankan oleh root.. atau versi dengan sudo nya adalah seperti berikut.

$ echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

Kalau IP forwarding sudah diatur, mari kita buat NAT, atau lebih tepatnya DNAT alias Destination NAT berhubung yang akan dibelokkan itu adalah alamat tujuan koneksi.

$ sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --source 1.2.3.4 --dport 12345 -j DNAT --to 10.20.30.40:22

Saya ingin membuat NAT yg terbatas dari segi alamat sumber. Dalam contoh di atas, hanya koneksi dari alamat 1.2.3.4 yang akan dialihkan. Selain dari itu, koneksi akan berhenti sampai di sini saja. Selain itu hanya koneksi yg nyampe di eth0 dg protokol tcp di port 12345 yang akan dilayani.

Jika ada koneksi yg sesuai, koneksi ini lalu akan dibelokkan ke mesin dg IP 10.20.30.40, yaitu mesin C, pada port 22.

Singkatnya, jika ada mesin dg IP 1.2.3.4 membuat koneksi ke eth0 di mesin M dg protokol tcp dg 12345, maka koneksi akan dibelokkan ke mesin dg IP 10.20.30.40 pada port 22.

Nah kalau sudah begini, saya dari rumah (yg pake IP 1.2.3.4) bisa membuat koneksi ke mesin C melalui si M tanpa harus membuat koneksi SSH dulu ke M.

rumah$ ssh M -p 12345

Perintah SSH di atas akan langsung terhubung dg mesin C walau koneksi ditujukan ke M karena si M akan membelokkan koneksi ke C.

Selain tuk mengakses C dg SSH langsung dari komputer rumah, yg seperti ini saya pakai juga tuk keperluan lain.. misalnya..

Di mesin M ini saya juga punya sebuah instance virtual machine (VM) dengan VirtualBox. Saya mengaktifkan layanan virtual desktop (dengan RDP) di VirtualBox ini berhubung mesin M ini ada entah-di-mana sehingga saya tidak punya akses fisik langsung. Antara VM dengan host-nya (si M) sudah terjalin hubungan baik melalui jaringan host-only di VirtualBox. Kalau saya ingin mengakses si VM maka, seperti tadi, saya harus mengakses M terlebih dahulu. Dengan melakukan port forwarding, saya bisa mengakses si VM dari C scr langsung.

Mentunnel koneksi dengan bantuan tsocks

Bagi yang cermat membaca tulisan saya sebelumnya mengenai pembuatan tunnel mungkin akan bertanya apakah kalau ingin menggunakan tunnel, maka aplikasi yang ingin kita pakai harus mendukung SOCKS proxy atau kita harus membuka jalur untuk setiap port yang akan digunakan?

Jawabannya ada tidak. Karena kita bisa memaksa seluruh koneksi yang dibuat oleh sebuah aplikasi menggunakan tunnel yang kita buat sebelumnya. Untuk keperluan ini kita bisa menggunakan aplikasi bernama tsocks.

Kalau di Ubuntu atau Debian, instalasi tsocks sangat mudah. Jalankan saja apt-get nya 🙂

$ sudo apt-get install tsocks

Setelah itu, sunting berkas konfigurasinya di /etc/tsocks.conf. Atur nilai server dan server_port.

...
server = 127.0.0.1
server_port = 12345
...

Sesuaikan sendiri alamat dan port yang akan digunkan dan juga konfigurasi lainnya. Kali ini kita akan membuka tunnel di komputer sendiri pada port 12345.

$ ssh server.perantara -D12345

Lalu di console lain, jalankan aplikasi tsocks.

$ tsocks
$

Seolah-olah memang tidak terjadi apa-apa. Namun sebenarnya kita sudah masuk ke dalam shell baru yang berada di bawah tsocks Setiap koneksi yang dibangun di sana akan dibelokkan ke tunnel yang sudah dibuat sebelumnya.

Demo sedikit:

$ bzr branch http://dev.blankonlinux.or.id/bzr/meuligoe/apt
bzr: interrupted

(males nunggunya, lambat =P)

$ ssh apalah -D12345 -f -N

(buka tunnel. Opsi -f -N silakan dicari sendiri ya apa artinya)

$ tsocks

(jalankan tsocks)

$ bzr branch http://dev.blankonlinux.or.id/bzr/meuligoe/apt
Branched 29 revision(s).

(akhirnya tersedot juga cabang bzr nya)

Selamat bereksperimen =D

Tunnel koneksi

Sebagai pengembang BlankOn, maka salah satu server yang sering saya dikunjungi adalah yeyen alias irgsh alias dev.boi. Namun, mengakses server itu dari sini perlu ditemani oleh sebungkus indomie yang belum dimasak sehingga bisa masak sambil nungguin koneksi beres xD Ini apa koneksi Internet di Belanda kurang cepet tuk ngakses mesin tsb? Di Finlandia kabarnya juga seperti itu =P

Untungnya saya punya akses yang lumayan cepat ke sebuah mesin yang punya koneksi lumayan cepat ke mesin yeyen.. Dengan kata lain, ada mesin perantara yang punya koneksi lumayan ke saya dan yeyen. Hal ini berarti saya bisa menggunakan mesin tersebut untuk dijadikan tukang ojek seluruh data yang mau saya kirim/terima ke/dari mesin yeyen =D

Kalau mau mengakses layanan http dengan browser, saya biasanya membuka tunnel via ssh dengan menggunakan socks proxy. Sintaksnya kira2 seperti ini.

$ ssh -D12345 mesin.perantara

Port 12345 adalah port dari socks proxy yang akan digunakan. Browser tinggal diatur agar menggunakan socks proxy pada port tersebut supaya koneksi dilewatkan melalui mesin perantara.

Namun.. berhubung koneksi dari tempat saya itu sudah cukup cepat tuk mengakses situs2 lainnya, mengapa seluruh koneksi harus dilewatkan ke mesin perantara terlebih dahulu? Maka dari itu, akan lebih baik apabila kita bisa memilah-milih koneksi mana yang mau dilewatkan atau langsung.

Konfigurasi proxy di browser Firefox yang saya gunakan hanya bisa membuat pengecualian situs mana yang tidak dilewatkan melalui perantara. Yang saya inginkan adalah kondisi sebaliknya dimana saya ingin menentukan situs yang ingin dilewatkan melalui perantara. Untungnya, Firefox mendukung fasilitas konfigurasi proxy otomatis sehingga saya bisa mengatur lewat konfigurasi yang ini.

Caranya adalah dengan membuat berkas skrip konfigurasi proxy otomatis seperti yang berikut ini.

function FindProxyForURL(url, host) {
   if (shExpMatch(url, "*dev.blankonlinux.or.id/*") ||
       shExpMatch(url, "*irgsh.blankonlinux.or.id/*") ||
       shExpMatch(url, "*yeyen.blankonlinux.or.id/*") ||
       shExpMatch(url, "*cecunguk.blankonlinux.or.id/*") ||
       shExpMatch(url, "*.ubuntu-id.org/*")) {

      return "SOCKS 127.0.0.1:12345; DIRECT";
   }

   return "DIRECT";
}

Seperti yang tertulis di atas, koneksi ke beberapa situs akan dialihkan melalui SOCKS proxy di 127.0.0.1 port 12345. Jika proxy tersebut tidak tersedia (misalnya saya belum membuka koneksi tunnel tsb), maka koneksi langsung tanpa proxy (DIRECT) akan dibuat. Untuk koneksi menuju situs selain yang disebutkan di sana, koneksi langsung akan digunakan.

Simpan skrip di atas ke dalam sebuah berkas, misalnya proxy.pac. Lalu tunjuk berkas tersebut dari kolom pengaturan konfigurasi otomatis, misalnya file:///Users/iang/Sites/proxy.pac. URL tersebut akan menunjuk ke berkas yang ada di /Users/iang/Sites/proxy.pac. Silakan disesuaikan sendiri.

Urusan dengan koneksi http/https bisa dianggap sudah selesai. Namun, saya juga masih harus dapat mengakses mesin yeyen melalui koneksi ssh, misalnya untuk mengirim perubahan pada cabang Bazaar yang ada di mesin yeyen. Bagaimana supaya koneksi bisa dilewatkan melalui mesin perantara juga? tentu saja melalui tunneling =D

Caranya kira2 seperti ini.

$ ssh -L2222:yeyen.blankonlinux.or.id:22 mesin.perantara

Dengan menjalankan perintah tersebut, maka di mesin kita sendiri (lokal = L) akan dibuka port 2222 dimana koneksi menuju port tersebut akan diteruskan ke mesin yeyen.blankonlinux.or.id port 22 melalui si mesin.perantara.

Dengan ini, saya bisa menggunakan port tersebut saat mengirim perubahan pada cabang Bazaar. Misalnya seperti berikut.

$ bzr push bzr+ssh://[email protected]:2222/bzr/meuligoe/firefox/

Yayyaa.. begitulah kira2.. silakan dicoba2 sendiri =P

Numpang donlod pake ssh

Andai sedang make komputer tak terhubung lgs dg internet namun pengen donlod dan di sebelah ada komputer yg nyambung dg internet, ssh tunneling bisa dipake :D. Contoh:

$ ssh perantara wget -O - http://apalah.ini/donlodan.tar.gz > donlodan.tar.gz

Berhubung ssh bisa nerusin stdin, stdout, dan stderr dan wget bisa ngeluarin data ke stdout, ya marilah kita perdayagunakan stdout tsb.