
Access point configuration
Saya hendak membuat sebuah jaringan nirkabel. Jaringan nirkabel itu terhubung ke sebuah komputer yang berfungsi sebagai router. Setiap akses dari perangkat-perangkat dalam jaringan tersebut dienkapsulasi dalam NAT dan dikirim ke Internet/jaringan lainnya.
Komputer yang saya gunakan adalah GNU/Linux Gentoo dengan spesifikasi sebagai berikut:
- Kernel Linux 3.19-pf1
- Systemd 219
Saya pun tertarik menggunakan nftables karena dia yang akan menggantikan iptables di masa mendatang. Perkakas nftables pertama kali ada di Linux 3.13. Jadi, ya, lumayan relatif baru.
Aktifkan IP Forwarding
Setiap kali mau memakai NAT, jangan lupa mengaktifkan IP Forwarding di kernel. Lihat dulu kalau dia aktif:
$ sudo sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
Kalau nilainya 0, berarti belum aktif. Aktifkan:
sudo sysctl -w net.ipv4.ip_forward=1
Supaya permanen, tambahkan ke konfigurasi. Ingat! Sistem ini menggunakan systemd. Jadi, berkasnya ada di /etc/sysctl.d
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.d/99-sysctl.conf
Ini kalau tadi sebelumnya IPv4 belum menyala. Kalau sudah, lewati saja. Tapi, biasanya distro-distro bakunya mematikan fitur ini.
nftables
Ada beberapa langkah yang dilakukan untuk memasang nftables:
- Memasang kernel yang sudah mendukung nftables.
- Memasang perkakas nftables.
- Memasang unit systemd.
Modul Kernel
Saya tidak tahu Anda menggunakan kernel versi apa. Tapi, seandainya kernel tersebut di atas 3.13, kemungkinan ada. Kalau saya kebetulan mengompilasi sendiri kernel saya. Jadinya, saya aktifkan nftables pada bagian:
-> Networking support
-> Networking options
-> Network packet filtering framework (Netfilter)
-> Core Netfilter Configuration
Lalu saya centang saja semua yang berbau nf_tables di konfigurasi seperti terlihat pada gambar.

I just opt-in every “nf_tables” in Core Netfilter Configuration
Setelah saya kompilasi dan pasang kernel saya. Lalu saya masuk ke sistem dengan menggunakan kernel tersebut. Selanjutnya saya memasang perkakas nftables untuk bisa memanipulasi tabel nftables.
Perkakas
Saya memasang nftables dengan cara berikut:
sudo emerge -av net-firewall/nftables
Atau gunakan pemaket dari distro kesayangan Anda masing-masing. Untuk Debian dan turunannya, ada bacaan menarik mengenai cara cepat membuat perkakas ini.
Jika sudah, ada beberapa contoh penggunaan nftables yang menarik, misalnya:
Saya mengikuti tata letak berkas di Gentoo. Dia menaruh aturan iptables, nftables, ebtables, dan lain-lain di direktori /var/lib
. Kalau Debian menaruhnya di /etc
. Anda terserah mau taruh di mana, yang penting konsisten.
Inisialisasi Aturan nftables
Awal-awalnya nftables masih kosong. Saya menggunakan aturan yang telah disediakan gentoo untuk IPv4 NAT. Gentoo saat ini menaruh berbagai aturan siap pakai di /etc/nftables
.
Mengapa saat ini? Karena biasanya aturan siap pakai ditaruh di /usr/share
. Mungkin saja bilamana nftables sudah stabil, aturan-aturan ini dipindahkan ke sana. Ya, sudah, pakai saja:
sudo nft -f /etc/nftables/ipv4-nat
Supaya Anda tidak penasaran, isi berkas itu sebenarnya cuma aturan biasa:
#!/sbin/nft -f
table nat {
chain prerouting { type nat hook prerouting priority -150; }
chain postrouting { type nat hook postrouting priority -150; }
}
Mirip-miriplah dengan tutorial nftables NAT yang resmi.
Lalu tambahkan aturan yang mentranslasi semua paket jaringan dari wlan0
ke eth0
.
sudo nft add rule nat postrouting ip saddr 10.10.0.0/24 meta oif eth0 snat 192.168.0.5
Ganti 192.168.0.5
dengan IP kartu ethernet Anda. Lihat gambar awal mengenai skema jaringan yang hendak dibangun.
Padanan di iptables
Aturan ini padanannya di iptables seperti ini:
sudo iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o eth0 -j SNAT --to 192.168.0.5
Lalu mengapa tidak menggunakan iptables saja biar sederhana? Judul artikel ini belajar nftables. Lagipula, sebenarnya lebih sederhana nftables, hanya saja ia belum terintegrasi dengan distro-distro yang ada saat ini. Dia masih baru, bahkan kernel yang mendukung belum masuk.
Sebelum ini saya biasanya menggunakan perintah berikut untuk iptables:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Nanti saya coba di Wheezy, deh. Kalau tidak malas, tapinya. Untuk saat ini jangan lupa untuk mematikan NAT di iptables supaya tidak kacau!
sudo rmmod iptable_nat
Menyimpan Aturan nftables
Kalau sudah selesai, seharusnya aturan nftables akan sebagai berikut:
$ sudo nft list ruleset
table ip nat {
chain prerouting {
type nat hook prerouting priority -150;
}
chain postrouting {
type nat hook postrouting priority -150;
ip saddr 10.10.0.0/24 oif eth0 snat 192.168.0.5
}
}
Nah, kalau di Gentoo, dia sudah menyediakan skrip initnya. Sayangnya cuma untuk OpenRC. Kita bisa memanfaatkan skrip itu untuk menyimpan aturan NAT:
sudo /etc/init.d/nftables save
Atau cara manualnya:
sudo mkdir -p /var/lib/nftables
sudo nft list ruleset | sudo tee /var/lib/nftables/rules-save
Selanjutnya membuat aturan systemd supaya dijalankan otomatis.
Aturan systemd untuk nftables
Belum ada aturan untuk nftables. Ada seseorang yang berbaik hati untuk membuat skrip untuk systemd. Tetapi, saya memilih untuk membuat sendiri.
Skrip orang itu membuat nftables sebagai layanan. Tetapi, saya pikir seharusnya perilaku nftables sama seperti skrip ALSA dan iptables. Ia hanya perlu dijalankan sekali saja. Itu sebabnya, sama seperti kedua subsistem, saya memecah nftables menjadi tiga berkas aturan.
Aturan /usr/lib/systemd/system/nftables.service
[Unit]
Description=Store and restore nftables firewall rules
Documentation=man:nftables(8)
[Install]
Also=nftables-store.service
Also=nftables-restore.service
Aturan /usr/lib/systemd/system/nftables-restore.service
[Unit]
Description=Restore nftables firewall rules
# if both are queued for some reason, don't store before restoring :)
Before=nftables-store.service
# sounds reasonable to have firewall up before any of the services go up
Before=network.target
Conflicts=shutdown.target
[Service]
Type=oneshot
ExecStart=/sbin/nft -f /var/lib/nftables/rules-save
[Install]
WantedBy=basic.target
Aturan /usr/lib/systemd/system/nftables-store.servic
e
[Unit]
Description=Store nftables firewall rules
Before=shutdown.target
DefaultDependencies=No
[Service]
Type=oneshot
ExecStart=/bin/sh -c "/sbin/nft list ruleset > /var/lib/nftables/rules-save"
[Install]
WantedBy=shutdown.target
Selanjutnya, pasang ketiga layanan tersebut:
sudo systemctl enable nftables
Selesai untuk nftables, selanjutnya mengonfigurasi antarmuka jaringan.
Mengonfigurasi Antarmuka Jaringan
Sudah menjadi aturan umum kalau firewall berjalan sebelum antarmuka jaringan diaktifkan. Dengan memulai firewall terlebih dahulu, tidak ada jeda yang bisa dipakai untuk masuk. Tidak ada waktu antara menjalankan antarmuka jaringan dengan menyalakan firewall. Itu sebabnya, nftables dipasang pertama kali sebelum antarmuka jaringan.
Kalau Anda pengguna destop, kemungkinan sudah ada NetworkManager. Untuk konfigurasi minimal, NetworkManager biasanya tidak dipasang. Antarmuka jaringan harus dipasang dengan cara lain.
Saya gagal menggunakan metode systemd-networkd. Kalau saya menggunakan infrastruktur itu, firewall (nftables/iptables) tidak ada yang berjalan! Mungkin saya ada yang kurang. Entahlah, yang pasti saya mengonfigurasi statik dengan cara lain saja.
Antarmuka eth0
Gentoo menggunakan pendekatan yang sama dengan Arch Linux. Mereka menggunakan systemd untuk menjalankan skrip Gentoo. Dengan demikian, konfigurasi Gentoo yang lama bisa dibaca. Ini konfigurasi lama saya di /etc/conf.d/net
dns_servers=( "8.8.8.8" )
config_eth0="192.168.0.5 netmask 255.255.255.0"
routes_eth0="default via 192.168.0.1"
Cara mengaktifkan layanan adalah dengan membuat tautan simbolik dari net@.service
ke net@eth0.service
.
sudo ln -s /usr/lib/systemd/system/net@{,eth0}.service
Kalau Anda tidak percaya diri dengan menggunakan enumerasi BASH, bentuk lain dari perintah itu adalah
sudo ln -s /usr/lib/systemd/system/net@.service /usr/lib/systemd/system/net@eth0.service
Setelah itu, pasang layanan ini ke systemd agar dijalankan pada waktu komputer baru menyala.
sudo systemctl enable net@eth0
Kalau Debian, seperti biasa ada di /etc/network/interfaces
. Jadi, mungkin systemd tidak terlalu dibutuhkan.
Antarmuka wlan0
Saya menggunakan Linksys WUSB54GC. Kemampuan yang dimiliki:
Supported interface modes:
* IBSS
* managed
* AP
* AP/VLAN
* WDS
* monitor
* mesh point
Dia bisa menjadi Access Point (AP)!
Implementasi yang kita pilih merupakan implementasi statik. Kita bisa dengan aman berasumsi bahwa IP yang dipakai tidak akan berubah.
Saya tadinya ingin membuat seperti antarmuka Ethernet. Tapi, konfigurasi gagal karena RFKill selalu memblokir wlan0
dengan soft block. Saya pun memutuskan untuk membuat sebuah layanan kecil untuk menjalankan wlan0
di /usr/lib/systemd/system/ap-static.service
[Unit]
Description=Static WLAN0 as an Access Point
Documentation=man:rfkill(8) man:ip(8)
After=network.target
After=time-sync.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/rfkill unblock all
ExecStart=/bin/ip addr add 10.10.0.1/24 dev wlan0
ExecStart=/bin/ip link set wlan0 up
[Install]
WantedBy=multi-user.target
Seperti biasa, pasang layanan ini:
sudo systemctl enable ap-static
Untuk antarmuka nirkabel sudah selesai. Saatnya memasang layanan yang akan mengonfigurasi klien WIFI.
Layanan Konfigurator WIFI
Ada dua layanan utama yang dipakai untuk tutorial kali ini. Keduanya masing-masing bisa diganti dengan yang lain. Namun, saat ini saya menggunakan dua layanan ini karena keduanya dapat dikembangkan untuk kebutuhan kompleks.
- hostapd
- Hostapd adalah aplikasi penyedia Access Point. Dia menyediakan autentikator, mengatur antarmuka WIFI, dan sejenisnya. Selain memiliki autentikator internal, hostapd dapat terhubung ke Radius dan mendukung ACS.
- DHCPd
- DHCPd adalah penyedia layanan DHCP. Layanan ini yang mengatur kepemilikan IP dan sejenisnya kepada klien. Sebenarnya masih ada udhcpd yang lebih sederhana. Yah, namanya juga belajar.
Mari konfigurasi keduanya.
Layanan hostapd
Setiap distro umum memiliki paket hostapd
. Saya sendiri di Gentoo mengunakan hostapd
versi:
$ sudo hostapd -v
hostapd v2.3
User space daemon for IEEE 802.11 AP management,
IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
Copyright (c) 2002-2014, Jouni Malinen <j@w1.fi> and contributors
Pertama-tama, konfigurasikan AP yang hendak kita buat. Berikut contohnya pada /etc/hostapd/hostapd.conf
# WiFi Hotspot
interface=wlan0
driver=nl80211
# Access Point
ssid=AP Lo Nyambung2
hw_mode=g
ieee80211d=1
country_code=ID ### 802.11d/h harus ada kode negara
# WiFi Channel:
ieee80211h=1
channel=3 ### Channel 3
wmm_enabled=1 ### QoS
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=s4nD1Al4yFtW
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
Saya menyalin skrip layanan systemd hostapd yang disediakan oleh Gentoo menjadi /usr/lib/systemd/system/hostapd-wlan0.service
. Alasan saya supaya kalau ada pembaharuan sistem, skrip ini tidak berubah. Lagipula, saya mengubah agar layanan berjalan setelah ap-static.service
sudah berjalan. Isinya:
[Unit]
Description=Hostapd IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
After=network.target
After=ap-static.service
[Service]
ExecStart=/usr/sbin/hostapd /etc/hostapd/hostapd.conf
[Install]
WantedBy=multi-user.target
Setelah itu, pasang layanan ini.
sudo systemctl enable hostapd-wlan0
Selesai.
Layanan dhcpd
Seperti saya bilang, sebenarnya DHCPd agak mubazir. Tapi, berhubung sistem ringan, saya pasang saja. Oh, iya, kalau di Debian, nama paketnya isc-dhcp-server
.
Gentoo:
sudo emerge -av net-misc/dhcp
Debian dan turunannya:
sudo apt-get install isc-dhcp-server
Setelah terpasang, buat berkas konfigurasi /etc/dhcp/dhcpd.conf
ddns-update-style none;
log-facility local7;
subnet 10.10.0.0 netmask 255.255.255.0 {
range 10.10.0.2 10.10.0.32;
option domain-name-servers 8.8.8.8;
option routers 10.10.0.1;
}
Jangkauan IP tidak saya buat jauh karena pun jumlah maksimal klien yang terhubung ke AP tidak begitu banyak. Lain cerita kalau misalnya DHCPd kita pakai juga untuk yang lain.
Seperti biasa, saya menyalin berkas systemd DHCPd dan menamainya menjadi /usr/lib/systemd/system/dhcpd4-wlan0.service
[Unit]
Description=DHCPv4 Server Daemon
Documentation=man:dhcpd(8) man:dhcpd.conf(5)
After=ap-static.service
[Service]
ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcp -group dhcp --no-pid
[Install]
WantedBy=multi-user.target
Terakhir, pasang layanan DHCPd:
sudo systemctl enable dhcpd4-wlan0
Selesai.
Terakhir
Matikan dan kemudian hidupkan kembali komputer yang dipakai sebagai AP. Kalau benar, maka otomatis layanan ini akan berjalan.

Example on working AP from my phone.
Tamat.