Access point configuration

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:

  1. Memasang kernel yang sudah mendukung nftables.
  2. Memasang perkakas nftables.
  3. 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

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:

  • Melihat seluruh isi tabel:
    nft list ruleset
  • Menghapus seluruh tabel:
    nft flush ruleset
  • Menyimpan seluruh tabel ke berkas konfigurasi:
    nft list ruleset > /var/lib/nftables/rules-save
  • Memuat konfigurasi dari berkas konfigurasi:
    nft -f /var/lib/nftables/rules-save

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.service

[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.

Example on working AP from my phone.

Tamat.