Implementasi Firewall dengan iptables: DMZ, NAT, dan Network Segmentation

1. Pengenalan iptables

iptables adalah tool command-line untuk konfigurasi firewall di sistem operasi Linux. iptables menggunakan framework netfilter dari kernel Linux untuk melakukan packet filtering, NAT (Network Address Translation), dan manipulasi paket jaringan.

Mengapa Menggunakan iptables?

  • Powerful dan Flexible: Kontrol penuh atas traffic jaringan
  • Built-in di Linux: Tidak perlu instalasi tambahan di mayoritas distro
  • Stateful Inspection: Dapat melacak state koneksi
  • NAT Support: SNAT, DNAT, dan MASQUERADE
  • Free dan Open Source: Tidak ada biaya lisensi
  • Production-Ready: Digunakan di enterprise dan data center

2. Arsitektur iptables: Tables dan Chains

iptables mengorganisir rules dalam Tables dan Chains. Memahami arsitektur ini sangat penting untuk konfigurasi yang efektif.

Tiga Tables Utama

Table Fungsi Utama Chains
Mangle Modifikasi quality of service bits di TCP header PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
Filter Packet filtering (default table) INPUT, FORWARD, OUTPUT
NAT Network Address Translation PREROUTING, POSTROUTING, OUTPUT

3. Packet Flow dalam iptables

Memahami alur paket melalui iptables sangat penting untuk konfigurasi yang benar:

Diagram Packet Flow

INPUT PACKAGEPREROUTING
PREROUTING → Decision: Local atau Forward?
Jika Local: PREROUTING → INPUT → PROCESS → OUTPUT → POSTROUTING
Jika Forward: PREROUTING → FORWARD → POSTROUTING → OUTPUT PACKAGE

Penjelasan Setiap Chain:

  1. PREROUTING: Diproses sebelum routing decision. Digunakan untuk DNAT (mengubah destination address)
  2. INPUT: Untuk paket yang ditujukan ke firewall itu sendiri
  3. FORWARD: Untuk paket yang melewati firewall (di-routing ke network lain)
  4. OUTPUT: Untuk paket yang berasal dari firewall itu sendiri
  5. POSTROUTING: Diproses setelah routing decision. Digunakan untuk SNAT (mengubah source address)

4. Mangle Table

Mangle table bertanggung jawab untuk modifikasi quality of service bits di TCP header. Table ini jarang digunakan untuk konfigurasi firewall dasar tetapi sangat berguna untuk traffic shaping dan QoS.

Kapan Menggunakan Mangle Table:
  • Traffic shaping dan bandwidth management
  • Mengubah TOS (Type of Service) bits
  • Marking packets untuk routing policy
  • Advanced QoS implementation

5. Filter Table

Filter table adalah table default dan paling sering digunakan. Bertanggung jawab untuk packet filtering dengan tiga built-in chains:

Forward Chain

Memfilter paket yang ditujukan ke server yang dilindungi oleh firewall. Memfilter paket ke server yang dapat diakses oleh NIC lain di firewall.

Syntax:
iptables -A FORWARD [matching criteria] -j [action]

Input Chain

Memfilter paket yang ditujukan untuk firewall itu sendiri.

Syntax:
iptables -A INPUT [matching criteria] -j [action]

Output Chain

Memfilter paket yang berasal dari firewall.

Syntax:
iptables -A OUTPUT [matching criteria] -j [action]

6. NAT Table

NAT table bertanggung jawab untuk Network Address Translation dengan dua built-in chains utama:

Pre-routing Chain (DNAT)

NAT paket ketika destination address paket perlu diubah. Address translation terjadi sebelum routing.

Kegunaan PREROUTING:
  • Memfasilitasi transformasi destination IP address agar kompatibel dengan routing table firewall
  • Digunakan dengan NAT dari destination IP address (Destination NAT atau DNAT)
  • Implementasi: Demilitarized Zone (DMZ)

Post-routing Chain (SNAT)

NAT paket ketika source address paket perlu diubah. Address translation terjadi setelah routing.

Kegunaan POSTROUTING:
  • Tidak perlu memodifikasi destination IP address seperti di pre-routing
  • Digunakan dengan NAT dari source IP address (one-to-one atau many-to-one NAT)
  • Dikenal sebagai Source NAT atau SNAT
  • Implementasi: Connection to the Internet

Perbandingan DNAT, SNAT, dan MASQUERADE

Target Deskripsi Common Options
DNAT Digunakan untuk destination network address translation, yaitu menulis ulang destination IP address paket --to-destination [ipaddress]
Memberitahu iptables destination IP address yang seharusnya
SNAT Digunakan untuk source network address translation, menulis ulang source IP address paket. Source IP address ditentukan oleh user --to-source <address>[-<address>][: <port>-<port>]
Menentukan source IP address dan ports yang akan digunakan oleh SNAT
MASQUERADE Digunakan untuk Source Network Address Translation. Secara default, source IP address sama dengan yang digunakan oleh interface firewall [--to-ports <port>[-<port>]]
Menentukan range source ports yang dapat di-map ke original source port

7. DNAT (Destination NAT) untuk DMZ

DNAT digunakan untuk mengizinkan akses dari internet ke server yang berada di DMZ atau internal network, dengan cara mengubah destination IP address paket.

Scenario DMZ Configuration

Tujuan: Komputer dari internet dapat mengakses web server di DMZ menggunakan IP address firewall.

Topologi DMZ

Internet (Your Friend)FIREWALL (Linux)DMZ (Web Server Windows)

User Internal ↔ FIREWALL

Konfigurasi IP Address

Linux Firewall:
- enp0s8: 192.168.56.105 (ke DMZ)
- enp0s9: 192.168.43.20 (ke Internet)

Windows Web Server (DMZ):
- IP: 192.168.56.9
- Subnet: 255.255.255.0
- Gateway: 192.168.56.105

Your Friend (Internet):
- IP: 192.168.43.39

Step-by-Step Implementation DMZ

Step 1: Enable IP Forwarding

# Aktifkan IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

# Verifikasi
cat /proc/sys/net/ipv4/ip_forward
# Output: 1

# Permanent (edit /etc/sysctl.conf)
net.ipv4.ip_forward = 1

Step 2: Install Web Server di Windows (DMZ)

  • Install XAMPP atau web server lainnya
  • Buat halaman web sederhana
  • Set default gateway ke IP firewall (192.168.56.105)
  • Disable koneksi WiFi atau set IP WiFi ke arbitrary address

Step 3: Konfigurasi DNAT di Firewall

# DNAT untuk HTTP (port 80)
iptables -t nat -A PREROUTING -p tcp -d 192.168.43.20 --dport 80 -j DNAT --to 192.168.56.9:80

# Lihat rules NAT
iptables -t nat -L -n -v

# Output akan menampilkan:
# Chain PREROUTING (policy ACCEPT)
# DNAT  tcp  --  *  *  0.0.0.0/0  192.168.43.20  tcp dpt:80 to:192.168.56.9:80

Step 4: Testing dari Internet

Dari komputer friend, akses web server melalui IP firewall:

# Di browser friend
http://192.168.43.20

# Seharusnya menampilkan halaman web dari server DMZ

Port Forwarding dengan Port Berbeda

Anda juga bisa forward port yang berbeda:

# Forward port 10000 di firewall ke port 80 di web server
iptables -t nat -A PREROUTING -p tcp -d 192.168.43.20 --dport 10000 -j DNAT --to 192.168.56.9:80

# Testing
http://192.168.43.20:10000
⚠️ Security Note:

Server di DMZ sebaiknya tidak bisa mengakses internal network secara langsung. Gunakan FORWARD chain rules untuk membatasi akses:

# Blokir DMZ mengakses internal network
iptables -A FORWARD -s 192.168.56.0/24 -d 192.168.1.0/24 -j DROP

8. SNAT (Source NAT) untuk Internet

SNAT digunakan untuk mengizinkan user internal mengakses internet melalui firewall, dengan cara mengubah source IP address paket menjadi IP address firewall.

Scenario User Configuration

Tujuan: User internal dapat mengakses internet, dan server di internet hanya melihat IP firewall (bukan IP user).

Topologi User to Internet

User (Windows)FIREWALL (Linux)Internet (Friend's Server)

Konfigurasi IP Address

Linux Firewall:
- enp0s8: 192.168.56.105 (ke User)
- enp0s9: 192.168.43.20 (ke Internet)

Windows User:
- IP: 192.168.56.9
- Subnet: 255.255.255.0
- Gateway: 192.168.56.105
- WiFi: DISABLED atau arbitrary IP

Friend's Server (Internet):
- IP: 192.168.43.39

Step-by-Step Implementation SNAT

Step 1: Pastikan IP Forwarding Aktif

# Sama seperti konfigurasi DMZ
echo 1 > /proc/sys/net/ipv4/ip_forward

Step 2: Flush Existing NAT Rules (Optional)

# Hapus semua rules di NAT table
iptables -t nat -F

# Verifikasi
iptables -t nat -L -n

Step 3: Konfigurasi SNAT

# SNAT - ubah source IP menjadi IP firewall
iptables -t nat -A POSTROUTING -o enp0s9 -j SNAT --to 192.168.43.20

# Alternative menggunakan MASQUERADE (untuk dynamic IP)
iptables -t nat -A POSTROUTING -o enp0s9 -j MASQUERADE

# Lihat rules
iptables -t nat -L -n -v

Step 4: Create Test Page di Friend's Server

Buat file PHP untuk menampilkan IP pengakses:

<?php 
echo 'User IP Address - ' . $_SERVER['REMOTE_ADDR']; 
?>

Step 5: Testing

Dari Windows user, akses friend's server:

# Di browser Windows
http://192.168.43.39/user.php

# Seharusnya menampilkan: User IP Address - 192.168.43.20
# (IP firewall, BUKAN IP Windows 192.168.56.9)

Verifikasi dengan tracert

# Di Command Prompt Windows
tracert 192.168.43.39

# Output:
# 1  <1 ms  <1 ms  <1 ms  192.168.56.105   (Firewall)
# 2  ...ms  ...ms  ...ms  192.168.43.39    (Destination)
✅ Hasil yang Diharapkan:
  • Windows user dapat mengakses server di internet
  • Server di internet hanya melihat IP firewall (192.168.43.20)
  • IP Windows (192.168.56.9) tersembunyi
  • Semua traffic melewati firewall

9. Implementasi DMZ Configuration

Complete DMZ Setup

Berikut adalah konfigurasi lengkap untuk DMZ dengan multiple servers:

#!/bin/bash
# DMZ Configuration Script

# 1. Enable IP Forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

# 2. Flush existing rules
iptables -F
iptables -t nat -F

# 3. Set default policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 4. Allow loopback
iptables -A INPUT -i lo -j ACCEPT

# 5. Allow established connections
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 6. DNAT untuk Web Server (DMZ)
iptables -t nat -A PREROUTING -p tcp -d 192.168.43.20 --dport 80 -j DNAT --to 192.168.56.9:80
iptables -t nat -A PREROUTING -p tcp -d 192.168.43.20 --dport 443 -j DNAT --to 192.168.56.9:443

# 7. Allow FORWARD untuk web traffic ke DMZ
iptables -A FORWARD -p tcp -d 192.168.56.9 --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp -d 192.168.56.9 --dport 443 -j ACCEPT

# 8. Blokir DMZ ke Internal Network
iptables -A FORWARD -s 192.168.56.0/24 -d 192.168.1.0/24 -j DROP

# 9. Allow ping untuk testing
iptables -A INPUT -p icmp -j ACCEPT

# 10. Log dropped packets
iptables -A INPUT -j LOG --log-prefix "INPUT-DROP: "
iptables -A FORWARD -j LOG --log-prefix "FORWARD-DROP: "

Multiple Servers di DMZ

# Web Server 1
iptables -t nat -A PREROUTING -p tcp -d 192.168.43.20 --dport 80 -j DNAT --to 192.168.56.10:80

# Mail Server
iptables -t nat -A PREROUTING -p tcp -d 192.168.43.20 --dport 25 -j DNAT --to 192.168.56.11:25
iptables -t nat -A PREROUTING -p tcp -d 192.168.43.20 --dport 110 -j DNAT --to 192.168.56.11:110

# FTP Server
iptables -t nat -A PREROUTING -p tcp -d 192.168.43.20 --dport 21 -j DNAT --to 192.168.56.12:21

# DNS Server
iptables -t nat -A PREROUTING -p udp -d 192.168.43.20 --dport 53 -j DNAT --to 192.168.56.13:53
iptables -t nat -A PREROUTING -p tcp -d 192.168.43.20 --dport 53 -j DNAT --to 192.168.56.13:53

10. Implementasi User Configuration

Complete User to Internet Setup

#!/bin/bash
# User Configuration Script

# 1. Enable IP Forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

# 2. Flush existing rules
iptables -F
iptables -t nat -F

# 3. Set default policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 4. Allow loopback
iptables -A INPUT -i lo -j ACCEPT

# 5. Allow established connections
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 6. SNAT untuk user ke internet
iptables -t nat -A POSTROUTING -o enp0s9 -j SNAT --to 192.168.43.20

# Alternative: MASQUERADE
# iptables -t nat -A POSTROUTING -o enp0s9 -j MASQUERADE

# 7. Allow FORWARD dari internal ke internet
iptables -A FORWARD -i enp0s8 -o enp0s9 -j ACCEPT

# 8. Allow SSH ke firewall dari internal
iptables -A INPUT -p tcp -s 192.168.56.0/24 --dport 22 -j ACCEPT

# 9. Allow DNS queries
iptables -A FORWARD -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -p tcp --dport 53 -j ACCEPT

# 10. Log dropped packets
iptables -A FORWARD -j LOG --log-prefix "FORWARD-DROP: "

Selective Internet Access

Mengizinkan user mengakses server tertentu saja:

# User dapat akses Friend Windows 1 tapi tidak Friend Windows 2

# Allow ke Windows 1
iptables -A FORWARD -s 192.168.56.0/24 -d 192.168.43.50 -j ACCEPT

# Block ke Windows 2
iptables -A FORWARD -s 192.168.56.0/24 -d 192.168.43.60 -j DROP

# Default drop all other forward
iptables -A FORWARD -s 192.168.56.0/24 -j DROP

11. REDIRECT untuk Proxy

REDIRECT target digunakan untuk transparent proxy, biasanya di PREROUTING chain. Ini mengalihkan destination IP address ke machine itu sendiri (locally-generated packets di-map ke address 127.0.0.1).

Implementation untuk Squid Proxy

# Redirect semua HTTP traffic (port 80) ke Squid proxy (port 3128)
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128

# Verifikasi
iptables -t nat -L -n -v

Options untuk REDIRECT

--to-ports port[-port]

Menentukan destination port atau range ports untuk digunakan. Tanpa option ini, destination port tidak pernah diubah. Hanya valid jika rule juga menentukan -p tcp atau -p udp.

Complete Transparent Proxy Setup

#!/bin/bash
# Transparent Proxy Configuration

# 1. Install Squid
# apt-get install squid

# 2. Configure Squid (/etc/squid/squid.conf)
# http_port 3128 transparent

# 3. iptables rules
iptables -t nat -A PREROUTING -i enp0s8 -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -i enp0s8 -p tcp --dport 443 -j REDIRECT --to-port 3128

# 4. Allow Squid OUTPUT
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT

# 5. Restart Squid
# systemctl restart squid

12. FORWARD Chain untuk Routing

FORWARD chain digunakan untuk memfilter paket yang di-route melalui firewall.

Contoh FORWARD Rule

# Allow traffic dari anywhere ke web server di DMZ
iptables -A FORWARD -s 0/0 -i eth0 -d 192.168.1.58 -o eth1 -p TCP --sport 1024:65535 --dport 80 -j ACCEPT

Penjelasan Parameter:

  • -s 0/0 - Source dari IP address mana saja
  • -i eth0 - Masuk melalui interface eth0
  • -d 192.168.1.58 - Tujuan ke IP 192.168.1.58
  • -o eth1 - Keluar melalui interface eth1
  • -p TCP - Protocol TCP
  • --sport 1024:65535 - Source port dalam range 1024-65535
  • --dport 80 - Destination port 80 (HTTP)
  • -j ACCEPT - Action: ACCEPT

Advanced FORWARD Rules

# Allow established connections
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Allow outbound HTTP/HTTPS
iptables -A FORWARD -i enp0s8 -o enp0s9 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i enp0s8 -o enp0s9 -p tcp --dport 443 -j ACCEPT

# Allow SSH to specific server
iptables -A FORWARD -i enp0s8 -o enp0s9 -d 192.168.43.100 -p tcp --dport 22 -j ACCEPT

# Block specific subnet
iptables -A FORWARD -d 10.0.0.0/8 -j DROP

# Rate limit ICMP
iptables -A FORWARD -p icmp -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD -p icmp -j DROP

# Log before dropping
iptables -A FORWARD -j LOG --log-prefix "FORWARD-DEFAULT-DROP: "
iptables -A FORWARD -j DROP

13. Save dan Restore iptables

Rules iptables bersifat volatile - hilang setelah reboot. Untuk membuat rules persistent:

Method 1: iptables-save dan iptables-restore

# Save current rules
iptables-save > /etc/iptables/rules.v4

# View saved rules
cat /etc/iptables/rules.v4

# Restore rules
iptables-restore < /etc/iptables/rules.v4

Method 2: Menggunakan iptables-persistent

# Install iptables-persistent (Debian/Ubuntu)
apt-get install iptables-persistent

# Saat instalasi, akan ditanya untuk save current rules
# Pilih Yes untuk IPv4 dan IPv6

# Save rules setelah perubahan
netfilter-persistent save

# Reload rules
netfilter-persistent reload

# View status
netfilter-persistent status

Method 3: Startup Script

# Create script /etc/init.d/firewall
#!/bin/bash
### BEGIN INIT INFO
# Provides:          firewall
# Required-Start:    $network
# Required-Stop:     $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Description:       Firewall configuration
### END INIT INFO

case "$1" in
  start)
    echo "Starting firewall..."
    /etc/iptables/firewall-rules.sh
    ;;
  stop)
    echo "Stopping firewall..."
    iptables -F
    iptables -t nat -F
    iptables -P INPUT ACCEPT
    iptables -P FORWARD ACCEPT
    iptables -P OUTPUT ACCEPT
    ;;
  restart)
    $0 stop
    $0 start
    ;;
  *)
    echo "Usage: $0 {start|stop|restart}"
    exit 1
    ;;
esac

exit 0

# Make executable
chmod +x /etc/init.d/firewall

# Enable on boot
update-rc.d firewall defaults

Backup dan Restore

# Backup dengan timestamp
iptables-save > /root/iptables-backup-$(date +%Y%m%d-%H%M%S).rules

# List backups
ls -lh /root/iptables-backup-*

# Restore dari backup tertentu
iptables-restore < /root/iptables-backup-20250116-120000.rules

14. Troubleshooting dan Monitoring

Viewing iptables Rules

# List all rules dengan line numbers
iptables -L -n -v --line-numbers

# List NAT rules
iptables -t nat -L -n -v --line-numbers

# List Mangle rules
iptables -t mangle -L -n -v --line-numbers

# Show packet/byte counters
iptables -L -n -v

# Zero counters
iptables -Z

Monitoring dengan iptraf

# Install iptraf
apt-get install iptraf-ng

# Run iptraf
iptraf-ng

# Monitor specific interface
iptraf-ng -i enp0s8

Logging dan Analysis

# Add logging rule
iptables -A INPUT -j LOG --log-prefix "INPUT-DEBUG: " --log-level 4

# View logs
tail -f /var/log/syslog | grep INPUT-DEBUG

# Or use journalctl
journalctl -f | grep INPUT-DEBUG

Testing Connectivity

# Test from Windows
ping 192.168.43.20
tracert 192.168.43.20
telnet 192.168.43.20 80

# Test from Linux
ping -c 4 192.168.43.39
traceroute 192.168.43.39
nc -zv 192.168.43.39 80

# Check NAT translations
cat /proc/net/nf_conntrack

Common Issues dan Solutions

Issue 1: DNAT tidak bekerja

Symptom: Tidak bisa akses server di DMZ dari internet
Checklist:
  • ✓ IP forwarding enabled? cat /proc/sys/net/ipv4/ip_forward
  • ✓ DNAT rule correct? iptables -t nat -L -n
  • ✓ FORWARD chain allowing traffic? iptables -L FORWARD -n
  • ✓ Server di DMZ has correct gateway?
  • ✓ Web service running di server DMZ?

Issue 2: SNAT tidak bekerja

Symptom: User tidak bisa akses internet
Checklist:
  • ✓ IP forwarding enabled?
  • ✓ SNAT rule correct? iptables -t nat -L POSTROUTING -n
  • ✓ Default gateway di user correct?
  • ✓ DNS configured di user?
  • ✓ FORWARD chain allowing traffic?

Issue 3: Rules tidak persistent

Solution:
# Install iptables-persistent
apt-get install iptables-persistent

# Save rules
netfilter-persistent save

15. Kesimpulan

Implementasi Firewall menggunakan iptables adalah skill fundamental untuk network administrator dan security engineer. Dengan memahami konsep tables, chains, dan packet flow, Anda dapat membuat konfigurasi firewall yang robust dan secure.

Key Takeaways:

1. Arsitektur iptables:

  • Tiga tables utama: Mangle, Filter, NAT
  • Lima chains: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
  • Packet flow menentukan chain mana yang dilewati

2. DMZ Configuration (DNAT):

  • Menggunakan PREROUTING chain di NAT table
  • Mengubah destination IP untuk akses ke internal server
  • Implementasi dengan iptables -t nat -A PREROUTING ... -j DNAT
  • Membutuhkan FORWARD rules untuk izinkan traffic

3. User to Internet (SNAT):

  • Menggunakan POSTROUTING chain di NAT table
  • Mengubah source IP untuk hide internal addresses
  • Implementasi dengan iptables -t nat -A POSTROUTING ... -j SNAT
  • Alternative: MASQUERADE untuk dynamic IP

4. Security Best Practices:

  • Default deny policy
  • Connection tracking untuk efficiency
  • Rate limiting untuk protect against attacks
  • Logging untuk monitoring dan forensics
  • Regular backup dan testing

5. Advanced Features:

  • REDIRECT untuk transparent proxy
  • FORWARD chain untuk packet routing
  • Multiple servers di DMZ
  • Selective internet access
  • Attack protection mechanisms

Common Use Cases

Use Case Table Chain Target
DMZ Web Server Access NAT PREROUTING DNAT
Hide Internal IPs NAT POSTROUTING SNAT/MASQUERADE
Block Incoming Traffic Filter INPUT DROP
Route Between Networks Filter FORWARD ACCEPT/DROP
Transparent Proxy NAT PREROUTING REDIRECT

Komentar