Ağ güvenliği söz konusu olduğunda iptables’ın en güçlü özelliklerinden biri, paketleri bağımsız birimler olarak değil, bir bağlantının parçası olarak değerlendirebilmesidir. İşte bu noktada conntrack (connection tracking) devreye girer. Stateless bir firewall’da her paket ayrı ayrı değerlendirilir ve bu yaklaşım hem güvenlik açıkları hem de yönetim karmaşıklığı yaratır. Conntrack ile iptables, TCP/UDP/ICMP bağlantılarının durumunu takip ederek çok daha akıllı kararlar verebilir. Bu yazıda conntrack’in nasıl çalıştığını, hangi durumları izlediğini ve gerçek dünya senaryolarında nasıl kullanacağını ele alacağız.
Conntrack Nedir ve Neden Önemlidir?
Conntrack, Linux çekirdeğinin netfilter alt sisteminin bir parçasıdır. Temel görevi, sistemden geçen ağ bağlantılarının durumunu bir tabloda saklamak ve bu bilgiyi paket filtreleme kararlarında kullanmaktır. Bu tablo genellikle conntrack tablosu ya da state table olarak adlandırılır.
Conntrack olmadan şöyle bir senaryo düşün: Web sunucundan dışarıya bir HTTP isteği gönderiyorsun. Gelen yanıt paketini izin vermek için ayrı bir kural yazman gerekiyor. Ama hangi kaynak porttan gelecek? Hangi sekans numarası olacak? Tüm bunları stateless kurallarla yönetmek hem imkansız hem de tehlikeli. Conntrack bu sorunu çözer: “Bu paket zaten kurulmuş bir bağlantıya ait, geçebilir” der.
Conntrack modülünü yüklemek için:
# Modülün yüklü olup olmadığını kontrol et
lsmod | grep conntrack
# Gerekirse manuel yükle
modprobe nf_conntrack
# Kalıcı hale getir
echo "nf_conntrack" >> /etc/modules-load.d/conntrack.conf
Bağlantı Durumları: NEW, ESTABLISHED, RELATED, INVALID
Conntrack dört temel bağlantı durumu tanımlar ve bunları anlamak iyi bir firewall kuralı setinin temelidir.
NEW: Yeni bir bağlantı başlatılıyor. Henüz conntrack tablosunda kaydı yok. Örneğin bir istemciden gelen ilk SYN paketi NEW durumundadır.
ESTABLISHED: Bağlantı iki yönlü iletişim kurmuştur. Hem istemci hem sunucu paket alıp göndermiştir. SYN-ACK alındıktan sonra bağlantı bu duruma geçer.
RELATED: Mevcut bir bağlantıyla ilgili ancak onun doğrudan parçası olmayan bağlantılar. FTP’nin veri kanalı buna en güzel örnektir. Kontrol bağlantısı kurulduktan sonra açılan veri bağlantısı RELATED olarak işaretlenir.
INVALID: Conntrack’in bir bağlantıyla ilişkilendiremediği paketler. Bozuk TCP flag kombinasyonları, sıra numarası tutarsızlıkları veya tabloda kayıt bulunamayan yanıtlar bu kategoriye girer.
Bu durumları kullanarak temel bir stateful firewall kuralı şöyle yazılır:
# Mevcut bağlantılara ait paketleri kabul et
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Geçersiz paketleri düşür
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
# Yeni SSH bağlantılarına izin ver
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
# Varsayılan politikayı kapat
iptables -P INPUT DROP
Conntrack Tablosunu İncelemek
conntrack komut satırı aracı, bağlantı tablosunu yönetmek için kullanılır. Çoğu sistemde conntrack-tools paketi içinde gelir.
# Paketi kur
apt install conntrack # Debian/Ubuntu
yum install conntrack-tools # RHEL/CentOS
# Tüm bağlantıları listele
conntrack -L
# Belirli bir protokolü filtrele
conntrack -L -p tcp
# Belirli bir hedefe giden bağlantıları göster
conntrack -L --dst 192.168.1.100
# Bağlantı sayısını göster
conntrack -C
# Gerçek zamanlı izleme
conntrack -E
Tipik bir conntrack -L çıktısı şöyle görünür:
tcp 6 431999 ESTABLISHED src=192.168.1.50 dst=10.0.0.1 sport=54321 dport=443
src=10.0.0.1 dst=192.168.1.50 sport=443 dport=54321 [ASSURED] mark=0 use=1
Bu çıktıyı okumak önemli: İlk src/dst çifti giden paketi, ikinci src/dst çifti beklenen yanıt paketini temsil eder. ASSURED etiketi, bağlantının her iki yönde de trafik gördüğü anlamına gelir.
Conntrack ile Gelişmiş Kural Yazımı
Yeni Bağlantıları Sınırlamak
Conntrack, limit ve recent modülleriyle birleştirilerek güçlü kural setleri oluşturulabilir. Örneğin brute force saldırılarına karşı SSH’ı korumak:
# SSH için yeni bağlantılara hız sınırı koy
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW
-m recent --set --name SSH_TRACK
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW
-m recent --update --seconds 60 --hitcount 5 --name SSH_TRACK
-j DROP
# Normal SSH bağlantılarına izin ver
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
FTP ve RELATED Durumu
FTP pasif mod için özel helper modülü gerekir. Bu, RELATED durumunun en yaygın kullanım senaryosudur:
# FTP helper modülünü yükle
modprobe nf_conntrack_ftp
# FTP kontrol bağlantısına izin ver
iptables -A INPUT -p tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
# FTP veri bağlantısına izin ver (RELATED sayesinde)
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# Modülün kalıcı yüklenmesi için
echo "nf_conntrack_ftp" >> /etc/modules-load.d/conntrack.conf
UDP ve ICMP ile Conntrack
Conntrack sadece TCP için değil, bağlantısız protokoller olan UDP ve ICMP için de çalışır. UDP’de “bağlantı” kavramı aslında conntrack’in kendi tanımıdır: bir UDP paketi gönderildiğinde ve yanıtı geldiğinde conntrack bunu ESTABLISHED sayar.
# DNS sorgularına izin ver (UDP)
iptables -A OUTPUT -p udp --dport 53 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p udp --sport 53 -m conntrack --ctstate ESTABLISHED -j ACCEPT
# ICMP ping için conntrack kullanımı
iptables -A OUTPUT -p icmp --icmp-type echo-request -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -m conntrack --ctstate ESTABLISHED -j ACCEPT
Conntrack Zaman Aşımı Değerleri
Conntrack tablosu sonsuz büyüyemez. Her bağlantı durumunun bir timeout değeri vardır ve bu değer dolduğunda kayıt tablodan silinir. Yüksek trafik altındaki sunucularda bu değerleri ayarlamak kritik önem taşır.
# Mevcut timeout değerlerini görüntüle
sysctl -a | grep conntrack | grep timeout
# TCP durumlarına göre timeout değerleri
# Yeni bağlantı (SYN gönderildi)
sysctl net.netfilter.nf_conntrack_tcp_timeout_syn_sent
# Varsayılan: 120 saniye
# Kurulu bağlantı
sysctl net.netfilter.nf_conntrack_tcp_timeout_established
# Varsayılan: 432000 saniye (5 gün!)
# Bağlantı kapatılıyor (FIN_WAIT)
sysctl net.netfilter.nf_conntrack_tcp_timeout_fin_wait
# Timeout değerlerini optimize et
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=3600
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
sysctl -w net.netfilter.nf_conntrack_udp_timeout=30
sysctl -w net.netfilter.nf_conntrack_udp_timeout_stream=120
Kalıcı hale getirmek için /etc/sysctl.conf dosyasına ekle:
cat >> /etc/sysctl.conf << 'EOF'
# Conntrack timeout optimizasyonları
net.netfilter.nf_conntrack_tcp_timeout_established = 3600
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30
net.netfilter.nf_conntrack_udp_timeout = 30
net.netfilter.nf_conntrack_udp_timeout_stream = 120
EOF
sysctl -p
Conntrack Tablo Boyutu ve Performans
Yoğun trafik alan sunucularda conntrack tablosu dolabilir. Tablo dolduğunda yeni bağlantılar reddedilebilir ve bu ciddi kesintilere yol açar.
# Maksimum conntrack girişi sayısını kontrol et
sysctl net.netfilter.nf_conntrack_max
cat /proc/sys/net/netfilter/nf_conntrack_max
# Şu an kaç giriş var?
sysctl net.netfilter.nf_conntrack_count
cat /proc/sys/net/netfilter/nf_conntrack_count
# Tablo dolduğunda kernel loguna düşen mesajları izle
dmesg | grep "nf_conntrack: table full"
# Maksimum değeri artır (RAM'e göre hesapla)
# Her giriş yaklaşık 350 byte yer kaplar
# 1GB RAM için: 1000000 / 350 * 1024 ≈ 300000
sysctl -w net.netfilter.nf_conntrack_max=500000
# Hash tablosu boyutunu da artır (max değerinin 1/4'ü önerilir)
echo 125000 > /proc/sys/net/netfilter/nf_conntrack_buckets
Kalıcı ayar için:
cat >> /etc/sysctl.conf << 'EOF'
net.netfilter.nf_conntrack_max = 500000
EOF
# Hash bucket ayarı için modül parametresi gerekir
echo "options nf_conntrack hashsize=125000" > /etc/modprobe.d/conntrack.conf
Gerçek Dünya Senaryosu: Web Sunucusu Firewall Kuralları
Bir production web sunucusu için eksiksiz bir conntrack tabanlı firewall yapılandırması:
#!/bin/bash
# web-server-firewall.sh
# Mevcut kuralları temizle
iptables -F
iptables -X
iptables -Z
# Varsayılan politikalar
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Loopback arayüzüne izin ver
iptables -A INPUT -i lo -j ACCEPT
# Geçersiz paketleri düşür ve logla
iptables -A INPUT -m conntrack --ctstate INVALID
-j LOG --log-prefix "INVALID_PKT: " --log-level 4
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
# Kurulu ve ilgili bağlantılara izin ver
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# SSH - yeni bağlantılar için hız sınırı
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW
-m hashlimit --hashlimit-above 3/minute --hashlimit-burst 5
--hashlimit-mode srcip --hashlimit-name ssh_limit -j DROP
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
# HTTP ve HTTPS
iptables -A INPUT -p tcp -m multiport --dports 80,443
-m conntrack --ctstate NEW -j ACCEPT
# ICMP ping (hız sınırlı)
iptables -A INPUT -p icmp --icmp-type echo-request
-m limit --limit 10/second -j ACCEPT
echo "Firewall kuralları uygulandı."
iptables -L -n -v
Gerçek Dünya Senaryosu: NAT ve Conntrack
NAT (Network Address Translation) doğrudan conntrack’e bağımlıdır. Conntrack olmadan NAT çalışamaz çünkü gelen yanıt paketlerini doğru iç IP adresine yönlendirmek için bağlantı durumunu bilmek şarttır.
# IP forwarding'i etkinleştir
echo 1 > /proc/sys/net/ipv4/ip_forward
# MASQUERADE ile temel NAT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# İç ağdan dışarıya trafiğe izin ver
iptables -A FORWARD -i eth1 -o eth0
-m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
# Dışarıdan gelen yanıtlara izin ver
iptables -A FORWARD -i eth0 -o eth1
-m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Conntrack tablsunda NAT girişini görmek için
conntrack -L -p tcp | grep MASQUERADE
Conntrack ile Güvenlik: INVALID Paketleri Yönetmek
INVALID paketler güvenlik açısından özellikle ilgi çekicidir. Port tarama araçları, bağlantı durumu izlenmeyen sistemlerde SYN, FIN veya RST bayraklarını manipüle ederek güvenlik duvarlarını atlatmaya çalışır. Conntrack bu tür saldırıları tespit etmede etkilidir.
# TCP state anomalilerini yakala
# SYN flood koruması
iptables -A INPUT -p tcp --syn -m limit --limit 25/second
--limit-burst 50 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
# Nmap NULL scan tespiti
iptables -A INPUT -p tcp --tcp-flags ALL NONE
-m conntrack --ctstate NEW
-j LOG --log-prefix "NULL_SCAN: "
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# Nmap XMAS scan tespiti
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH
-m conntrack --ctstate NEW
-j LOG --log-prefix "XMAS_SCAN: "
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
# INVALID paketleri logla ve düşür
iptables -A INPUT -m conntrack --ctstate INVALID
-j LOG --log-prefix "CONNTRACK_INVALID: " --log-level 6
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
Conntrack Olaylarını İzlemek
Sorun giderme sırasında conntrack olaylarını gerçek zamanlı izlemek çok faydalıdır:
# Tüm conntrack olaylarını izle
conntrack -E
# Sadece yeni bağlantıları izle
conntrack -E -e NEW
# Silinen bağlantıları izle
conntrack -E -e DESTROY
# Belirli bir IP için filtrelenmiş izleme
conntrack -E --src 192.168.1.100
# Conntrack istatistiklerini görüntüle (CPU başına)
conntrack -S
# Conntrack tablosunu periyodik olarak yedekle
conntrack -d /var/backup/conntrack-$(date +%Y%m%d).dump
conntrack -S çıktısı her CPU çekirdeği için şu bilgileri verir:
- found: Arama yapılıp bulunan paket sayısı
- invalid: Geçersiz paket sayısı
- ignore: Yoksayılan paket sayısı
- insert: Tabloya eklenen yeni kayıt sayısı
- insert_failed: Ekleme başarısızlıkları (tablo dolu!)
- drop: Düşürülen paket sayısı
- early_drop: Tablo dolduğunda erken düşürülen kayıtlar
insert_failed veya early_drop değerleri sıfırdan büyükse conntrack tablosu yetersiz demektir ve nf_conntrack_max değerini artırman gerekir.
Conntrack ile İlgili Sık Karşılaşılan Sorunlar
Sorun 1: “nf_conntrack: table full, dropping packet”
# Acil çözüm: Tabloyu temizle
conntrack -F
# Kalıcı çözüm: Max değeri artır
sysctl -w net.netfilter.nf_conntrack_max=1000000
# Timeout değerlerini düşür
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=1800
Sorun 2: FTP pasif mod çalışmıyor
# Helper modülünü yükle
modprobe nf_conntrack_ftp ports=21
# nf_nat_ftp de gerekebilir
modprobe nf_nat_ftp
# Modül yüklü mü kontrol et
lsmod | grep ftp
Sorun 3: Docker ile conntrack çakışması
Docker kendi iptables kurallarını yönetir ve zaman zaman conntrack ayarlarıyla çakışabilir.
# Docker'ın conntrack'i kullanıp kullanmadığını kontrol et
iptables -L DOCKER -n -v
# Docker container'ları için conntrack durumunu izle
conntrack -L | grep $(docker inspect --format '{{.NetworkSettings.IPAddress}}' container_adi)
Conntrack’i Devre Dışı Bırakmak (NOTRACK)
Bazı durumlarda, özellikle çok yüksek trafik hacimlerinde, belirli bağlantılar için conntrack’i devre dışı bırakmak performansı artırabilir. Bu raw tablosundaki NOTRACK hedefiyle yapılır:
# DNS trafiği için conntrack'i devre dışı bırak (yüksek volumlu DNS sunucuları için)
iptables -t raw -A PREROUTING -p udp --dport 53 -j NOTRACK
iptables -t raw -A OUTPUT -p udp --sport 53 -j NOTRACK
# Belirli bir ağ arayüzü için conntrack'i tamamen kapat
iptables -t raw -A PREROUTING -i eth1 -j NOTRACK
iptables -t raw -A OUTPUT -o eth1 -j NOTRACK
# NOTRACK kullanırken ESTABLISHED kuralları çalışmaz!
# Bu yüzden açık ACCEPT kuralları yazman gerekir
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
Sonuç
Conntrack, iptables’ı basit bir paket filtreleyiciden gerçek bir stateful firewall’a dönüştüren bileşendir. NEW, ESTABLISHED, RELATED ve INVALID durumlarını doğru anlamak ve kullanmak, hem daha güvenli hem de daha yönetilebilir firewall kuralları yazmanı sağlar. Gereksiz kuralları ortadan kaldırır, mantık hatalarını azaltır ve port tarama gibi saldırılara karşı güçlü bir savunma hattı oluşturur.
Üretim ortamlarında conntrack tablo boyutunu ve timeout değerlerini sistemin trafik hacmine göre ayarlamayı unutma. conntrack -L ve conntrack -S komutlarını düzenli olarak izleyerek tablo doluluk oranını takip et. Özellikle yüksek trafik alan sunucularda insert_failed değeri sıfırın üzerine çıkmaya başladığında alarm vermeni sağlayacak bir monitoring scripti yazmak, gece yarısı olan kesintilerin önüne geçecektir. Conntrack’i anlamak aynı zamanda nftables’a geçişi de kolaylaştırır çünkü nftables da temelde aynı netfilter altyapısını kullanır.