Belajar setup VPN sendiri untuk access komputer di rumah

Ahad, 25 Mei 2025, 3:35 pm

Ada beberapa eksperimen awal dibuat sebelum akhirnya pilih guna cara VPN.

Objektif asal adalah supaya saya dapat access laptop Thinkpad kat rumah menggunakan SSH. Cara yang biasa orang buat ialah dengan set port forwarding kat home router.

639D44B9-21EA-4BA5-B4DB-BB460943B562.jpeg
Yes kat rumah.

Dalam configuration awal ini, saya dah set laptop Thinkpad kepada static IP, dan forward port 22 ke laptop ni. Lepas tu buat satu Python script untuk dapatkan IP address daripada router ini secara berkala guna cron job dalam Thinkpad, dan update subdomain kat Cloudflare.

Semua configuration dah ok, IP address dah betul kat subdomain, tapi bila test guna internet luar, sama ada dari ofis atau guna personal hotspot line Celcom pada iPhone, tak dapat nak connect guna SSH, nak ping pun tak dapat. Saya juga dah test run Apache HTTPd dan forward port 80, pun tak dapat nak connect.

Antara sebab kenapa saya tak dapat connect ke laptop Thinkpad menerusi IP address pada router, ialah Yes 5G guna teknik dinamakan CGNAT, yang mana satu public IP address dikongsi dengan beberapa orang customer, supaya dapat menjimatkan penggunaan public IP address. Kalau nak tahu IP address yang diberi oleh ISP adalah CGNAT ialah lihat pada pattern IP address yang biasanya bermula dengan 10.x.x.x.

Ambil sebagai contoh, public IP address ialah 42.152.0.1, dan kami customer Yes 5G, setiap kali sambung ke internet, akan diberi IP address seperti 10.141.0.1. Jadi bila saya update subdomain kat Cloudflare, IP address yang saya simpan ialah 10.141.0.1. Dan bila saya nak connect ke IP address ni, memang tak dapat, sebab ia address yang terlindung di sebalik public IP address 42.152.0.1.

Lepas tangguh projek ni beberapa bulan, dalam bulan ni baru datang balik mood. Disebabkan saya ada VPS kat Lightsail, ideanya, saya connect dari laptop Thinkpad ke VPS, kemudian forward port 22 kat laptop ke satu port kat VPS (contohnya port 10022) . Supaya bila saya connect terus ke VPS port 10222, dah dapat access laptop kat rumah.

Walau bagaimanapun, cara ini ada beberapa kelemahan. Yang paling ketara ialah nak kena kekalkan sambungan (persist connection) dari laptop Thinkpad ke VPS, terpaksa buat custom systemd service.

Sambungan ni berdasarkan SSH tunneling, yang sesuai untuk trafik rendah. Kalau nak forward port yang guna trafik tinggi seperti web server atau video streaming, connection ini tak stabil: TCP vs UDP, ni saya tak pandai nak terangkan secara terperinci, tapi secara asas, TCP sesuai untuk connection jenis sekali sambung sekali hantar data, UDP lebih kepada connection yang bersambung lama (keep alive).

Selain dari itu, guna SSH tunneling ni, nak kena specify port secara terperinci. Agak leceh bila nak tambah service, contohnya nak setup website baru kat laptop guna port 8088, nak kena tambah port ni kat SSH command dalam systemd service.

Dua kelemahan utama ini mendorong saya mencari solusi lain. Tanya AI, dia bagi cadangan guna , satu aplikasi VPN tunnel yang pantess~.

FE7B711F-5997-48FA-B843-922E00A7D3EB.jpeg
Network topology VPN menggunakan WireGuard.

Di sini saya ada VPS (virtual private server) kat AWS, 5G router untuk internet kat rumah, home server tu adalah Thinkpad laptop saya yang dijadikan server, dan laptop ialah Macbook Air.

Idea di sini ialah VPS akan menjadi hub. Home server dan laptop, dan peranti akan datang (future devices), akan menjadi peer. Peer akan initiate connection ke hub. Lepas connection semua bersambung, kesemua peranti akan ‘nampak’ satu sama lain dalam satu virtual private network (VPN).

Kedua² VPS dan home server menggunakan Linux, dan Macbook Air sudah tentu guna macOS. Cara install WireGuard adalah bergantung kepada OS masing². Di sini saya nak kongsi cara configure setiap peer dalam VPN ni.

Lepas install WireGuard, setiap peranti akan dapat satu network interface baru (wg0) untuk VPN connection. Network interface ni akan ditetapkan static IP, dengan pattern 10.100.0.x

Untuk VPS, sebagai hub, ia akan menyimpan public key untuk setiap peer yang ada. Ini contohnya:

[Interface]
Address = 10.100.0.1/24
PrivateKey = VpSpRiVaTeKeY
ListenPort = 51820

[Peer]
# Home server
PublicKey = HoMeSeRvErPuBlIcKeY
AllowedIPs = 10.100.0.2/32

[Peer]
# Laptop
PublicKey = LaPtOpPuBlIcKeY
AllowedIPs = 10.100.0.3/32

Untuk peer seperti home server & laptop, hanya perlu simpan public key ke VPS, dan mesti letak PersistentKeepalive supaya ia yang memulakan sambungan (initiate connection). VPS takkan initiate sambungan ke peranti lain.

[Interface]
Address = 10.100.0.2/24
PrivateKey = hOmEsErVeRpRiVaTeKeY

[Peer]
# VPS
PublicKey = vPsPuBlIcKeY
AllowedIPs = 10.100.0.0/24
PersistentKeepalive = 25

AllowedIPs guna IP range, supaya semua connection ke IP range 10.100.0.x akan melalui network interface VPN, dan trafik lain akan guna network interface utama peranti tersebut (contohnya network card, card, USB personal hotspot dll.)

Sekarang, semasa guna laptop, kalau saya nak access VPS, saya hanya guna IP 10.100.0.1. Nak access home server, guna 10.100.0.2. Tak kira laptop saya bersambung dengan internet kat mana² saja, IP address tetap sama.

Dengan adanya setup begini, dapatlah saya pindah website WordPress ke rumah, atau tambah lagi services, seperti Nextcloud (cloud service sendiri), Vaultwarden (password manager sendiri), atau WebSVN (SVN repository hosting).

Ideanya, hanya install reverse proxy kat VPS (seperti nginx). Kemudian setup supaya trafik ke domain atau subdomain tertentu, di-forward ke service² yang disebut di atas. Contohnya:

  • azwan082.my → 10.100.0.2:8080 (Apache HTTPd, WordPress)
  • cloud.azwan082.my → 10.100.0.2:8081 (Apache HTTPd, Nextcloud)
  • svn.azwan082.my → 10.100.0.2:8082 (Apache HTTPd, mod_dav_svn)

Setup begini nanti bila dah siap baru tulis cerita lagi 😁.

Komentar (0):

FB: https://www.facebook.com/100810608155424/posts/1381172919716283/

Tulis komen: