📋 Daftar Isi
- 1. Pengenalan iptables
- 2. Arsitektur iptables: Tables dan Chains
- 3. Packet Flow dalam iptables
- 4. Mangle Table
- 5. Filter Table
- 6. NAT Table
- 7. DNAT (Destination NAT) untuk DMZ
- 8. SNAT (Source NAT) untuk Internet
- 9. Implementasi DMZ Configuration
- 10. Implementasi User Configuration
- 11. REDIRECT untuk Proxy
- 12. FORWARD Chain untuk Routing
- 13. Save dan Restore iptables
- 14. Troubleshooting dan Monitoring
- 15. Kesimpulan
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
Penjelasan Setiap Chain:
- PREROUTING: Diproses sebelum routing decision. Digunakan untuk DNAT (mengubah destination address)
- INPUT: Untuk paket yang ditujukan ke firewall itu sendiri
- FORWARD: Untuk paket yang melewati firewall (di-routing ke network lain)
- OUTPUT: Untuk paket yang berasal dari firewall itu sendiri
- 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.
- 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.
iptables -A FORWARD [matching criteria] -j [action]
Input Chain
Memfilter paket yang ditujukan untuk firewall itu sendiri.
iptables -A INPUT [matching criteria] -j [action]
Output Chain
Memfilter paket yang berasal dari firewall.
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.
- 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.
- 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
- 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
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
- 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)
- 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 internetChecklist:
- ✓ 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 internetChecklist:
- ✓ 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
Posting Komentar