Cara Membuat Wi-Fi Hotspot pada Linux Menggunakan Virtual Interfaces dan Hostapd

Membuat hotspot pada Linux normalnya bisa melalui aplikasi network manager pada Linux desktop tetapi memiliki kekurangan yaitu hanya bisa membagikan jaringan internet dari interface atau sumber perangkat selain perangkat wifi yang digunakan untuk dijadikan wifi hotspot. Jadi tidak bisa membagikan internet yang didapat dari wifi menjadi wifi hotspot dengan satu perangkat. Pada sistem operasi sebelum Windows 10 pembuatan hotspot bisa menggunakan aplikasi connectify ataupun menggunakan perintah netsh pada command prompt, lalu pada Windows 10 terbaru sudah menyediakan fitur hotspot pada sistem operasinya. Dalam artikel ini saya akan membagikan cara membuat hotspot pada Linux hanya menggunakan satu perangkat wifi menggunakan virtual interfaces dan hostapd.

Cara ini dapat digunakan untuk Linux Debian, Ubuntu, dan turunannya. Cara ini telah saya coba pada Linux Ubuntu 18.04. Untuk Linux distribusi RedHat, SlackWare, Fedora, OpenSuse, ArchLinux, dll bisa menyesuaikan perintahnya karena konsepnya sama.

Pertama, package yang harus diinstall yang bukan bawaan dari ubuntu yaitu : hostapd, udhcpd, dan wpa_supplicant. (kalau tidak salah hanya itu packagenya, saya lupa)
sudo apt install hostapd udhcpd wpa_supplicant

Cara ini tidak permanen, hanya akan berjalan selama PC masih hidup, jika PC mati/restart maka setting akan kembali seperti semula (selain file konfigurasinya). Berikut langkah-langkahnya (klik tulisan disetiap langkah-langkahnya untuk melihat detailnya) :
1. Mematikan service dan interface yang bersangkutan.
Sebelumnya hafalkan nama SSID yang ingin dihubungkan (atau bisa lihat smartphone), saya belum tahu cara buat ngelist SSID lewat terminal.
a. Matikan aplikasi network-manager
sudo service network-manager stop

b. Matikan aplikasi wpa_supplicant
sudo service wpa_supplicant stop

c. Matikan interface wifi bawaan terlebih dahulu (lihat nama interfacenya dengan perintah "iw dev"). Misal nama interfacenya wlp3s0 :
sudo ifconfig wlp3s0 down
2. Mensetting virtual wifi interface.
a. Buat virtual wifi interface untuk station. Contoh membuat interface dengan nama station1 :
sudo iw phy phy0 interface add station1 type station

b. Buat virtual wifi interface untuk access point. Contoh membuat interface dengan nama ap1 (tulisan pada type adalah underscore 2 kali ap) :
sudo iw phy phy0 interface add ap1 type __ap

c. Ganti MAC Address dari kedua virtual interface yang telah dibuat. Lebih baik ganti MAC Address dengan MAC Address perangkat wifi aslinya (bisa dilihat menggunakan perintah "iw dev") dengan digit terakhirnya diganti. Misal MAC Address perangkat wifinya adalah 92:45:78:FA:B2:89 maka bisa diganti dengan :
MAC Address station1 = 92:45:78:FA:B2:8A
MAC Address ap1 = 92:45:78:FA:B2:85
perintah untuk mengubah MAC Address station1 dan ap1 :
sudo ifconfig station1 hw ether 92:45:78:FA:B2:8A
sudo ifconfig ap1 hw ether 92:45:78:FA:B2:85
3. Mensetting perangkat wifi sebagai station.
a. Buat file /etc/wpa_supplicant.conf
- Setting untuk terhubung ke Wifi dengan security WPA-PSK :
Sebelumnya generate psk gunakan perintah :
wpa_passphrase namaSSID passwordWifi
Lalu buat konfigurasi sebagai berikut sesuaikan ssid dan psk yang didapat dari perintah sebelumnya :
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="namaSSID"
psk=b77777d299e9c892dd77ede27494c96327e4c709ba2ec4dd361a6e550a142448
scan_ssid=1
proto=WPA RSN
key_mgmt=WPA-PSK
pairwise=CCMP TKIP
group=CCMP TKIP
}

- Setting untuk terhubung ke wifi tanpa security (open) :
network={
ssid="namaSSID"
key_mgmt=NONE
priority=100
}

b. Hubungkan station :
sudo wpa_supplicant -i station1 -c /etc/wpa_supplicant.conf
Biarkan terminal tetap terbuka, jika ditutup maka sama saja dengan disconnect dari jaringan tersebut.

c. Set IP station dengan DHCP :
sudo udhcpc -i station1
4. Mensetting perangkat wifi sebagai access point (hotspot).
a. Buat file /etc/hostapd.conf berisi :
interface=ap1
driver=nl80211
ssid=NamaSSID
channel=7
hw_mode=g
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=3
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
Setting ini akan membuat hotspot dengan nama "NamaSSID" dan password 12345678

b. Jalankan Access Point :
sudo hostapd /etc/hostapd.conf
Biarkan terminal tetap terbuka, karena jika ditutup maka hotspot akan berhenti.
5. Mensetting DHCP Server
Langkah ini opsional, karena digunakan untuk mempermudah saat terhubung dengan mendapatkan IP secara otomatis, jika langkah ini dilewati maka setiap kali ingin terhubung dengan hotspot maka harus mensetting IP secara manual terlebih dahulu.
a. Set IP ap1 dengan IP statik :
sudo ifconfig ap1 10.123.234.1 up

b. Ubah beberapa baris pada file /etc/udhcpd.conf untuk setting DHCP Server untuk hotspot, pastikan network berbeda dengan network milik station :
start 10.123.234.2
end 10.123.234.254
interface ap1
opt dns 10.123.234.1
option subnet 255.255.255.0
opt router 10.123.234.1

c. Aktifkan DHCP Server dengan cara ubah file /etc/default/udhcpd, ubah baris DHCPD_ENABLED menjadi :
#DHCPD_ENABLED="no"

d. Restart DHCP Server :
sudo service udhcpd restart
6. Mensetting routing firewall NAT.
a. Aktifkan IP Forwarding
sudo sysctl -w net.ipv4.ip_forward=1

b. Setting NAT :
sudo iptables --table nat --append POSTROUTING --out-interface station1 -j MASQUERADE
sudo iptables --append FORWARD --in-interface ap1 -j ACCEPT

Langkah 1 dan 2 harus dikerjakan terlebih dahulu secara urut kemudian langkah 3-6 bisa dikerjakan secara acak (tidak harus urut).
Ringkasan, file yang dikonfigurasi yaitu :
- Konfigurasi Station : /etc/wpa_supplicant.conf
- Konfigurasi Access Point : /etc/hostapd.conf
- Konfigurasi DHCP Server : /etc/udhcpd.conf

Langkah opsional tambahan bisa klik tulisan di bawah ini :
Membuat script untuk menjalankan hotspot
Setelah ini, jika sudah sukses bisa dibuat scriptnya agar lebih mudah setiap kali ingin terhubung, tinggal ganti konfigurasi station lalu jalankan script ini. Buat file dengan nama hotspot.sh berisi :
#!/bin/bash
sudo service network-manager stop
sudo service wpa_supplicant stop
sudo ifconfig wlp3s0 down
sudo iw phy phy0 interface add station1 type station
sudo iw phy phy0 interface add ap1 type __ap
sudo ifconfig station1 hw ether 92:45:78:FA:B2:8A
sudo ifconfig ap1 hw ether 92:45:78:FA:B2:85
sudo wpa_supplicant -Bi station1 -c /etc/wpa_supplicant.conf
sudo udhcpc -i station1
sudo ifconfig ap1 10.123.234.1 up
sudo service udhcpd restart
sudo hostapd -B /etc/hostapd.conf
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables --table nat --append POSTROUTING --out-interface station1 -j MASQUERADE
sudo iptables --append FORWARD --in-interface ap1 -j ACCEPT
Pada script di atas hostapd dan wpa_supplicant dijalankan dengan opsi "-B" agar berjalan sebagai background process sehingga wpa_supplicant dan hostapd tidak memblok eksekusi script dan juga agar terminal bisa ditutup tidak perlu dibuka terus menerus. Pada langkah sebelumnya tidak menggunakan opsi "-B" karena jika ada error maka tidak akan tahu.
Kalau pengen lebih aman, script di atas lebih baik pada baris setting station (wpa_supplicant dan udhcpc) dihapus dan dijalankan secara manual karena jika sering gonta-ganti koneksi wifi maka mungkin kalian bisa salah konfigurasi wpa_supplicant yang kemudian menghentikan script untuk berjalan.

Lalu beri hak akses eksekusi untuk file yang telah dibuat dengan perintah :
chmod +x hotspot.sh

Jalankan script dengan perintah :
./hotspot.sh
Membuat script untuk menghentikan hotspot
Untuk menghentikan hotspot bisa menggunakan script di bawah ini. Script ini akan menghentikan hotspot dan mengembalikan semua setting ke posisi semula. Beri saja nama stop-hotspot.sh :
#!/bin/bash
sudo iptables --delete FORWARD --in-interface ap1 -j ACCEPT
sudo iptables --table nat --delete POSTROUTING --out-interface station1 -j MASQUERADE
sudo sysctl -w net.ipv4.ip_forward=0
sudo killall hostapd
sudo service udhcpd stop
sudo killall wpa_supplicant
sudo iw dev ap1 del
sudo iw dev station1 del
sudo service wpa_supplicant start
sudo service network-manager start
Script di atas menggunakan perintah killall untuk menghentikan background process berdasarkan nama.

Lalu beri hak akses eksekusi untuk file yang telah dibuat dengan perintah :
chmod +x stop-hotspot.sh

Jalankan script dengan perintah :
./stop-hotspot.sh


Tested : Ubuntu 16, 18, 20.

Masalah :
- Proses shutdown jadi lama setelah dibuat hotspot dalam kondisi hotspot hidup ataupun sudah dimatikan, tidak diketahui penyebabnya.

TODO :
- Test berbagai konfigurasi wpa_supplicant, mungkin buat post terpisah
- Tambah langkah buat nge list SSID lewat terminal
- Bikin aplikasi GUI sederhana


Referensi :
https://linuxalfi.wordpress.com/2011/11/08/connectify-for-linux-with-single-wireless-interface/

Komentar

Postingan populer dari blog ini

Troubleshoot Twin USB Gamepad

Simulasi Software Defined Networking (SDN) Part 1 Install Controller ONOS