Ağ güvenliğinde ICMP trafiği her zaman tartışmalı bir konu olmuştur. Bir tarafta “ping’i tamamen kapat, güvende ol” diyenler, diğer tarafta “ICMP olmadan ağ yönetimi felç olur” diyenler var. Gerçek şu ki ikisi de tam olarak doğru değil. Akıllıca bir ICMP yönetimi, hem güvenliği hem de ağ işlevselliğini bir arada tutmanın tek yoludur. Bu yazıda iptables kullanarak ICMP trafiğini nasıl granüler düzeyde kontrol edeceğimizi, hangi ICMP türlerinin neden tehlikeli olduğunu ve gerçek dünya senaryolarında nasıl yapılandırma yapacağımızı ele alacağız.
ICMP Nedir ve Neden Önemlidir?
ICMP (Internet Control Message Protocol), IP ağlarında hata raporlama ve tanı amaçlı kullanılan bir protokoldür. ping ve traceroute araçlarının temeli ICMP’ye dayanır. Ancak ICMP sadece bunlardan ibaret değil. Her ICMP mesajının bir type (tür) ve code (kod) değeri vardır ve bu kombinasyonlar farklı işlevler görür.
Sysadmin olarak bilmeniz gereken kritik ICMP türleri şunlardır:
- Type 0: Echo Reply (ping cevabı)
- Type 3: Destination Unreachable (hedefe ulaşılamıyor)
- Type 4: Source Quench (artık kullanılmıyor, tehlikeli)
- Type 5: Redirect (yönlendirme, saldırılarda kullanılabilir)
- Type 8: Echo Request (ping isteği)
- Type 11: Time Exceeded (TTL süresi doldu, traceroute için gerekli)
- Type 12: Parameter Problem (parametre hatası)
ICMP’yi tamamen kapatmak cazip görünebilir ama bu durumda Path MTU Discovery çalışmaz, traceroute kullanılamaz, bazı TCP bağlantıları gizemli şekilde askıda kalır. Amacımız körce kapatmak değil, kontrollü yönetmek.
iptables ICMP Yönetimine Giriş
iptables’da ICMP trafiğini yönetmek için -p icmp parametresini ve --icmp-type seçeneğini kullanırız. Mevcut ICMP türlerini listelemek için şu komutu çalıştırabilirsiniz:
iptables -p icmp --help 2>&1 | grep "Valid ICMP" -A 50
Ya da daha pratik olarak:
# Sistemdeki tüm tanımlı ICMP türlerini listele
cat /etc/protocols | grep icmp
# ve
nmap --script-help icmp-echo 2>/dev/null | head -20
Mevcut ICMP kurallarınızı görmek için:
# Tüm zincirlerdeki ICMP kurallarını listele
iptables -L -n -v | grep -i icmp
# Sadece INPUT zincirini detaylı göster
iptables -L INPUT -n -v --line-numbers
Temel ICMP Kuralları: Adım Adım Yapılandırma
Ping İsteklerini Kontrol Altına Almak
En yaygın senaryo: sunucunuzun dışarıdan ping’e cevap vermesini istemiyorsunuz ama iç ağdan ping atılabilsin.
# Loopback arayüzünden gelen ICMP'ye her zaman izin ver
iptables -A INPUT -i lo -p icmp -j ACCEPT
# İç ağdan (192.168.1.0/24) gelen ping isteklerine izin ver
iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT
# İzleme amaçlı log tut, sonra dışarıdan gelen ping'i reddet
iptables -A INPUT -p icmp --icmp-type echo-request -j LOG --log-prefix "ICMP_PING_DROP: " --log-level 4
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# Kendi gönderdiğimiz ping'lerin cevaplarına izin ver (stateful)
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
Burada önemli bir nokta: -j DROP yerine -j REJECT kullanmak bazen daha iyidir. DROP sessizce paketi atar, REJECT ise “ulaşılamıyor” mesajı gönderir. Güvenlik açısından DROP tercih edilir ama ağ sorun gidermede REJECT daha bilgilendiricidir.
Destination Unreachable Mesajlarını Yönetmek
Type 3 mesajları Path MTU Discovery için kritiktir. Bu mesajları tamamen kapatırsanız bazı web siteleri yüklenemez, büyük dosya transferleri takılır.
# Destination Unreachable mesajlarına izin ver (Path MTU Discovery için şart)
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
# Spesifik olarak fragmentation-needed (code 4) mesajlarına izin ver
# Bu PMTUD için kritik
iptables -A INPUT -p icmp --icmp-type fragmentation-needed -j ACCEPT
# Time exceeded mesajlarına izin ver (traceroute çalışsın)
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
Tehlikeli ICMP Türlerini Engelleme
ICMP Redirect (Type 5) mesajları, saldırganların routing tablosunu manipüle etmek için kullanabileceği bir vektördür. ICMP Source Quench (Type 4) ise eski ve kötüye kullanılabilir bir tür.
# ICMP Redirect mesajlarını engelle ve logla
iptables -A INPUT -p icmp --icmp-type redirect -j LOG --log-prefix "ICMP_REDIRECT: " --log-level 4
iptables -A INPUT -p icmp --icmp-type redirect -j DROP
# Source Quench engelle (zaten kullanılmıyor ama gelse de düşür)
iptables -A INPUT -p icmp --icmp-type source-quench -j DROP
# Kernel seviyesinde de redirect'i kapat (iptables ile birlikte)
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
Rate Limiting: ICMP Flood Saldırılarına Karşı
ICMP flood saldırıları hala kullanılan bir DoS yöntemidir. iptables’ın --limit modülü bu konuda oldukça etkilidir.
# Ping flood koruması: saniyede maksimum 1 ping, burst 5'e kadar
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/second --limit-burst 5 -j ACCEPT
# Limit aşıldığında logla ve düşür
iptables -A INPUT -p icmp --icmp-type echo-request -j LOG --log-prefix "ICMP_FLOOD: " --log-level 4
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# Kaynak IP başına rate limiting için hashlimit kullan
iptables -A INPUT -p icmp --icmp-type echo-request
-m hashlimit
--hashlimit-name icmp_limit
--hashlimit-above 10/minute
--hashlimit-burst 20
--hashlimit-mode srcip
-j LOG --log-prefix "ICMP_PER_IP_FLOOD: "
iptables -A INPUT -p icmp --icmp-type echo-request
-m hashlimit
--hashlimit-name icmp_limit
--hashlimit-above 10/minute
--hashlimit-burst 20
--hashlimit-mode srcip
-j DROP
hashlimit modülü limit modülünden çok daha güçlüdür çünkü her kaynak IP için ayrı bir sayaç tutar. Böylece tek bir saldırgan IP tüm limiti tüketemez.
Gerçek Dünya Senaryosu 1: Web Sunucusu Güvenlik Yapılandırması
Dışarıya hizmet veren bir web sunucusu için tipik ICMP politikası şöyle olabilir:
#!/bin/bash
# web-server-icmp-rules.sh
# Web sunucusu için ICMP güvenlik kuralları
# Önce mevcut ICMP kurallarını temizle
iptables -F INPUT
# Loopback her zaman açık
iptables -A INPUT -i lo -j ACCEPT
# Kurulu bağlantılara izin ver
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# --- ICMP YÖNETİMİ ---
# Destination Unreachable - PMTUD için şart
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
# Time Exceeded - traceroute ve TTL hataları için
iptables -A INPUT -p icmp --icmp-type 11 -j ACCEPT
# Parameter Problem - IP header hatası bildirimi
iptables -A INPUT -p icmp --icmp-type 12 -j ACCEPT
# Ping: rate limiting ile dışarıya kapalı, monitoring IP'sine açık
MONITORING_IP="10.0.0.5"
iptables -A INPUT -s $MONITORING_IP -p icmp --icmp-type echo-request -j ACCEPT
# Diğer tüm ping isteklerini sessizce düşür
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# Redirect, Source Quench ve diğer tehlikeli türleri engelle
iptables -A INPUT -p icmp --icmp-type redirect -j DROP
iptables -A INPUT -p icmp --icmp-type source-quench -j DROP
# Geri kalan tüm ICMP'yi logla ve düşür
iptables -A INPUT -p icmp -j LOG --log-prefix "ICMP_UNKNOWN: " --log-level 4
iptables -A INPUT -p icmp -j DROP
echo "Web sunucusu ICMP kuralları uygulandı."
Gerçek Dünya Senaryosu 2: Kurumsal Ağ Gateway’i
Bir gateway veya router olarak çalışan sunucuda hem INPUT hem FORWARD zincirini yönetmeniz gerekir:
#!/bin/bash
# gateway-icmp-rules.sh
# Gateway sunucusu için kapsamlı ICMP yönetimi
INTERNAL_NET="192.168.0.0/16"
DMZ_NET="10.10.10.0/24"
ADMIN_HOSTS="172.16.0.0/24"
# FORWARD zinciri için ICMP kuralları
# İç ağdan DMZ'ye ping izni
iptables -A FORWARD -s $INTERNAL_NET -d $DMZ_NET
-p icmp --icmp-type echo-request
-m limit --limit 10/second --limit-burst 20
-j ACCEPT
# DMZ'den iç ağa ping yasak
iptables -A FORWARD -s $DMZ_NET -d $INTERNAL_NET
-p icmp --icmp-type echo-request
-j LOG --log-prefix "DMZ_TO_INTERNAL_PING: "
iptables -A FORWARD -s $DMZ_NET -d $INTERNAL_NET
-p icmp --icmp-type echo-request
-j DROP
# Her iki yönde Destination Unreachable ve Time Exceeded'a izin ver
iptables -A FORWARD -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type time-exceeded -j ACCEPT
# Redirect hiçbir yönde iletilmesin
iptables -A FORWARD -p icmp --icmp-type redirect -j DROP
# Admin subnet'ten her yere ping
iptables -A INPUT -s $ADMIN_HOSTS -p icmp --icmp-type echo-request -j ACCEPT
echo "Gateway ICMP kuralları uygulandı."
IPv6 ve ICMPv6 Yönetimi
IPv6 kullanan bir ortamda ip6tables ile ICMPv6’yı yönetmek zorunda kalırsınız. Ve dikkat: IPv6’da bazı ICMPv6 mesajları tamamen bloke edilirse ağ çalışmaz hale gelir.
# ip6tables ile ICMPv6 yönetimi
# Neighbor Discovery Protocol (NDP) için ŞART olan mesajlar
# Bunları asla engelleme!
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type router-solicitation -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT
# ICMPv6 Destination Unreachable ve Packet Too Big (PMTUD için kritik)
ip6tables -A INPUT -p icmpv6 --icmpv6-type destination-unreachable -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type packet-too-big -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type time-exceeded -j ACCEPT
# ICMPv6 ping rate limiting
ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request
-m limit --limit 5/second --limit-burst 10 -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j DROP
echo "IPv6 ICMPv6 kuralları uygulandı."
IPv6’da packet-too-big (Type 2) mesajı IPv4’teki fragmentation-neededin karşılığıdır ve PMTUD için mutlaka açık olması gerekir.
Kuralları Kalıcı Hale Getirme
iptables kuralları varsayılan olarak reboot sonrası kaybolur. Kalıcı hale getirmek için:
# Debian/Ubuntu
apt-get install iptables-persistent
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
# RHEL/CentOS 7
service iptables save
# Bu komut /etc/sysconfig/iptables dosyasına yazar
# Manuel yöntem: her iki distro için çalışır
iptables-save > /root/iptables-backup-$(date +%Y%m%d).rules
# Geri yüklemek için
iptables-restore < /root/iptables-backup-20240115.rules
ICMP Kurallarını Test Etmek
Kuralları uyguladıktan sonra test etmek kritiktir. Sadece “ping gidiyor mu gitmiyor mu” diye bakmak yetmez.
# Temel ping testi
ping -c 4 hedef-ip
# Flood testi (rate limiting'i kontrol et)
ping -f -c 100 hedef-ip # Dikkatli kullan, sadece test ortamında
# traceroute ile time-exceeded kontrolü
traceroute hedef-ip
traceroute6 hedef-ipv6
# hping3 ile farklı ICMP türlerini test et
# ICMP redirect gönder ve engellendi mi kontrol et
hping3 --icmp --icmptype 5 --icmpcode 1 hedef-ip
# PMTUD testi: büyük paketlerin iletilip iletilmediğini kontrol et
ping -M do -s 1450 hedef-ip
# Mevcut kuralları ve paket sayaçlarını izle
watch -n 2 'iptables -L INPUT -n -v | grep icmp'
Log dosyasından ICMP olaylarını takip etmek için:
# Gerçek zamanlı ICMP log takibi
tail -f /var/log/kern.log | grep "ICMP"
# Son 1 saatteki ICMP flood girişimleri
grep "ICMP_FLOOD" /var/log/kern.log | awk '{print $NF}' | cut -d= -f2 | sort | uniq -c | sort -rn | head 20
Sık Yapılan Hatalar ve Çözümleri
Hata 1: Tüm ICMP’yi Kapatmak
En yaygın hata. Sisteme bağlandığınızda bazı HTTPS siteleri yüklenmez, büyük dosya indirmeleri askıda kalır. Nedeni PMTUD’un çalışmamasıdır.
Çözüm: En azından Type 3 (destination-unreachable) ve özellikle Type 3 Code 4 (fragmentation-needed) açık kalmalıdır.
Hata 2: FORWARD Zincirini Unutmak
Router/gateway olan sistemlerde sadece INPUT ve OUTPUT’u yapılandırıp FORWARD’ı unutmak. ICMP flood saldırıları ağınızdaki diğer sistemlere iletilmeye devam eder.
Çözüm: Gateway sistemlerde mutlaka FORWARD zincirini de yapılandırın.
Hata 3: IPv6’da NDP Mesajlarını Engellemek
IPv6’da Neighbor Discovery Protocol ICMPv6 üzerinden çalışır. ip6tables -A INPUT -p icmpv6 -j DROP derseniz IPv6 ağ bağlantınız tamamen kesilir.
Çözüm: ICMPv6 Type 133-137 arasındaki mesajlar (RS, RA, NS, NA, Redirect) dikkatli ele alınmalıdır. NDP mesajlarını her zaman lokale açık tutun.
Hata 4: Stateless Kural Yazımı
-m state --state ESTABLISHED,RELATED kullanmadan sadece tek yönlü ICMP kuralları yazmak. Kendi ping’lerinizin cevapları gelmiyor diye şikayet edersiniz.
Çözüm: ESTABLISHED,RELATED state kuralını INPUT zincirinin başına ekleyin, bu ICMP reply’larını da kapsayacaktır.
Kernel Parametreleriyle iptables’ı Güçlendirmek
iptables kurallarını kernel sysctl parametreleriyle desteklemek katmanlı bir savunma sağlar:
# /etc/sysctl.d/99-icmp-security.conf
# ICMP redirect mesajlarını kabul etme
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
# Redirect gönderme (gateway değilsek)
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# Source routing'i devre dışı bırak
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# Broadcast ping'e cevap verme (Smurf saldırısı koruması)
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Bozuk ICMP hata mesajlarını yoksay
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Ayarları uygula
sysctl -p /etc/sysctl.d/99-icmp-security.conf
icmp_echo_ignore_broadcasts = 1 özellikle önemlidir. Smurf saldırısında saldırgan, kaynak IP olarak kurbanın IP’sini kullanarak broadcast adresine ping atar. Tüm ağdaki hostlar kurbanın IP’sine cevap gönderir ve kurban flooda maruz kalır. Bu parametreyle en azından kendi sisteminiz bu saldırıya ortak olmaz.
Sonuç
ICMP trafiği yönetimi “kapat geç” mantığıyla değil, hangi türün ne işe yaradığını anlayarak yapılmalıdır. Özetlemek gerekirse:
- Kesinlikle açık tutun: Type 3 (Destination Unreachable, özellikle Code 4), Type 11 (Time Exceeded)
- Rate limiting uygulayın: Type 8 (Echo Request / ping)
- Engelleyin: Type 5 (Redirect), Type 4 (Source Quench)
- IPv6’da dikkatli olun: NDP mesajlarını asla tamamen engellemeyin
- Kernel parametrelerini unutmayın: sysctl ile iptables kurallarını destekleyin
- Log tutun: Neyi düşürdüğünüzü bilmeden güvenlik politikası oluşturamazsınız
Gerçek dünyada göreceksiniz ki ICMP ayarlarını düzgün yapmadan önce bazı müşterilerin VPN bağlantıları, bazı uygulamaların büyük veri transferleri ya da monitoring araçlarınızın uyarıları beklenmedik şekilde bozulabilir. Bu yüzden her değişikliği test ortamında deneyin, production’a geçmeden önce rollback planınızı hazırlayın ve log çıktılarını bir süre izleyin. Güvenlik ile işlevsellik arasındaki denge, ancak bu şekilde sağlıklı kurulabilir.