Web Sunucusu İçin Basit Bir iptables Yapılandırması

Basit bir web sunucusunda güvenlik için Apache, MySQL, DNS, FTP ve SSH servislerinin kullandığı portlar dışında kalanları engellemek gerek.

Aşağıdaki betikte SSH için 22. portun kullanıldığı varsayılmıştır. MySQL varsayılan ayarlarıyla çalıştırıldığında 3306 portunu kullanır. Aşağıdaki betikte localhost’tan gelen tüm paketleri kabul etmek için loopback arayüzünden gelen tüm paketlere izin verilmiştir. Bu sayede MySQL dışında localhost’tan çalışan diğer uygulamalara da izin verilmiş oldu. FTP işi biraz daha çetrefilli. FTP aktif modla bağlandığında 21. portu kontrol için, 20. portu da veri iletimi için kullanır. Ama pasif modla bağlandığında ilk bağlantıdan sonra FTP istemcisi daha yüksek portları da kullanmak isteyebilir. Bunun için ip_conntrack çekirdek modülü kullanılarak kurulmuş bağlantılarla ilgili olan bağlantılara izin verilmiştir. ip_conntrack’in yüklenmesi aşağıda açıklanmıştır.

Bazı IP’lerin ve subnet’lerin yasaklanması için örnek satırlar da verilmiştir. Yanlışlıkla engellenmemesi için Cloudflare CDN hizmetinin kullandığı IP adresleri beyaz listeye alınmıştır.

iptables kuralları yukarıdan aşağıya doğru işletilir, gelen paketin uyduğu ilk satır işlendikten sonra diğerleri atlanır. Kuralların sonuna kadar gelindiğinde, bir paket için hala uygun bir kural bulunamamışsa, prensip (Policy) işletilir. Aşağıdaki örnekte prensip DROP olarak belirlenmiştir.

### IP v4 ###

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

# Web
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# MySQL (ve localhost'tan gelen diğer istekler) 
iptables -I INPUT -i lo -j ACCEPT

# FTP
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# DNS
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT

# Yasaklı IPler
iptables -I INPUT 3 -s YASAKLI_IP/24 -j DROP
iptables -I INPUT 3 -s YASAKLI_IP -j DROP

# Cloudflare
iptables -I INPUT 3 -s 103.21.244.0/22 -j ACCEPT
iptables -I INPUT 3 -s 103.22.200.0/22 -j ACCEPT
iptables -I INPUT 3 -s 103.31.4.0/22 -j ACCEPT
iptables -I INPUT 3 -s 104.16.0.0/12 -j ACCEPT
iptables -I INPUT 3 -s 108.162.192.0/18 -j ACCEPT
iptables -I INPUT 3 -s 141.101.64.0/18 -j ACCEPT
iptables -I INPUT 3 -s 162.158.0.0/15 -j ACCEPT
iptables -I INPUT 3 -s 172.64.0.0/13 -j ACCEPT
iptables -I INPUT 3 -s 173.245.48.0/20 -j ACCEPT
iptables -I INPUT 3 -s 188.114.96.0/20 -j ACCEPT
iptables -I INPUT 3 -s 190.93.240.0/20 -j ACCEPT
iptables -I INPUT 3 -s 197.234.240.0/22 -j ACCEPT
iptables -I INPUT 3 -s 198.41.128.0/17 -j ACCEPT
iptables -I INPUT 3 -s 199.27.128.0/21 -j ACCEPT

# Policy
iptables -P INPUT DROP

### IP v6 ###

# Web
ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT

# MySQL
ip6tables -I INPUT -i lo -j ACCEPT

# DNS
ip6tables -A INPUT -p tcp --dport 53 -j ACCEPT
ip6tables -A INPUT -p udp --dport 53 -j ACCEPT

# Yasaklı IPler

# Cloudflare
ip6tables -I INPUT 3 -s 2400:cb00::/32 -j ACCEPT
ip6tables -I INPUT 3 -s 2405:8100::/32 -j ACCEPT
ip6tables -I INPUT 3 -s 2405:b500::/32 -j ACCEPT
ip6tables -I INPUT 3 -s 2606:4700::/32 -j ACCEPT
ip6tables -I INPUT 3 -s 2803:f800::/32 -j ACCEPT

# Policy
ip6tables -P INPUT DROP

ip_conntrack modülünü yüklemek için şu komutu kullanabilirsiniz:

modprobe ip_conntrack_ftp

iptables kuralları bilgisayar yeniden başlatıldığında silinir. Kurallarınızı kaydetmek için iptables-persistent programını yükleyebilirsiniz:

apt-get install iptables-persistent

Bu program kurallarınızı /etc/iptables/rules.v4 ve /etc/iptables/rules.v6 dosyalarına kaydeder ve sistem tekrar başlatıldığında tekrar bu dosyalardan yükler.

ip_conntrack modülünün bilgisayar yeniden başlatıldığında tekrar yüklenmesi için ise /etc/init.d/iptables-persistent dosyasında load_rules() fonksiyonunun en üstüne aşağıdaki satırı ekleyebilirsiniz:

 /sbin/modprobe -q ip_conntrack_ftp

 

Kaynak:
http://bencane.com/2012/09/iptables-linux-firewall-rules-for-a-basic-web-server/
https://www.cloudflare.com/ips