conntrack ile Linux Bağlantı İzleme Tablosunu Görüntüleme ve Yönetme

Üretim ortamında bir güvenlik duvarı sorununu debug ederken, bağlantıların neden düştüğünü anlamak için saatlerce log karıştırdığınız oldu mu? Ben de yıllarca aynı tuzağa düştüm. Ta ki conntrack aracını düzgün kullanmayı öğrenene kadar. Linux çekirdeğinin bağlantı izleme alt sistemi olan Netfilter’ın bu güçlü aracı, ağ sorunlarını çözme konusunda gerçek bir oyun değiştirici.

Bu yazıda conntrack’ı sadece teorik olarak değil, gerçek üretim senaryolarında nasıl kullandığımı anlatacağım.

conntrack Nedir ve Neden Önemlidir

Linux çekirdeği, ağ üzerinden geçen bağlantıları takip etmek için Netfilter connection tracking (conntrack) mekanizmasını kullanır. Bu mekanizma; NAT, firewall kuralları ve durum bilgili paket filtreleme için kritik öneme sahiptir.

conntrack komutu ise bu çekirdek tablosunu kullanıcı alanından görüntülemenizi, filtrelemenizi ve yönetmenizi sağlar. iptables veya nftables kullandığınız her ortamda arka planda bu tablo çalışmaktadır.

Conntrack tablosundaki her girdi şu bilgileri içerir:

  • Protokol: TCP, UDP, ICMP vb.
  • Kaynak ve hedef IP adresleri
  • Kaynak ve hedef portlar
  • Bağlantı durumu: ESTABLISHED, TIME_WAIT, SYN_SENT vb.
  • Timeout değeri: Girdinin tabloda ne kadar kalacağı
  • Paket ve byte sayaçları

Kurulum ve Ön Gereksinimler

Çoğu modern Linux dağıtımında conntrack paketi kurulu gelmez ama çekirdek modülü genellikle yüklüdür.

# Ubuntu/Debian
apt install conntrack

# RHEL/CentOS/AlmaLinux
dnf install conntrack-tools

# Modülün yüklü olduğunu kontrol et
lsmod | grep nf_conntrack

# Değilse yükle
modprobe nf_conntrack

Komutların büyük çoğunluğu root yetkisi gerektirir. Sudo ile çalışıyorsanız başına sudo ekleyin.

Temel Görüntüleme Komutları

Tüm Bağlantıları Listeleme

# Mevcut tüm bağlantıları listele
conntrack -L

# Çıktıyı daha okunabilir formatta al
conntrack -L 2>/dev/null | head -50

Tipik bir çıktı şöyle görünür:

tcp      6 431999 ESTABLISHED src=192.168.1.100 dst=10.0.0.5 sport=54832 dport=443 src=10.0.0.5 dst=192.168.1.100 sport=443 dport=54832 [ASSURED] mark=0 use=1
udp      17 28 src=192.168.1.100 dst=8.8.8.8 sport=42531 dport=53 src=8.8.8.8 dst=192.168.1.100 sport=53 dport=42531 mark=0 use=1

Her satırda iki yönlü bağlantı bilgisi görürsünüz: ilki orijinal yön, ikincisi yanıt yönü.

Bağlantı Sayısını Görme

# Toplam bağlantı sayısı
conntrack -C

# Veya alternatif yol
wc -l /proc/net/nf_conntrack

Bu değeri düzenli izlemek, tablo dolmadan önce uyarı almanızı sağlar. Tablonun dolması ciddi ağ sorunlarına yol açar.

Filtreleme ile Çalışma

conntrack -L çıktısı yüklü sunucularda binlerce satır olabilir. Filtreleme parametrelerini bilmek işi kolaylaştırır.

# Sadece TCP bağlantıları
conntrack -L -p tcp

# Belirli bir kaynak IP'den gelen bağlantılar
conntrack -L -s 192.168.1.50

# Belirli bir hedef porta giden bağlantılar
conntrack -L -p tcp --dport 80

# Belirli bir durumda olan bağlantılar (ESTABLISHED)
conntrack -L -p tcp | grep ESTABLISHED

# Belirli bir hedef IP'ye giden bağlantılar
conntrack -L -d 10.0.0.1

# Kaynak ve hedef kombinasyonu
conntrack -L -s 192.168.1.0/24 -p tcp --dport 443

Gerçek bir senaryodan bahsedeyim: Bir e-ticaret müşterisinde yoğun trafik döneminde bağlantılar rastgele düşüyordu. Aşağıdaki komutla hızlıca konuyu teşhis ettim:

# SYN_SENT durumunda takılı kalan bağlantıları bul
conntrack -L -p tcp | grep SYN_SENT | wc -l

# TIME_WAIT durumundaki bağlantılar (çok fazlaysa sorun işareti)
conntrack -L -p tcp | grep TIME_WAIT | wc -l

# Belirli bir IP'nin kaç bağlantısı var
conntrack -L -s 203.0.113.45 | wc -l

TIME_WAIT sayısı ESTABLISHED sayısını geçmişti. Bu durum, yüksek frekanslı kısa süreli bağlantıların tabloda yer işgal ettiğine işaret ediyordu.

Gerçek Zamanlı İzleme

conntrack’ın en değerli özelliklerinden biri, bağlantıları gerçek zamanlı olarak izleyebilmesidir.

# Yeni oluşan ve silinen bağlantıları izle
conntrack -E

# Sadece yeni bağlantıları izle
conntrack -E -e NEW

# Sadece silinen bağlantıları izle
conntrack -E -e DESTROY

# Belirli bir IP için gerçek zamanlı izleme
conntrack -E -s 192.168.1.100

# TCP bağlantılarını gerçek zamanlı izle, sadece port 25 (SMTP)
conntrack -E -p tcp --dport 25

Bu özelliği özellikle DDoS saldırılarını tespit ederken çok kullandım. Yeni bağlantıları gerçek zamanlı izlerken belirli bir IP’den saniyede onlarca bağlantı geldiğini görmek, problemi anında teşhis ettirir.

# Gerçek zamanlı izlemeyi logla, her 5 saniyede bir analiz et
conntrack -E -e NEW 2>/dev/null | while read line; do
    echo "$(date '+%Y-%m-%d %H:%M:%S') $line" >> /var/log/conntrack_new.log
done

Bağlantı Silme İşlemleri

Bazen conntrack tablosundaki belirli girdileri manuel olarak silmeniz gerekir. Özellikle firewall kuralı değişikliği sonrası eski bağlantıların hemen kesilmesini istediğinizde.

# Belirli bir bağlantıyı sil
conntrack -D -s 192.168.1.100 -d 10.0.0.5 -p tcp --dport 80

# Belirli bir kaynaktan gelen tüm bağlantıları sil
conntrack -D -s 192.168.1.100

# Tüm UDP bağlantılarını sil (dikkatli kullanın!)
conntrack -D -p udp

# Belirli bir durumda olan bağlantıları sil
conntrack -D -p tcp | grep TIME_WAIT

# Başarıyla silinen kayıt sayısını görmek için
conntrack -D -s 10.0.0.100; echo "Silinen kayıt sayısı: $?"

Uyarı: Tüm bağlantıları silmek (conntrack -F) aktif oturumları da keser. Bunu üretim ortamında yaparken çok dikkatli olun. Ben bir keresinde yanlışlıkla aktif bir SSH oturumunun bağlantısını kestim ve sunucuya erişimimi kaybettim. Neyse ki out-of-band erişimim vardı.

# TÜM bağlantıları sil (çok dikkatli!)
conntrack -F

# Sadece belirli protokolü temizle
conntrack -F -p udp

conntrack Tablo Boyutu ve Limitleri

Üretim ortamında en sık karşılaşılan sorunlardan biri conntrack tablosunun dolmasıdır. Tablo dolduğunda yeni bağlantılar kabul edilmez ve sistem loglarında şu mesajı görürsünüz:

nf_conntrack: table full, dropping packet
# Mevcut tablo boyutunu ve maksimum limiti görüntüle
cat /proc/sys/net/netfilter/nf_conntrack_count
cat /proc/sys/net/netfilter/nf_conntrack_max

# Daha detaylı bilgi için
sysctl net.netfilter.nf_conntrack_max
sysctl net.netfilter.nf_conntrack_count

# Maksimum değeri geçici olarak artır
sysctl -w net.netfilter.nf_conntrack_max=131072

# Kalıcı yapmak için sysctl.conf'a ekle
echo "net.netfilter.nf_conntrack_max = 131072" >> /etc/sysctl.conf
sysctl -p

Tablo boyutunu ayarlarken dikkat edilmesi gereken nokta: Her conntrack girdisi yaklaşık 300-400 byte bellek kullanır. 500.000 girdi için yaklaşık 150-200 MB RAM gerekir. Sunucunuzun RAM kapasitesini göz önünde bulundurarak bu değeri belirleyin.

# Bucket sayısını da artırmanız gerekebilir (performans için)
sysctl -w net.netfilter.nf_conntrack_buckets=65536

# Timeout değerlerini görüntüle ve optimize et
sysctl -a | grep conntrack | grep timeout

# TCP TIME_WAIT timeout'u düşür (varsayılan 120 saniye, 60'a indir)
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=60

# Established bağlantı timeout'u (varsayılan 432000 saniye = 5 gün)
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=86400

Protokol Bazlı Timeout Optimizasyonu

Yüksek trafikli ortamlarda timeout değerlerinin optimizasyonu kritik öneme sahiptir:

  • nf_conntrack_tcp_timeout_established: Aktif TCP bağlantıları için timeout. Varsayılan 5 gün genellikle çok yüksektir.
  • nf_conntrack_tcp_timeout_time_wait: TIME_WAIT durumundaki bağlantılar için. 60 saniyeye düşürülebilir.
  • nf_conntrack_tcp_timeout_close_wait: Kapatılmayı bekleyen bağlantılar.
  • nf_conntrack_udp_timeout: UDP bağlantıları için. Varsayılan 30 saniye.
  • nf_conntrack_udp_timeout_stream: UDP akışları için. Varsayılan 120 saniye.
  • nf_conntrack_icmp_timeout: ICMP için. Varsayılan 30 saniye.
# Tüm timeout değerlerini görüntüle
sysctl -a 2>/dev/null | grep "nf_conntrack.*timeout"

# UDP timeout'u düşür (yoğun DNS trafiği olan ortamlar için)
sysctl -w net.netfilter.nf_conntrack_udp_timeout=15
sysctl -w net.netfilter.nf_conntrack_udp_timeout_stream=60

İstatistik ve İzleme

# Conntrack istatistiklerini görüntüle (her CPU için)
conntrack -S

# Örnek çıktı yorumu:
# found: arama yapılan bağlantı sayısı
# invalid: geçersiz paket sayısı
# ignore: yoksayılan paket sayısı
# insert: tabloya eklenen bağlantı sayısı
# insert_failed: eklenemeyen bağlantı sayısı (bu değer artıyorsa sorun var)
# drop: düşürülen paket sayısı
# early_drop: erken düşürülen paket sayısı

# insert_failed değerini izle (artıyorsa tablo doluyor demek)
watch -n 1 "conntrack -S | grep insert_failed"

insert_failed değerinin artması, tablo boyutu sorununa işaret eder. Bunu bir monitoring scriptiyle izleyebilirsiniz:

#!/bin/bash
# /usr/local/bin/conntrack_monitor.sh

THRESHOLD=80
MAX=$(cat /proc/sys/net/netfilter/nf_conntrack_max)
CURRENT=$(cat /proc/sys/net/netfilter/nf_conntrack_count)
USAGE=$(( CURRENT * 100 / MAX ))

if [ $USAGE -gt $THRESHOLD ]; then
    echo "UYARI: Conntrack tablosu %${USAGE} dolu! (${CURRENT}/${MAX})" | 
        mail -s "Conntrack Alert - $(hostname)" [email protected]
    logger -t conntrack-monitor "Tablo %${USAGE} dolu: ${CURRENT}/${MAX}"
fi

echo "Conntrack kullanim: %${USAGE} (${CURRENT}/${MAX})"

Bu scripti crontab’a ekleyin:

# Her 5 dakikada bir kontrol et
*/5 * * * * /usr/local/bin/conntrack_monitor.sh

Pratik Senaryo: Kubernetes ve conntrack

Kubernetes ortamlarında conntrack sorunları çok daha sık karşıma çıkıyor. Özellikle yoğun servis mesh trafiğinde veya UDP tabanlı DNS sorgularında conntrack tablosu hızla dolabiliyor.

# Kubernetes node'unda conntrack durumunu kontrol et
kubectl get nodes -o wide

# Node'a SSH ile bağlan ve kontrol et
ssh node01
conntrack -C  # Toplam bağlantı sayısı

# DNS sorunlarını araştır (UDP port 53)
conntrack -L -p udp --dport 53 | wc -l

# CoreDNS bağlantılarını izle
conntrack -E -p udp --dport 53 2>/dev/null | head -20

# Kubernetes'te sık karşılaşılan conntrack yarış durumu için
# UDP bağlantı takibini devre dışı bırakma (dikkatli kullanın)
sysctl -w net.netfilter.nf_conntrack_udp_timeout=10

Kubernetes’te özellikle nf_conntrack_tcp_timeout_established değeri yüksek kaldığında, ölü pod’ların bıraktığı bağlantı girdileri tabloda yer işgal etmeye devam eder. Bu yüzden Kubernetes node’larında bu değeri daha makul bir seviyeye çekmek iyi bir pratiktir.

Bağlantı Takibini Belirli Trafik İçin Devre Dışı Bırakma

Bazı durumlarda, özellikle yüksek frekanslı internal trafik için conntrack’ı devre dışı bırakmak mantıklı olabilir:

# Belirli bir ağ arayüzü için conntrack'ı devre dışı bırak
iptables -t raw -A PREROUTING -i lo -j NOTRACK
iptables -t raw -A OUTPUT -o lo -j NOTRACK

# Belirli bir port için conntrack'ı devre dışı bırak
# (örneğin yüksek frekanslı internal API trafiği)
iptables -t raw -A PREROUTING -p tcp --dport 8080 -j NOTRACK
iptables -t raw -A OUTPUT -p tcp --sport 8080 -j NOTRACK

# nftables kullanıyorsanız
nft add rule ip raw prerouting tcp dport 8080 notrack
nft add rule ip raw output tcp sport 8080 notrack

Dikkat: NOTRACK kullandığınızda, o trafik için NAT ve durum bilgili firewall kuralları çalışmaz. Bunu sadece güvendiğiniz ve NAT gerektirmeyen internal trafik için kullanın.

Sorun Giderme: Sık Karşılaşılan Senaryolar

Senaryo 1: Asimetrik Routing Sorunları

# INVALID durumdaki paketleri bul
conntrack -L -p tcp | grep INVALID | head -20

# Bu paketlerin sayısını izle
watch -n 2 "conntrack -S | awk '/invalid/{print "INVALID paket:", $2}'"

Senaryo 2: NAT Sonrası Bağlantı Takibi

# NAT edilmiş bağlantıları listele
conntrack -L --output extended | grep "dnat|snat"

# Belirli bir NAT kuralının etkisini gör
conntrack -L -d 10.0.0.5 | grep -v "^udp|^icmp"

Senaryo 3: Conntrack Tablosunu Döküm Alma

Önemli bir sorun anında tablonun anlık görüntüsünü almak, sonradan analiz için çok değerlidir:

# Anlık tüm tabloyu dosyaya kaydet
conntrack -L 2>/dev/null > /tmp/conntrack_dump_$(date +%Y%m%d_%H%M%S).txt

# İstatistiklerle birlikte kaydet
{
    echo "=== Tarih: $(date) ==="
    echo "=== Toplam Bağlantı: $(conntrack -C) ==="
    echo "=== Maksimum: $(cat /proc/sys/net/netfilter/nf_conntrack_max) ==="
    echo "=== İstatistikler ==="
    conntrack -S
    echo "=== Tablo Dökümü ==="
    conntrack -L 2>/dev/null
} > /tmp/conntrack_full_dump_$(date +%Y%m%d_%H%M%S).txt

Performans İpuçları

Yüksek trafikli ortamlarda conntrack performansını artırmak için şu ayarları değerlendirin:

  • nf_conntrack_buckets: Hash tablo boyutu. nf_conntrack_max değerinin dörtte biri olarak ayarlayın.
  • nf_conntrack_checksum: Checksum doğrulaması. Güvenilir internal ağlarda kapatılabilir.
  • nf_conntrack_tcp_loose: Asimetrik routing varsa 1 yapın.
  • nf_conntrack_tcp_be_liberal: Zaman damgası sorunlarını tolere eder.
  • nf_conntrack_generic_timeout: Generic protokol timeout’u.
# Hashsize ayarı (büyük değer = daha hızlı arama, daha fazla RAM)
echo 32768 > /sys/module/nf_conntrack/parameters/hashsize

# Veya modül yüklenirken parametre ver
modprobe nf_conntrack hashsize=32768

Sonuç

conntrack, Linux ağ yönetiminde görünmez ama son derece kritik bir katmandır. Çoğu sysadmin, sorun çıkana kadar bu aracın varlığından haberdar bile olmaz. Oysa bağlantı tablosunu düzenli izlemek ve doğru yapılandırmak, birçok ağ sorununu henüz kullanıcıyı etkilemeden çözmenizi sağlar.

Özellikle şunları alışkanlık haline getirmenizi öneririm: Üretim sunucularınızda nf_conntrack_count ve nf_conntrack_max değerlerini monitoring sistemlerinize ekleyin. Tablo %70-80 dolduğunda uyarı alın. Timeout değerlerini iş yüküne göre optimize edin; varsayılan değerler her ortam için ideal değildir.

Kubernetes, yüksek trafikli web sunucuları veya NAT gateway olarak çalışan sistemlerde conntrack sorunları kaçınılmaz olarak karşınıza çıkacaktır. Bu araçları iyi tanıdığınızda, saatlerce süren debug serüvenleri birkaç dakikaya iner. Benim için öyle oldu.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir