Line 121: Line 121:
sudo netfilter-persistent save
sudo netfilter-persistent save
</syntaxhighlight>Maka setiap server restart rule IPTables akan direstore otomatis
</syntaxhighlight>Maka setiap server restart rule IPTables akan direstore otomatis
== Perintah lengkap IPTables untuk penggunaan standar server ==
<syntaxhighlight lang="shell" line="1">
#!/bin/bash
### ===============================
### 1. RESET FIREWALL
### ===============================
# Hapus semua rules di semua chain
iptables -F
# Hapus semua custom chain
iptables -X
# Hapus rules NAT
iptables -t nat -F
iptables -t nat -X
# Hapus rules mangle
iptables -t mangle -F
iptables -t mangle -X
### ===============================
### 2. SET DEFAULT POLICY
### ===============================
# Semua input diblokir kecuali yang diizinkan
iptables -P INPUT DROP
# Tidak ada paket yang lewat forward tanpa izin
iptables -P FORWARD DROP
# Output diizinkan agar server bisa update / akses internet
iptables -P OUTPUT ACCEPT
### ===============================
### 3. IZINKAN LOOPBACK (LOCALHOST)
### ===============================
# Izinkan komunikasi internal 127.0.0.1
iptables -A INPUT -i lo -j ACCEPT
### ===============================
### 4. IZINKAN KONEKSI YANG SUDAH TERBENTUK
### ===============================
# Balasan dari koneksi yang sudah berjalan (stateful firewall)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
### ===============================
### 5. LAYANAN SERVER (SEMUA LAYANAN)
### ===============================
### SSH ###
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
### HTTP / HTTPS ###
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
### FTP ###
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
### DNS (UDP & TCP) ###
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
### DHCP Server (port 67 dan 68) ###
iptables -A INPUT -p udp --dport 67:68 -j ACCEPT
### SMTP (Mail server) ###
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --dport 587 -j ACCEPT
### POP3 / IMAP ###
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp --dport 143 -j ACCEPT
### Secure POP3 / IMAP ###
iptables -A INPUT -p tcp --dport 465 -j ACCEPT
iptables -A INPUT -p tcp --dport 993 -j ACCEPT
iptables -A INPUT -p tcp --dport 995 -j ACCEPT
### MySQL ###
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
### PostgreSQL ###
iptables -A INPUT -p tcp --dport 5432 -j ACCEPT
### VPN ###
iptables -A INPUT -p udp --dport 1194 -j ACCEPT        # OpenVPN
iptables -A INPUT -p udp --dport 51820 -j ACCEPT      # Wireguard
### Proxy ###
iptables -A INPUT -p tcp --dport 3128 -j ACCEPT        # Squid
### ===============================
### 6. ROUTER / NAT (IP MASQUERADE)
### ===============================
# (GANTI eth0 dengan interface internet)
WAN="eth0"
LAN="eth1"
# NAT agar client LAN bisa akses internet
iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE
# Izinkan trafik dari LAN ke internet
iptables -A FORWARD -i $LAN -o $WAN -j ACCEPT
# Izinkan trafik dari internet ke LAN jika ada port forwarding
iptables -A FORWARD -i $WAN -o $LAN -m state --state RELATED,ESTABLISHED -j ACCEPT
### ===============================
### 7. PROTEKSI DASAR (ANTI BRUTE-FORCE SSH)
### ===============================
# Jika 4 kali gagal SSH dalam 1 menit → DROP
iptables -A INPUT -p tcp --dport 22 -m recent --set
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 -j DROP
### ===============================
### 8. LOGGING (OPSIONAL)
### ===============================
# Log paket yang di-drop (agar mudah troubleshoot)
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROP: " --log-level 4
echo "Firewall berhasil diterapkan!"
</syntaxhighlight>

Revision as of 20:13, 31 October 2025

Apa itu IPTables?

iptables adalah firewall berbasis packet filtering yang bekerja menggunakan Netfilter di kernel Linux.

Ia mengatur lalu-lintas IPv4 (ada juga ip6tables untuk IPv6).

Walaupun Debian 12 memakai nftables secara default, iptables masih sangat penting untuk dipahami, karena:

  • Banyak server lama masih memakai iptables.
  • Banyak software firewall (fail2ban, docker versi lama, kube-proxy lama) masih berinteraksi dengan iptables.
  • Banyak job IT meminta kemampuan iptables.

Arsitektur Dasar (Tables, Chains, Rules)

Tabel (Tables)

Tabel adalah kategori besar untuk aturan firewall.

Tabel utama:

  • filter → untuk filtering / menyaring paket Chain: INPUT, OUTPUT, FORWARD
  • nat → untuk NAT (SNAT/MASQUERADE & DNAT/PORT FORWARD) Chain: PREROUTING, POSTROUTING, OUTPUT
  • mangle → modifikasi header paket (QoS, TTL, dsb)
  • raw → pengecualian dari connection tracking
  • security → SELinux (jarang dipakai di Debian

Untuk awal-awal kita fokus pada filter dan nat dulu.

Chain (rantai proses firewall)

Chain Fungsi
INPUT Paket menuju server lokal
OUTPUT Paket yang keluar dari server
FORWARD Paket yang lewat server (jika server jadi router)
PREROUTING DNAT, port-forwarding sebelum routing
POSTROUTING SNAT/MASQUERADE setelah routing

Rules

Rule adalah aturan seperti:

  • sumber/dst address
  • source/dst port
  • protokol
  • action (ACCEPT, DROP, REJECT)

Konsep penting: Connection Tracking

iptables bersifat stateful, artinya firewall tahu keadaan koneksi.

State umum:

  • NEW — koneksi baru
  • ESTABLISHED — koneksi yang sudah berjalan
  • RELATED — koneksi tambahan (FTP, ICMP error)
  • INVALID — paket rusak/tidak sesuai

Contoh rule penting:

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

→ Supaya koneksi yang sudah terbentuk tidak diblokir.

Sintaks dasar perintah IPTables

Format:

iptables [tabel] [aksi] [parameter] -j [target]

Contoh :

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Keterangan:

  • -A = append (tambahkan rule)
  • INPUT = chain
  • -p tcp = protokol
  • --dport 22 = port 22
  • -j ACCEPT = tindakan

Aksi lain:

  • -I = insert di awal
  • -D = delete
  • -F = flush (hapus semua rule)
  • -L = list rules

Konfigurasi Firewall Dasar

Contoh 1 - Izinkan SSH (port 22)

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Contoh 2 - Izinkan trafik yang sudah established

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Contoh 3 - Izinkan loopback

iptables -A INPUT -i lo -j ACCEPT

Contoh 4 - Drop semua input selain yang diizinkan

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

Save dan Restore IPTables

Debian tidak menyimpan rules secara otomatis.

Gunakan paket:

sudo apt install iptables-persistent

Lalu simpan:

sudo netfilter-persistent save

Maka setiap server restart rule IPTables akan direstore otomatis

Perintah lengkap IPTables untuk penggunaan standar server

#!/bin/bash

### ===============================
### 1. RESET FIREWALL
### ===============================

# Hapus semua rules di semua chain
iptables -F

# Hapus semua custom chain
iptables -X

# Hapus rules NAT
iptables -t nat -F
iptables -t nat -X

# Hapus rules mangle
iptables -t mangle -F
iptables -t mangle -X


### ===============================
### 2. SET DEFAULT POLICY
### ===============================

# Semua input diblokir kecuali yang diizinkan
iptables -P INPUT DROP
# Tidak ada paket yang lewat forward tanpa izin
iptables -P FORWARD DROP
# Output diizinkan agar server bisa update / akses internet
iptables -P OUTPUT ACCEPT


### ===============================
### 3. IZINKAN LOOPBACK (LOCALHOST)
### ===============================

# Izinkan komunikasi internal 127.0.0.1
iptables -A INPUT -i lo -j ACCEPT


### ===============================
### 4. IZINKAN KONEKSI YANG SUDAH TERBENTUK
### ===============================

# Balasan dari koneksi yang sudah berjalan (stateful firewall)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT


### ===============================
### 5. LAYANAN SERVER (SEMUA LAYANAN)
### ===============================

### SSH ###
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

### HTTP / HTTPS ###
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

### FTP ###
iptables -A INPUT -p tcp --dport 21 -j ACCEPT

### DNS (UDP & TCP) ###
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -j ACCEPT

### DHCP Server (port 67 dan 68) ###
iptables -A INPUT -p udp --dport 67:68 -j ACCEPT

### SMTP (Mail server) ###
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --dport 587 -j ACCEPT

### POP3 / IMAP ###
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp --dport 143 -j ACCEPT

### Secure POP3 / IMAP ###
iptables -A INPUT -p tcp --dport 465 -j ACCEPT
iptables -A INPUT -p tcp --dport 993 -j ACCEPT
iptables -A INPUT -p tcp --dport 995 -j ACCEPT

### MySQL ###
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT

### PostgreSQL ###
iptables -A INPUT -p tcp --dport 5432 -j ACCEPT

### VPN ###
iptables -A INPUT -p udp --dport 1194 -j ACCEPT        # OpenVPN
iptables -A INPUT -p udp --dport 51820 -j ACCEPT       # Wireguard

### Proxy ###
iptables -A INPUT -p tcp --dport 3128 -j ACCEPT        # Squid


### ===============================
### 6. ROUTER / NAT (IP MASQUERADE)
### ===============================

# (GANTI eth0 dengan interface internet)
WAN="eth0"
LAN="eth1"

# NAT agar client LAN bisa akses internet
iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE

# Izinkan trafik dari LAN ke internet
iptables -A FORWARD -i $LAN -o $WAN -j ACCEPT

# Izinkan trafik dari internet ke LAN jika ada port forwarding
iptables -A FORWARD -i $WAN -o $LAN -m state --state RELATED,ESTABLISHED -j ACCEPT


### ===============================
### 7. PROTEKSI DASAR (ANTI BRUTE-FORCE SSH)
### ===============================

# Jika 4 kali gagal SSH dalam 1 menit → DROP
iptables -A INPUT -p tcp --dport 22 -m recent --set
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 -j DROP


### ===============================
### 8. LOGGING (OPSIONAL)
### ===============================

# Log paket yang di-drop (agar mudah troubleshoot)
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROP: " --log-level 4

echo "Firewall berhasil diterapkan!"