ngrep ile Ağ Trafiğinde Metin Tabanlı İçerik Arama ve Filtreleme

Ağ sorunlarını debug etmek söz konusu olduğunda, çoğu sysadmin ilk olarak tcpdump ya da Wireshark’a uzanır. Bunlar güçlü araçlar, bunu kimse inkar edemez. Ama bazen ihtiyacınız olan şey çok daha basit: paketteki bir HTTP başlığını aramak, belirli bir kullanıcı adının trafikte geçip geçmediğini görmek ya da bir API çağrısında hangi parametrelerin gönderildiğini anlamak. İşte tam bu noktada ngrep devreye giriyor ve işinizi inanılmaz derecede kolaylaştırıyor.

ngrep, adından da tahmin edebileceğiniz gibi “ağ grep’i” olarak düşünebileceğiniz bir araç. Grep’in dosyalarda metin aradığı gibi, ngrep de ağ trafiğinde metin arıyor. Regex desteği var, BPF filtreleri kullanabiliyor ve çıktısı insan gözüne son derece dostu. Kurumsal ortamlarda yoğun trafik altında bile belirli bir string’i yakalamak için dakikalar içinde sonuç almanızı sağlıyor.

Kurulum ve Temel Gereksinimler

Çoğu dağıtımda ngrep paket depolarında mevcut. Kurulum gayet basit:

# Debian/Ubuntu
sudo apt-get install ngrep

# RHEL/CentOS/Rocky Linux
sudo yum install ngrep
# veya
sudo dnf install ngrep

# Arch Linux
sudo pacman -S ngrep

ngrep’in çalışması için libpcap kütüphanesine ihtiyacı var. Modern sistemlerde bu genellikle zaten kurulu geliyor, ama minimal bir sunucu kurulumunda yoksa:

sudo apt-get install libpcap-dev

Aracı kullanmak için root yetkisine ya da CAP_NET_RAW capability’sine ihtiyacınız var. Production sistemlerde sudo ile çalıştırmanızı öneririm, direkt root olmak yerine.

Temel Söz Dizimi ve İlk Adımlar

ngrep’in temel söz dizimi şu şekilde:

ngrep [seçenekler] [arama_deseni] [BPF filtresi]

En basit kullanımıyla, tüm arayüzlerdeki trafikte “GET” kelimesini aramak için:

sudo ngrep -d any 'GET'

Bu komutu çalıştırdığınızda HTTP GET isteklerini anında görmeye başlarsınız. Ama dikkat edin, yoğun bir sunucuda bu komutu filtresiz çalıştırmak ekranı hızla dolduracaktır.

Belirli bir ağ arayüzünde dinlemek için:

sudo ngrep -d eth0 'POST'

Eğer trafik şifreli değilse (yani HTTPS değil, düz HTTP), POST gövdesini bile görebilirsiniz. Bu, API test ortamlarında son derece işe yarar.

Sık Kullanılan Parametreler

ngrep’in parametrelerini iyi bilmek, aracı gerçek anlamda verimli kullanmanın anahtarı:

-d: Dinlenecek ağ arayüzünü belirtir. any kullanırsanız tüm arayüzleri dinler.

-i: Büyük/küçük harf duyarsız arama yapar. HTTP başlıklarında çok kullanışlı.

-q: Sessiz mod, sadece eşleşen paketleri gösterir, ###### gibi eşleşmeyen paket sayaçlarını gizler.

-W byline: Her HTTP başlığını ayrı satırda gösterir, okunabilirliği artırır.

-t: Her pakete zaman damgası ekler.

-A sayı: Eşleşmeden sonra belirtilen sayıda paketi daha gösterir (after context).

-B sayı: Eşleşmeden önce belirtilen sayıda paketi gösterir (before context).

-l: Satır bazlı çıktı modu, başka araçlarla pipe kullanırken işe yarar.

-p: Promiscuous modu devre dışı bırakır. Sadece bu makineye gelen/giden trafiği yakalar.

-n sayı: Belirtilen sayıda eşleşme bulduktan sonra durur.

-O dosya: Eşleşen paketleri pcap formatında dosyaya yazar.

-I dosya: Canlı trafik yerine pcap dosyasından okur.

-s boyut: Snap length, kaç byte yakalanacağını belirler.

-x: Hex dump çıktısı verir, ikili protokollerde işe yarar.

-X: Hex ve ASCII çıktısını birlikte gösterir.

Gerçek Dünya Senaryoları

Senaryo 1: HTTP API Trafiğini İzleme

Diyelim ki bir mikro servis mimarinizde bir servisten diğerine giden API çağrılarını izlemek istiyorsunuz. Özellikle belirli bir endpoint’e yapılan çağrıları görmek çok işe yarar:

sudo ngrep -d any -W byline 'api/v2/users' port 8080

Bu komut, 8080 portundaki trafikte api/v2/users string’ini arar ve her başlığı ayrı satırda gösterir. Çıktı şuna benzer olacaktır:

T 10.0.0.5:52341 -> 10.0.0.10:8080 [AP]
POST /api/v2/users HTTP/1.1.
Host: internal-api.sirket.local.
Content-Type: application/json.
Authorization: Bearer eyJhbGc...

Authorization header’larının görünüyor olması aslında önemli bir güvenlik notu: ngrep’i asla şifrelenmemiş production trafiğinde hassas veri ararken kayıt altına almayın.

Senaryo 2: DNS Sorgularını İzleme

DNS sorunlarını debug etmek bazen can sıkıcı olabiliyor. ngrep ile hangi DNS sorgularının yapıldığını görmek çok kolay:

sudo ngrep -d any -q 'sirket.local' port 53

Ama DNS ikili protokol kullandığı için düz metin aramak her zaman çalışmayabilir. Bu durumda hex modunu kullanabilirsiniz:

sudo ngrep -d any -xq '' port 53

Yoğun DNS trafiği olan bir ortamda belirli domain’leri takip etmek için:

sudo ngrep -d any -i 'example.com' udp port 53

Senaryo 3: Kullanıcı Kimlik Bilgilerini Düz Metin Protokollerde Tespit Etme

Bu senaryo aslında bir güvenlik denetimi senaryosu. Eski sistemlerde hala FTP, Telnet veya düz HTTP üzerinden kimlik doğrulama yapılıyor olabilir. Bu tür açıkları tespit etmek için:

sudo ngrep -d any -i 'user|pass|login|password' tcp port 21 or port 23 or port 80

Bu komut FTP, Telnet ve HTTP trafiğinde kimlik bilgisi içerebilecek terimleri arar. Eğer çıktıda gerçek kimlik bilgileri görüyorsanız, güvenlik ekibinizle acil toplantı ayarlamanın zamanı gelmiş demektir.

Senaryo 4: Redis ve Memcached Komutlarını İzleme

Cache katmanında neler olduğunu anlamak bazen çok kritik. Özellikle production’da beklenmedik bir cache miss oranıyla karşılaştığınızda:

sudo ngrep -d lo -W byline 'GET|SET|DEL' port 6379

Memcached için:

sudo ngrep -d any 'get|set|delete' port 11211

Hangi key’lerin en çok sorgulandığını, hangilerinin set edildiğini gerçek zamanlı olarak görebilirsiniz. Bu, uygulama davranışını anlamak için son derece değerli.

Senaryo 5: Yavaş Sorgu Tespiti için MySQL Trafiğini İzleme

MySQL’in slow query log’u zaten var elbette, ama bazen trafiği anlık görmek daha hızlı sonuç verebilir:

sudo ngrep -d any -i 'select|insert|update|delete' port 3306

Belirli bir tabloya yapılan sorguları izlemek için:

sudo ngrep -d any -i -W byline 'orders' port 3306

Dikkat: MySQL protokolü bazen ikili veri içerebilir, bu yüzden çıktı her zaman tamamen okunabilir olmayabilir. Ama tablo adları ve temel SQL komutları genellikle düz metin olarak geçer.

Senaryo 6: SMTP Trafiğini Debug Etme

Mail sunucusu sorunlarında SMTP trafiğini izlemek çok işe yarar:

sudo ngrep -d any -W byline -q '' port 25 or port 587

Belirli bir alıcıya giden mailleri görmek için:

sudo ngrep -d any -i 'rcpt to.*@sirket.com' port 25

EHLO ve AUTH adımlarını izlemek için:

sudo ngrep -d any -i 'ehlo|auth|mail from|rcpt to' port 25

Bu sayede mail sunucusu ile client arasındaki SMTP konuşmasını adım adım takip edebilirsiniz.

BPF Filtreleri ile Gelişmiş Kullanım

ngrep, tcpdump ile aynı BPF (Berkeley Packet Filter) söz dizimini kullanıyor. Bu, trafiği çok daha granüler şekilde filtrelemenizi sağlıyor.

Belirli bir kaynak IP’den gelen trafiği izlemek:

sudo ngrep -d any 'hata' src host 192.168.1.100

Belirli bir ağ aralığından gelen trafiği izlemek:

sudo ngrep -d any 'error' net 10.0.0.0/24

TCP ve UDP’yi birlikte ya da ayrı ayrı filtreleyebilirsiniz:

# Sadece TCP
sudo ngrep -d any 'GET' tcp

# Sadece UDP
sudo ngrep -d any '' udp port 514

# Belirli port aralığı
sudo ngrep -d any 'POST' portrange 8000-9000

Birden fazla host’u izlemek:

sudo ngrep -d any 'timeout' host 10.0.0.5 or host 10.0.0.6

Regex Kullanımı

ngrep, POSIX extended regular expressions destekliyor. Bu, aramalarınızı çok daha güçlü hale getiriyor:

# HTTP 4xx ve 5xx hatalarını yakala
sudo ngrep -d any 'HTTP/1.[01] [45][0-9][0-9]'

# Belirli bir User-Agent aramak
sudo ngrep -d any -i 'user-agent: Mozilla/5.[0-9]'

# IP adresi pattern'ı aramak (log injection tespiti için)
sudo ngrep -d any '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}'

# Belirli bir JWT formatını aramak (sızdırma tespiti)
sudo ngrep -d any 'eyJ[A-Za-z0-9_-]{20,}'

JWT pattern’ı aramak konusunda özellikle dikkatli olun; bu tür izleme araçlarının yetkisiz kullanımı hukuki sorunlara yol açabilir. Yetki belgesi olmadan başkalarının trafiğini izlemek yasadışıdır.

Çıktıyı Başka Araçlarla Birleştirme

ngrep’in asıl gücünden biri, Unix felsefesine uygun şekilde diğer araçlarla birleştirilebilmesi:

# Hataları dosyaya kaydet ve aynı anda izle
sudo ngrep -d any -l 'error|ERROR|exception' port 8080 | tee /tmp/errors.log

# Belirli bir pattern için sayım yap
sudo ngrep -d any -q '404' port 80 | grep -c '404'

# Gerçek zamanlı istatistik
sudo ngrep -d any -q 'POST' port 80 | pv -l -i 5 > /dev/null

# Sadece URL'leri çıkart
sudo ngrep -d any -W single 'GET|POST' port 80 | grep -oP '(GET|POST) K[^ ]+'

pcap dosyasına kaydedip sonra analiz etmek de mümkün:

# Tüm eşleşen paketleri kaydet
sudo ngrep -d any -O /tmp/captured.pcap 'error' port 8080

# Sonra tcpdump ya da Wireshark ile analiz et
tcpdump -r /tmp/captured.pcap

Tersine, var olan bir pcap dosyasını ngrep ile analiz edebilirsiniz:

sudo ngrep -I /tmp/existing_capture.pcap 'timeout'

Performans ve Dikkat Edilmesi Gerekenler

ngrep yoğun trafikte paket düşürebilir. Gigabit üzeri trafikte bu ciddi bir sorun haline gelebilir. Bu durumlarda şu önlemleri alın:

  • BPF filtrelerini mümkün olduğunca kısıtlayıcı tutun, böylece kernel seviyesinde filtreleme yapılır ve userspace’e daha az paket gelir.
  • -s parametresiyle snap length’i düşürün. Eğer sadece başlıkları görmek istiyorsanız -s 512 yeterli olabilir.
  • -n parametresiyle belirli sayıda eşleşme sonrası durmayı düşünün.
  • Production sistemlerde ngrep yerine daha önce alınmış bir pcap üzerinde çalışmak daha güvenli olabilir.
# İlk 100 eşleşmeyi bul ve dur
sudo ngrep -d any -q -n 100 'POST /api' port 8080

# Sadece ilk 256 byte'a bak
sudo ngrep -d any -s 256 'Content-Type' port 80

Güvenlik Ortamlarında Kullanım

Penetrasyon testi ve güvenlik denetimi bağlamında ngrep son derece değerli bir araç. Ama bu bağlamda bazı pratik senaryolar:

Cleartext protokol tespiti için bir ağ segmentinde kısa süreli dinleme:

# 60 saniye boyunca cleartext kimlik bilgilerini ara
sudo timeout 60 ngrep -d any -i 'password=|passwd=|user=|username=' tcp

HTTP response’larındaki hassas bilgileri tespit etmek için:

sudo ngrep -d any -i 'credit.card|cvv|ssn|social.security' port 80

Eğer bu pattern’lar için eşleşme bulursanız, veri sızdırma ya da yanlış yapılandırılmış servisler söz konusu olabilir.

Script ile Otomatik İzleme

Bir Bash script’i içinde ngrep kullanarak otomatik uyarı sistemi oluşturabilirsiniz:

#!/bin/bash

THRESHOLD=10
COUNT=0
ALERT_EMAIL="[email protected]"
LOG_FILE="/var/log/ngrep_errors.log"

echo "İzleme başladı: $(date)" >> "$LOG_FILE"

sudo ngrep -d any -l -q '500 Internal Server Error' port 80 | while read line; do
    echo "$(date '+%Y-%m-%d %H:%M:%S') $line" >> "$LOG_FILE"
    COUNT=$((COUNT + 1))
    
    if [ "$COUNT" -ge "$THRESHOLD" ]; then
        echo "UYARI: Son dakikada $THRESHOLD adet 500 hatası tespit edildi!" | 
            mail -s "Production HTTP 500 Alert" "$ALERT_EMAIL"
        COUNT=0
    fi
done

Bu script basit bir örnek; production’da bunu daha sağlam bir monitoring altyapısına (Prometheus, Grafana, ELK stack) entegre etmenizi öneririm. Ama acil durumlarda hızlı bir bant-aid çözümü olarak işe yarar.

ngrep vs Alternatifler

ngrep’i ne zaman kullanmalı, ne zaman başka araçlara geçmeli?

ngrep kullan:

  • Hızlı bir metin araması yapman gerektiğinde
  • HTTP/SMTP/Redis gibi text-based protokollerle çalışırken
  • Tek bir terminal penceresinde sonuç görmek istediğinde
  • Regex ile filtreleme yapman gerektiğinde

tcpdump’ı tercih et:

  • İkili protokollerde çalışırken
  • Pcap dosyasına kaydetmek istediğinde (ngrep de yapabiliyor ama tcpdump daha verimli)
  • Düşük seviyeli paket analizi gerektiğinde
  • Yüksek trafik hacminde (tcpdump daha az paket düşürür)

Wireshark’ı tercih et:

  • Uzun oturumları görsel olarak analiz edeceksen
  • Protokol dissection gerekiyorsa
  • Takım arkadaşlarınla bulguları paylaşman gerekiyorsa

tshark’ı tercih et:

  • Wireshark’ın command-line versiyonunu istiyorsan
  • Karmaşık filtreler ve protokol ayrıştırma gerekiyorsa

Sonuç

ngrep, araç kutunuzda mutlaka bulunması gereken küçük ama son derece etkili bir araç. Özellikle text-based protokollerde sorun giderme yaparken tcpdump’ın output’unu manuel parse etmek yerine doğrudan anlamlı sonuçlar verdiği için zaman kazandırıyor.

Benim kişisel kullanımımda en çok öne çıkan özelliği: bir API gateway’in arkasındaki servisler arasındaki iletişimi hızlıca anlamamı sağlaması. Wireshark’ı açıp filter yazmak yerine tek bir ngrep komutuyla ihtiyacım olan bilgiyi elde edebiliyorum.

Tabii ki güçlü bir araç olan ngrep’i sorumlulukla kullanmak gerekiyor. Yetkisiz ağ dinlemesi hem etik hem hukuki açıdan ciddi sonuçlar doğurabilir. Kendi sorumluluğunuzdaki altyapıda, yetkili olduğunuz sistemlerde ve mümkünse şirket politikaları çerçevesinde kullanın.

Son olarak, ngrep’i öğrenmenin en iyi yolu pratik yapmak. Kendi test ortamınızda bir HTTP sunucusu ayağa kaldırın, basit istekler gönderin ve ngrep’in bunları nasıl yakaladığını inceleyin. Bir saat pratik, beş saatlik dokümantasyon okumaktan daha fazlasını öğretecektir.

Bir yanıt yazın

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