Image: linuxiac.b-cdn.net |
Halo semua! Lama tak jumpa. Bagaimana keadaan kalian? Semoga semua baik-baik saja. Oke, kali ini saya ingin mengerjakan project dengan goals yang masih cukup panjang. Artikel ini nantinya akan ada banyak bagian atau 'part' dan tiap bagian merupakan langkah demi langkah menuju goals tersebut. Berbeda dengan sebelumnya, jika satu bagian artikel belum selesai maka isi dari artikel tersebut sementara tidak bisa diterapkan. Maka pada artikel kali ini tiap bagiannya bisa diterapkan langsung tanpa harus menunggu bagian artikel selanjutnya.
Persiapan Awal
Disini saya menggunakan VirtualBox dengan OS Linux OpenSUSE Leap 15.6 dan beberapa aplikasi/tools terinstall di dalamnya yaitu NetworkManager, nftables, dan DHCP Server. Berikut detailnya:
Tool NetworkManager digunakan untuk mengatur antarmuka jaringan. Seperti memberikan alamat IP, mengatur nama antarmuka jaringan, dan mengatur apakah kita menggunakan IP dinamis atau statis. DHCP Server dengan paket aplikasinya yakni dhcpd, sesuai namanya untuk menjadikan sebuah atau beberapa antarmuka jaringan bisa memberikan IP ke komputer client yang terhubung. Terakhir nftables digunakan sebagai firewall.
Pertama kita kita pasang OS OpenSUSE di VirtualBox. Saya tidak akan menjelaskan bagaimana caranya karena ini sudah banyak tersebar di internet. Saya hanya menunjukkan konfigurasi apa saja yang saya lakukan pada VirtualBox. Utamanya jelas, kita perlu mengkonfigurasi Network Adapter.
Kita akan menggunakan 2 Network Adapter di VirtualBox dengan konfigurasi Adapter 1 mode Bridge Adapter dan Adapter 2 mode Internal Network. Adapter 1 nantinya akan sebagai eth0 DHCP Client pada OS OpenSUSE, berhadapan dengan Internet/ISP bertugas untuk mendapatkan akses internet dan berurutan Adapter 2 akan menjadi eth1 sebagai DHCP Server berhadapan dengan jaringan lokal atau client untuk memberikan layanan internet yang didapat dari eth0. Untuk Adapter 3 & 4 kita disable saja karena belum kita butuhkan.
Selain Network Adapter di Virtual Box, saya juga mengkonfigurasi bagian Storage, RAM dan Processor. Namun ini sangat opsional. Teman-teman boleh mengikuti atau menyesuaikan dengan spesifikasi Laptop/PC kalian. Processor saya buat 8 core, RAM 8 GB, Storage 32 GB.
Instal dan jalankan OS OpenSUSE di VirtualBox seperti biasa, kemudian cek apakah aplikasi yang kita butuhkan sudah terpasang dan tersedia atau belum. Jika belum, maka lakukan instalasi terhadap paket aplikasi tersebut.
1 | sudo zypper install nftables dhcp-server net-tools-deprecated NetworkManager-connection-editor |
Di beberapa kasus, kita akan menemukan bahwa OpenSUSE sudah memilik aplikasi bawaan dengan fungsi serupa seperti iptables dan firewalld. Untuk saat ini kita tidak membutuhkan paket aplikasi tersebut. Kita bisa menghapusnya dengan cara:
1 2 3 4 5 6 | sudo systemctl disable firewalld sudo systemctl stop firewalld sudo zypper remove firewalld sudo systemctl disable iptables sudo systemctl stop iptables sudo zypper remove iptables |
Pastikan juga seluruh paket aplikasi tersebut sudah tidak ada di sistem. Dengan demikian kita sudah menghapus dan menghilangkan pengaruh konfigurasi dari paket aplikasi tersebut. Dan kita tinggal mengkonfigurasi paket aplikasi pilihan kita.
DHCP Client & DHCP Server
Jika sudah, lakukan konfigurasi pada NetworkManager terlebih dahulu. Kita buat eth0 menjadi DHCP Client dan kita berikan IP Statis pada eth1 sebelum kita konfigurasi DHCP Server.
Konfigurasi eth0
sebagai DHCP Client
1 2 3 | nmcli con mod eth0 ipv4.method auto nmcli con up eth0 ip addr show eth0 |
Penjelasan:
- ipv4.method auto → Interface akan mendapatkan IP secara otomatis dari ISP.
- nmcli con up eth0 → Menerapkan perubahan konfigurasi. Dalam hal ini interface eth0 posisi UP atau diaktifkan.
- ip addr show eth0 → Cek apakah
eth0
mendapatkan IP dari ISP. Jika berhasil, akan terlihat IP dari ISP (misalnya192.168.100.10/24
atau langsung IP publik).
Konfigurasi eth1
sebagai DHCP Server
Karena eth1
akan memberikan IP ke Client, kita perlu menetapkan IP statis di eth1. Disini kita akan menggunakan IP 192.168.100.1 dengan subnet 255.255.255.0. Selain itu kita juga perlu mengonfigurasi DHCP Server agar dapat memberikan IP ke perangkat Client.
1 2 3 4 | nmcli con mod eth1 ipv4.addresses 192.168.100.1/24 nmcli con mod eth1 ipv4.method manual nmcli con up eth1 ip addr show eth1 |
Di persiapan awal kita sudah menginstal paket aplikasi DHCP Server. Sekarang kita akan mengonfigurasi eth1 menggunakan paket aplikasi tersebut dengan menambahkan konfigurasi di dalam file dhcpd.conf
1 2 3 4 5 6 7 8 9 10 11 | nano /etc/dhcpd.conf subnet 192.168.100.0 netmask 255.255.255.0 { range 192.168.100.10 192.168.100.200; option routers 192.168.100.1; option subnet-mask 255.255.255.0; option domain-name-servers 8.8.8.8, 8.8.4.4; option broadcast-address 192.168.100.255; default-lease-time 600; max-lease-time 7200; } |
Penjelasan:
- range
192.168.1.100 - 192.168.1.200
→ Alamat IP yang bisa diberikan ke Client. - option subnet-mask
→ Subnet mask /24 untuk dikirim ke Client agar Client tidak perlu menebak subnet berdasarkan kelas IP (classful). Tidak perlu bingung dengan netmask yang ada di bagian atas. Netmask yang tertera di atas atau yang ada di luar kurung kurawal adalah untuk validasi DHCP Server itu sendiri subnet mana yang akan ditangani dan tidak dikirim ke Client.255
.255
.255
.0 - option routers
192.168.1.1
→ IP gateway atau IP pada eth1. - option domain-name-servers
8.8.8.8, 8.8.4.4
→ Kita akan menggunakan DNS Google.
Jalankan dan aktifkan layanan DHCP Server serta cek apakah DHCP Server berjalan
1 2 | systemctl enable --now dhcpd systemctl status dhcpd |
Jika semua konfigurasi selesai, kita bisa tambahkan satu VM lagi. Kita bebas mau menggunakan sistem operasi apa saja. Disini saya menggunakan Windows 10 dengan konfigurasi Network Adapter 1 adalah Internal Network. Kemudian periksa Windows 10 apakah sudah mendapatkan alamat IP sesuai range yang kita berikan atau belum. Kita juga bisa memeriksa dari sisi OpenSUSE selaku DHCP Server, apakah ada VM lain yang terhubung di jaringannya.
1 | ip neigh show dev eth1 |
Kita juga bisa menggunakan cara yang lain seperti menggunakan nmap untuk melihat VM Client yang aktif atau memeriksa melalui journalctl untuk melihat log dari DHCP Server. Sampai pada tahap ini seharusnya antara VM Client dengan VM Server (OpenSUSE) sudah bisa saling melakukan ping. Jika gagal, kemungkinan ada konfigurasi yang kurang tepat atau alamat IP yang di ping memang tidak ada karena tidak ada VM yang terhubung.
Firewall nftables
Meski antar VM sudah bisa melakukan ping, bukan berarti VM Client sudah bisa mendapatkan akses internet dari VM Server. Hal ini dikarenakan belum ada konfigurasi atau aturan yang meneruskan jaringan internet dari eth0 ke eth1. Maka perlu kita buat aturan tersebut agar VM Client mendapatkan akses internet dari VM Server. Namun untuk membuat aturan tersebut kita membutuhkan paket aplikasi firewall. Dan yang akan kita gunakan adalah nftables. Karena kita diawal sudah menginstal nftables, sekarang langsung saja kita aktifkan.
1 2 | systemctl enable --now nftables systemctl start nftables |
Setelah kita aktifkan, kita coba berikan aturan dasar atau rule firewall pada nftables
1 2 3 4 5 6 7 8 9 10 11 12 13 | table ip nat { chain POSTROUTING { type nat hook postrouting priority srcnat; policy accept; oif "eth0" masquerade } } table ip filter { chain forward { type filter hook forward priority filter; policy accept; iif "eth1" oif "eth0" accept iif "eth0" oif "eth1" ct state established,related accept } } |
Pastikan bahwa basic rule firewall yang kita buat sudah masuk. Kita bisa memeriksanya dengan perintah berikut:
1 | nft list ruleset |
Aktifkan rule firewal nftables yang baru saja kita buat dengan perintah berikut:
1 | sudo nft -f /etc/nftables.conf |
Untuk mengkonfigurasi firewall nftables, baik itu menambah rule, mengubah rule, atau menghapus rule kita bisa langsung ketikkan perintah di terminal. Sebagai contoh menambah rule maka perintah di terminal seperti ini:
1 | sudo nft add rule inet filter input icmp type echo-request accept |
Untuk memastikan aturan tetap aktif setelah reboot, jangan lupa untuk selalu menyimpan konfigurasinya dengan memberikan perintah:
1 | sudo nft list ruleset > /etc/nftables.conf |
Dan seperti sebelumnya. Periksa lagi apakah rule yang baru saja kita tambahkan sudah masuk atau belum. Jika semua konfigurasi tidak terjadi kendala, maka seharusnya VM Client yang terhubung di internal network eth1 tidak hanya bisa men-ping alamat IP eth1 tapi juga bisa men-ping alamat IP milik eth0. Karena kedua network interface sudah dibuat rule forwarding.
Tes Ping & Tes Akses Internet
Disini saya menggunakan 2 VM sebagai komputer Client yang terhubung dengan eth1 OpenSUSE. Langkah ini bebas dan opsional karena hanya untuk memeriksa apakah VM Client dapat terhubung ke internet melalui OpenSUSE yang sudah kita konfigurasi sebagai router sederhana. Dua VM ini menggunakan 2 OS berbeda yaitu Linux Solaris dan Windows 10.
Pada screenshot di atas terlihat jelas bahwa eth1 OpenSUSE sedang terhubung dengan 2 perangkat (dalam hal ini adalah VM) yakni VM Windows dan VM Solaris. Disitu juga telah dilakukan proses Ping ke kedua VM ada untuk memastikan bahwa 2 VM tadi terhubung dengan benar.
Akses Ping dan Akses Internet dari VM Solaris |
Akses Ping dan Akses Internet dari VM Windows |
Tidak lupa kita juga tes Ping sekaligus akses internet dari kedua VM yang sudah disediakan. Terlihat dari 2 screenshot di atas kedua VM dapat mengakses internet dan melakukan Ping keluar.
Permasalahan yang Mungkin Muncul
Di setiap langkah dalam membuat konfigurasi dasar, pastinya tidak luput dari beberapa masalah. Seperti file service dari nftables yang tidak tersedia, DHCP Client yang tidak adaptif dengan jaringan baru, NetworkManager yang tiba-tiba mati mendadak, dan lainnya. Berikut permasalahan yang saya hadapi ketika membuat konfigurasi dasar.
Network Interface Tidak Dikenali
Ketika akan membuat DHCP Server pada interface eth1 dengan perintah nmcli con mod eth1 ipv4.addresses 192.168.1.1/24 maka ada kalanya interface tersebut tidak dikenali.
Ini normal karena memang penamaan NetworkManager connection profile dengan nama interface seperti eth1 tidak selalu sama. Meski pun jika kita cek menggunakan perintah ip a atau ifconfig atau ip addr show eth1 tertulis bahwa interface yang kita miliki adalah eth1 dengan nama alternatifnya misal enp0s8.
Tidak ada yang bisa kita lakukan selain mengubah nama profil di NetworkManager Connection menjadi nama yang sama dengan interface jaringan yang tersedia. Seperti nama profil 'Wired Connection 1' kita ubah menjadi eth1. Ini penting untuk memudahkan konfigurasi jaringan kedepannya. Kita bisa gunakan perintah ini untuk mengganti nama profile di NetworkManager:
nmcli connection modify Wired\ connection\ 1 con-name eth1
Maka ketika kita cek dengan perintah nmcli connection show, nama profil di NetworkManager sudah sinkron dengan nama interface jaringan yang tersedia. Dengan begitu konfigurasi selanjutnya akan sangat memudahkan.
Service nftables Tidak Tersedia
Saya pribadi belum membaca lengkap dokumen nftables dari developernya. Hanya saja ketika saya searching banyak yang mengatakan bahwa paket aplikasi nftables memang tidak menyertakan file service pada beberapa OS (dan OpenSUSE termasuk). Maka yang perlu kita lakukan adalah membuat file service sendiri dengan nama nftables.service yang kita simpan ke /etc/systemd/system/.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [Unit] Description=nftables firewall Documentation=man:nft(8) Before=network.target Wants=network.target [Service] Type=oneshot ExecStart=/usr/sbin/nft -f /etc/nftables.conf ExecReload=/usr/sbin/nft -f /etc/nftables.conf RemainAfterExit=yes [Install] WantedBy=multi-user.target |
Jangan lupa mengaktifkan nftables setelah kita buat file servicenya. Karena jika tidak kita aktifkan, maka kita tidak bisa mengonfigurasi rule firewall di nftables.
1 2 3 4 | sudo systemctl daemon-reload sudo systemctl enable nftables sudo systemctl start nftables sudo systemctl status nftables |
Dengan begitu maka seharusnya komputer atau VM yang terhubung secara lokal di eth1 dapat mengakses internet yang terhubung di eth0.
DHCP Client eth0 Kurang Adaptif
Sebenarnya permasalahan ini juga bergantung bagaimana DHCP Server memberikan Time Leases atau masa sewa IP kepada Client-nya. Dalam hal ini adalah perangkat yang terhubung ke eth0. Ini mudah saja, kita bisa mengganti jenis Network Adapter 1 pada VirtualBox menjadi NAT maka eth0 akan mendapatkan alamat IP yang konsisten dan jarang berubah-ubah. Namun karena saya menginginkan project ini mendekati kondisi nyata di lapangan, maka Network Adapter 1 di VirtualBox saya pilih mode Bridge.
Penyebab lainnya adalah karakter aplikasi NetworkManager itu sendiri. NetworkManager cenderung menyimpan informasi konfigurasi jaringan yang pernah diperoleh. Ketika terhubung ke jaringan baru, ia akan mencoba mendapatkan alamat IP baru, tetapi secara default, ia mungkin tidak langsung menghapus alamat IP lama yang masih valid masa sewanya. Akibat dari karakter ini bisa muncul 2 alamat IP dalam satu network interface.
Kita bisa saja menggunakan perintah nmcli con reload eth0. Tapi biasanya cara ini kurang berdampak. Lantas bagaimana cara agar DHCP Client khususnya pada eth0 bisa lebih agresif dan adaptif ketika terhubung ke jaringan baru?
Turunkan (Down) dan Naikkan (Up) Network Interface
Alih-alih hanya me-reload, coba turunkan antarmuka sepenuhnya dan kemudian naikkan kembali:
1 2 3 4 | sudo ip link set dev eth0 down sudo dhclient -v -r eth0 # Rilis alamat IP lama (opsional, tapi disarankan) sudo ip link set dev eth0 up sudo dhclient -v eth0 # Meminta alamat IP baru secara eksplisit |
Atau menggunakan nmcli
:
1 2 | sudo nmcli connection down id eth0 sudo nmcli connection up id eth0 |
Kemudian restart service NetworkManager
1 | sudo systemctl restart NetworkManager |
Logikanya cara diatas lebih berdampak daripada sekadar me-reload interface eth0
NetworkManager Script Dispatcher
Mengonfigurasi NetworkManager untuk lebih agresif melepas sewa DHCP lama adalah pendekatan yang masuk akal agar sistem lebih cepat beradaptasi dengan perubahan jaringan. Namun, perlu diketahui bahwa opsi konfigurasi langsung untuk "keagresifan" pelepasan sewa mungkin tidak eksplisit tersedia sebagai satu setelan tunggal di NetworkManager.
NetworkManager menggunakan dhclient
sebagai backend DHCP client. dhclient
memiliki mekanisme untuk menjalankan skrip pada berbagai tahapan siklus DHCP (misalnya, saat mendapatkan alamat, saat melepaskan alamat). Kita dapat memanfaatkan ini.
Buat file misalnya, /etc/NetworkManager/dispatcher.d/99-force-dhcp-release
. Isikan file tersebut dengan script berikut:
1 2 3 4 5 6 | #!/bin/bash if [ "$2" = "dhcp4-change" ]; then INTERFACE="$1" logger "NetworkManager dispatcher: DHCP change detected on $INTERFACE, forcing release." dhclient -v -r "$INTERFACE" fi |
Jadikan skrip dapat dieksekusi:
1 | sudo chmod +x /etc/NetworkManager/dispatcher.d/99-force-dhcp-release |
Coba pindah ke jaringan lain dengan konfigurasi IP yang berbeda. Periksa log sistem (journalctl -f -u NetworkManager
atau /var/log/messages
) untuk melihat apakah skrip dijalankan dan apakah ada upaya untuk melepaskan alamat IP lama. Periksa kembali dengan ip a
setelah beberapa saat untuk melihat apakah alamat IP lama sudah hilang setelah mendapatkan alamat IP baru.
Skrip ini akan dipanggil oleh NetworkManager dispatcher setiap kali ada perubahan status pada antarmuka jaringan. Kita memeriksa apakah eventnya adalah dhcp4-change
(perubahan konfigurasi DHCP IPv4). Jika ya, kita mendapatkan nama antarmuka ($1
) dan secara paksa melepaskan sewa DHCP menggunakan dhclient -v -r
. File logger
digunakan untuk mencatat kejadian ini ke log sistem. Setelah membuat skrip, coba pindah ke jaringan lain. NetworkManager seharusnya mendeteksi perubahan dan menjalankan skrip, yang akan mencoba melepaskan alamat IP lama.
Dengan implementasi skrip dispatcher, kita memberikan instruksi eksplisit kepada sistem untuk mencoba melepaskan sewa DHCP lama setiap kali ada perubahan konfigurasi DHCP terdeteksi oleh NetworkManager. Ini seharusnya membuat DHCP client lebih adaptif terhadap perubahan jaringan.
Melibatkan Opsi dhclient
melalui Konfigurasi NetworkManager (WARNING!)
Cara ini lebih ke mengubah karakter dari NetworkManager, seperti yang saya sampaikan sebelumnya. Terkadang, NetworkManager memungkinkan kita untuk meneruskan opsi tambahan ke dhclient
. Kita bisa mencoba menggunakan opsi yang relevan. Kita dapat menggunakan nm-connection-editor
(jika terinstal secara grafis) atau mengedit file konfigurasi koneksi secara langsung di /etc/NetworkManager/system-connections/. Jika kita mengedit file konfigurasi koneksi secara langsung di /etc/NetworkManager/system-connections/ maka cari bagian
[ipv4]
. Di bagian ini, kita mungkin menemukan opsi terkait DHCP. Sayangnya, opsi langsung untuk mempercepat Time Leases biasanya tidak ada.
1 2 3 | [ipv4] method=auto dhcp-client-flags= -r |
Dukungan untuk dhcp-client-flags
dan opsi spesifik yang dapat diteruskan mungkin berbeda-beda tergantung versi NetworkManager. Melepas paksa dengan -r
di sini mungkin terlalu agresif dan bisa menyebabkan masalah jika koneksi hanya terputus sebentar. Gunakan dengan hati-hati. Setelah memodifikasi konfigurasi, restart NetworkManager.
Kesimpulan
Dari seluruh penjelasan di atas adalah kita dapat secara fleksibel dan bebas dalam mengatur gateway sebuah jaringan tanpa harus dibatasi oleh brand perangkat tertentu. Itu karena seluruh instalasi dan konfigurasi 99% kita yang melakukan. Kita juga bisa menambahkan firewall berlapis, custom adblock script, AI, dan sebagainya.
Oke, sekian dulu artikel kali ini semoga bermanfaat dan Terima Kasih.
0 Komentar