BAB 1: Pendahuluan dan Arsitektur
Deskripsi lengkap mengenai arsitektur jaringan:
-
WAN masuk ke satu interface Debian
-
LAN menggunakan bridge (br0) untuk distribusi layanan
-
Di atas bridge tersebut berjalan PPPoE dan Hotspot
-
Semua distribusi akses menggunakan FreeRADIUS sebagai backend autentikasi
-
Billing menggunakan PHP berbasis Radius Manager open source atau custom
-
Tidak ada akses IP statik, semua user harus melalui autentikasi
BAB 2: Instalasi Dasar Debian
-
Pasang Debian minimal (CLI Only)
-
Konfigurasi IP statik untuk WAN (misal eth0)
-
Instalasi tools dasar: apt install sudo net-tools iproute2 curl wget nano
-
Update system: apt update && apt upgrade -y
BAB 3: Setup Bridge LAN + Interface
Instal bridge-utils:
apt install bridge-utils -y
Edit /etc/network/interfaces atau gunakan systemd-networkd/Netplan tergantung versi Debian. Contoh (interfaces):
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.88.2
netmask 255.255.255.0
gateway 192.168.88.1
auto br0
iface br0 inet static
address 172.16.0.1
netmask 255.255.252.0
bridge_ports eth1 eth2 wlan0
BAB 4: Instalasi dan Konfigurasi PPPoE Server
-
Instalasi PPPoE Server:
apt install pppoe ppp -y
-
Konfigurasi /etc/ppp/pppoe-server-options
require-pap
login
lcp-echo-interval 10
lcp-echo-failure 2
ms-dns 172.16.0.1
asyncmap 0
auth
crtscts
lock
hide-password
modem
mtu 1492
mru 1492
-
File /etc/ppp/chap-secrets (gunakan radius nantinya)
-
Aktifkan dengan:
pppoe-server -I br0 -L 172.16.0.1 -R 172.16.1.2 -N 100
BAB 5: Setup Hotspot dengan CoovaChilli
-
Instalasi CoovaChilli:
apt install coova-chilli -y
-
Edit /etc/chilli/defaults
HS_WANIF=eth0
HS_LANIF=br0
HS_NETWORK=172.16.100.0
HS_NETMASK=255.255.252.0
HS_UAMLISTEN=172.16.100.1
HS_UAMPORT=3990
HS_RADIUS=127.0.0.1
HS_RADIUS2=127.0.0.1
HS_RADSECRET=testing123
HS_UAMALLOW=www.google.com
HS_UAMSECRET=testing123
-
Aktifkan dan jalankan coova:
systemctl enable chilli
systemctl start chilli
BAB 6: Billing dan Autentikasi
-
Instalasi FreeRADIUS:
apt install freeradius freeradius-mysql -y
-
Setup database MySQL dan integrasikan dengan FreeRADIUS
-
Gunakan billing berbasis PHP seperti:
-
DaloRADIUS (open source)
-
RadiusDesk (open source)
-
Custom PHP + Bootstrap
-
Semua user harus login via PPPoE atau Hotspot, tanpa IP statik langsung
BAB 7: Pengamanan dan Pemantauan
7.1 Proteksi Dasar Firewall
Konfigurasi awal firewall dengan iptables atau UFW untuk membatasi akses hanya pada port yang dibutuhkan (misalnya, port 22, 80, 443, 1812 untuk FreeRADIUS).
7.2 IDS/IPS dengan Suricata
Instalasi Suricata dan konfigurasi rule set untuk mendeteksi dan mencegah serangan pada port publik dan servis penting seperti FreeRADIUS, CoovaChilli, dan antarmuka web.
7.3 Tambahan Pengamanan Server
a. Instalasi dan Konfigurasi Fail2Ban
Fail2Ban melindungi dari brute force login:
apt install fail2ban -y
Salin konfigurasi default:
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Aktifkan untuk SSH dan Freeradius:
[sshd]
enabled = true
[freeradius-auth]
enabled = true
port = 1812
protocol = udp
logpath = /var/log/freeradius/radius.log
Restart service:
systemctl restart fail2ban
systemctl enable fail2ban
b. Konfigurasi UFW (Uncomplicated Firewall)
Instal dan konfigurasi UFW:
apt install ufw -y
ufw default deny incoming
ufw default allow outgoing
Buka port penting:
ufw allow ssh
ufw allow 80
ufw allow 443
ufw allow 1812/udp # Freeradius
ufw allow 3990/tcp # CoovaChilli UAM
ufw allow 3000/tcp # AdGuard Home UI (opsional)
Aktifkan UFW:
ufw enable
c. Hardening SSH
Edit /etc/ssh/sshd_config:
PermitRootLogin no
PasswordAuthentication no
PermitEmptyPasswords no
AllowUsers adminuser
Restart SSH:
systemctl restart ssh
Gunakan login SSH dengan SSH key:
ssh-keygen -t rsa -b 4096
ssh-copy-id user@server_ip
BAB 8: Konfigurasi DNS: BIND dan AdGuard Home
8.1 Instalasi dan Setup DNS BIND untuk Cache Resolver
-
Instalasi paket:
apt install bind9 dnsutils -y
-
Konfigurasi named.conf.options:
options {
directory "/var/cache/bind";
recursion yes;
allow-query { any; };
forwarders {
8.8.8.8;
1.1.1.1;
};
dnssec-validation auto;
};
-
Restart layanan BIND:
systemctl restart bind9
systemctl enable bind9
8.2 Instalasi dan Setup AdGuard Home untuk Blokir Konten Dewasa
-
Unduh dan instal AdGuard Home:
curl -s -S -L https://static.adguard.com/adguardhome/release/AdGuardHome_linux_amd64.tar.gz | tar xz
cd AdGuardHome
./AdGuardHome -s install
-
Akses antarmuka web di http://IP:3000 dan selesaikan wizard
-
Tambahkan filter:
-
Setup redirect konten dewasa:
-
Arahkan DNS domain tertentu ke IP lokal, misal 172.16.0.5
-
Jalankan web server (nginx/lighttpd) di 172.16.0.5 untuk menampilkan halaman peringatan atau edukasi
-
Integrasi DNS AdGuard dan BIND:
Edit named.conf.options:
forwarders {
127.0.0.1 port 5353;
};
AdGuard Home bisa dikonfigurasi listen di port 5353 agar tidak konflik dengan BIND.
BAB 8,2: Isolasi Otomatis dan Pembukaan Otomatis PPPoE
Fitur ini memungkinkan pelanggan diisolasi secara otomatis pada saat jatuh tempo, dan akan dibuka kembali secara otomatis 1 menit setelah melakukan pembayaran yang tervalidasi oleh sistem billing.
Konsep dan Mekanisme:
-
Sistem billing (misalnya DaloRADIUS atau custom PHP) mencatat tanggal jatuh tempo setiap user.
-
Setiap hari atau setiap jam, cron job mengecek user yang jatuh tempo.
-
Sistem menghapus akun PPPoE atau memindahkan user ke profil terbatas (jika menggunakan MikroTik).
-
Setelah pembayaran terverifikasi, akun diaktifkan kembali, dan sistem mengirim sinyal ke Mikrotik/Server PPPoE untuk reconnect.
Implementasi dengan Skrip Otomatis:
Skrip isolasi otomatis (isolasi_pppoe.py):
#!/usr/bin/env python3
import mysql.connector
import os
import datetime
conn = mysql.connector.connect(
host="localhost",
user="radius",
password="password_db",
database="radius"
)
cursor = conn.cursor()
today = datetime.date.today().isoformat()
query = "SELECT username FROM users WHERE expire_date <= %s AND active = 1"
cursor.execute(query, (today,))
users = cursor.fetchall()
for (username,) in users:
os.system(f"radclient -x localhost:3799 disconnect secret <<EOF\nUser-Name = \"{username}\"\nEOF")
cursor.execute("UPDATE users SET active = 0 WHERE username = %s", (username,))
print(f"Isolated: {username}")
conn.commit()
conn.close()
Skrip buka otomatis setelah pembayaran (open_pppoe.py):
#!/usr/bin/env python3
import mysql.connector
import os
conn = mysql.connector.connect(
host="localhost",
user="radius",
password="password_db",
database="radius"
)
cursor = conn.cursor()
query = "SELECT username FROM users WHERE paid = 1 AND active = 0"
cursor.execute(query)
users = cursor.fetchall()
for (username,) in users:
cursor.execute("UPDATE users SET active = 1 WHERE username = %s", (username,))
print(f"User reactivated: {username}")
conn.commit()
conn.close()
Tambahkan ke crontab:
# Isolasi user setiap jam
0 * * * * /usr/bin/python3 /opt/scripts/isolasi_pppoe.py
# Buka user setiap 5 menit
*/5 * * * * /usr/bin/python3 /opt/scripts/open_pppoe.py
Integrasi dengan Billing PHP:
-
Tambahkan kolom expire_date, active, dan paid ke tabel users.
-
Pastikan sistem billing otomatis mengubah paid=1 saat pembayaran berhasil.
-
Tambahkan opsi untuk mengatur tanggal jatuh tempo pada saat registrasi atau pembayaran.