netstat Komutu: Ağ Bağlantılarını ve İstatistikleri Görüntüleme

Ağ sorunları her zaman en kötü zamanda çıkar karşına. Gece yarısı bir servis yanıt vermez olur, bir sunucuya bağlanamıyorsunuzdur ya da beklenmedik bir trafik artışı olur. İşte bu anlarda netstat komutunu iyi bilmek, saatlerce sürebilecek bir debug sürecini birkaç dakikaya indirebilir. Bu yazıda netstat‘ı gerçekten işe yarar biçimde nasıl kullanacağınızı, hangi parametrelerin hangi durumda hayat kurtardığını konuşacağız.

netstat Nedir ve Neden Hala Kullanıyoruz?

netstat (Network Statistics), sistemdeki ağ bağlantılarını, yönlendirme tablolarını, arayüz istatistiklerini ve daha fazlasını görüntülemek için kullanılan klasik bir araçtır. Pek çok modern Linux dağıtımında ss komutu tercih edilir hale geldi, hatta bazı minimal kurulumlarda netstat artık varsayılan olarak gelmiyor. Ama şunu söyleyeyim: üretim ortamlarında onlarca farklı sistemle çalışıyorsanız, netstat‘ın hala yaygın olduğunu göreceksiniz. Eski RHEL/CentOS sistemleri, bazı gömülü Linux ortamları, eski kurumsal sunucular… Bunların hepsinde netstat var, ss yok. Bu yüzden her ikisini de bilmek gerekiyor.

netstat komutu net-tools paketinin parçasıdır. Eğer sisteminizde yoksa şu şekilde yükleyebilirsiniz:

# Debian/Ubuntu tabanlı sistemler
sudo apt install net-tools

# RHEL/CentOS/Fedora tabanlı sistemler
sudo yum install net-tools
# veya
sudo dnf install net-tools

Temel Kullanım ve Parametreler

Parametresiz çalıştırdığınızda netstat size aktif Unix soket bağlantılarını listeler. Çok da kullanışlı değil doğrusu. Asıl güç, parametreleri birleştirdiğinizde ortaya çıkıyor.

En sık kullandığım parametreler şunlar:

  • -t: Sadece TCP bağlantılarını gösterir
  • -u: Sadece UDP bağlantılarını gösterir
  • -l: Sadece dinleme (listening) durumundaki soketleri gösterir
  • -n: Adres ve port numaralarını sayısal formatta gösterir (DNS çözümlemesi yapmaz, çok daha hızlı)
  • -p: Bağlantıyı kullanan işlemi (PID ve program adı) gösterir
  • -a: Tüm bağlantıları gösterir (dinleme ve aktif olanlar dahil)
  • -r: Yönlendirme tablosunu gösterir
  • -i: Ağ arayüzü istatistiklerini gösterir
  • -s: Protokol bazında istatistikleri gösterir
  • -e: Genişletilmiş bilgi gösterir (kullanıcı adı dahil)
  • -c: Belirtilen aralıklarla sürekli günceller
  • -4: Sadece IPv4 bağlantılarını gösterir
  • -6: Sadece IPv6 bağlantılarını gösterir

Gerçek Dünyada Kullandığım Kombinasyonlar

Hangi Portlar Dinleniyor?

Bir sunucuya bağlandığınızda ilk yapmanız gereken şeylerden biri hangi servislerin hangi portlarda çalıştığını görmektir. Bu kombinasyonu ezbere bilmenizi tavsiye ederim:

sudo netstat -tlnp

Bu komut size TCP protokolüyle dinleme durumundaki tüm portları, sayısal formatta ve hangi process’e ait olduğuyla birlikte gösterir. -l olmadan çalıştırırsanız hem dinleme hem aktif bağlantıları görürsünüz, çoğu zaman ihtiyacınız olan sadece dinleme durumundakiler.

Örnek bir çıktı şöyle görünebilir:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1234/sshd
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      5678/mysqld
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      9012/nginx
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      9012/nginx

Burada MySQL’in sadece 127.0.0.1 üzerinde dinlediğini görmek önemli. Eğer 0.0.0.0:3306 görseydiniz, veritabanı dışarıya açık demekti, bu ciddi bir güvenlik sorunudur.

UDP Portlarını da Dahil Etmek

DNS, DHCP, SNMP gibi servisler UDP kullanır. Hem TCP hem UDP portlarını görmek için:

sudo netstat -tulnp

Aktif Bağlantıları İzlemek

Sunucunuza şu anda kimler bağlı? Özellikle web sunucularında veya SSH’da bu soruyu sık sık sorarsınız:

sudo netstat -tnp | grep ESTABLISHED

Belirli bir porta gelen bağlantıları filtrelemek için grep ile kombinleyebilirsiniz:

sudo netstat -tnp | grep :443

Bağlantı Durumlarını Anlamak

Çıktıda gördüğünüz State sütunundaki değerler ne anlama geliyor, bunu bilmeden netstat çıktısını yorumlamanız güç olur.

  • LISTEN: Soket yeni bağlantıları bekliyor
  • ESTABLISHED: Bağlantı kurulmuş ve aktif
  • TIME_WAIT: Bağlantı kapandı, ama TCP protokolü gereği bir süre daha bekliyor. Çok fazla TIME_WAIT görüyorsanız bu performans sorununa işaret edebilir
  • CLOSE_WAIT: Karşı taraf bağlantıyı kapattı, local taraf henüz kapatmadı. Çok fazla CLOSE_WAIT genellikle uygulamada bir bug olduğunu gösterir
  • SYN_SENT: Bağlantı kurulmaya çalışılıyor, SYN paketi gönderildi
  • SYN_RECV: SYN paketi alındı, bağlantı kurulma aşamasında
  • FIN_WAIT1 ve FIN_WAIT2: Bağlantı kapatma süreci devam ediyor
  • LAST_ACK: Son ACK bekleniyor
  • CLOSED: Bağlantı tamamen kapatıldı

Bağlantı durumlarına göre sayım yapmak için şu komutu kullanabilirsiniz:

netstat -tn | awk '{print $6}' | sort | uniq -c | sort -rn

Bu komut çıktısı size hangi durumda kaç bağlantı olduğunu gösterir ve bir anda durumu değerlendirmenizi sağlar.

Senaryo: DDoS veya Yük Testi Sonrası TIME_WAIT Patlaması

Bir e-ticaret sitesinde çalışırken yoğun trafik dönemlerinde sunucunun yavaşladığını fark ettik. netstat çıktısına baktığımızda binlerce TIME_WAIT bağlantısı görüyorduk:

netstat -tn | grep TIME_WAIT | wc -l

Bu sayı bazen 30.000’in üzerine çıkıyordu. Çözüm için kernel parametrelerini ayarlamak gerekti, ama önce sorunu tespit etmemizi sağlayan netstat oldu.

Benzer durumu kendiniz simüle etmek ve izlemek için:

# Bağlantı durumlarını canlı takip et
watch -n 1 'netstat -tn | awk "{print $6}" | sort | uniq -c | sort -rn'

IP Bazında Bağlantı Sayısı

Bir IP adresinin sunucunuza kaç bağlantısı var? Bu soruyu DDoS tespitinde veya aşırı istek yapan bir istemciyi bulmada çok kullanırsınız:

netstat -tn | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20

Bu komut size en çok bağlantısı olan 20 IP adresini sıralı olarak verir. Eğer bir IP’den onlarca ya da yüzlerce bağlantı görüyorsanız, bu ya bir uygulama problemi ya da kötü niyetli bir aktivite işaretidir.

Yönlendirme Tablosunu Görüntülemek

Ağ sorunlarında sıkça bakmanız gereken bir diğer şey routing tablosu. netstat -r veya daha okunaklı hali ile:

netstat -rn

Çıktı şuna benzer:

Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG        0 0          0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0

İlk satır default gateway’i gösteriyor. Eğer default gateway yoksa ya da yanlışsa, sunucunuz internete çıkamıyor demektir. Bu kadar basit ama yeni başlayan birçok sysadmin’in gözünden kaçar.

Ağ Arayüzü İstatistikleri

Bir ağ kartından ne kadar veri geçiyor, kaç paket düşürülüyor, kaç hata var? Bu soruların cevabı için:

netstat -i

Çıktıda göreceğiniz sütunlar:

  • RX-OK: Başarıyla alınan paket sayısı
  • RX-ERR: Hatalı alınan paket sayısı
  • RX-DRP: Düşürülen paket sayısı
  • TX-OK: Başarıyla gönderilen paket sayısı
  • TX-ERR: Hatalı gönderilen paket sayısı

Eğer RX-ERR veya RX-DRP sayıları yüksekse, ağ kartında veya ağ altyapısında ciddi bir sorun var demektir. Bu değerleri düzenli aralıklarla loglamak iyi bir pratiktir.

Protokol İstatistikleri

TCP, UDP, ICMP bazında ne kadar paket gönderilip alındı, kaç bağlantı kuruldu, kaç segment yeniden iletildi? Tüm bunları görmek için:

netstat -s

Bu komutun çıktısı oldukça uzun olabilir. Özellikle TCP istatistiklerine bakmak istiyorsanız:

netstat -s | grep -i tcp

Dikkat etmeniz gereken değerler:

  • segments retransmited: Yüksek yeniden iletim sayısı ağ kalitesinin düşük olduğunu gösterir
  • connection resets: Çok fazla reset, uygulama veya ağ sorunlarına işaret eder
  • packets received with error: Hatalı paket sayısı

Belirli Bir Processi İzlemek

Diyelim ki nginx’in tam olarak hangi bağlantıları tuttuğunu görmek istiyorsunuz:

sudo netstat -tlnp | grep nginx

Ya da PID’i biliyorsanız:

sudo netstat -tlnp | grep 1234

Bir servis ayarlarını değiştirdiniz ve yeni port üzerinden dinlemeye başlamasını bekliyorsunuz. Servisi yeniden başlatıp hemen kontrol edebilirsiniz:

sudo systemctl restart nginx && sudo netstat -tlnp | grep nginx

Senaryo: Hangi Uygulama Bu Portu Kullanıyor?

Klasik bir senaryo: Bir uygulamayı deploy etmeye çalışıyorsunuz ve “port already in use” hatası alıyorsunuz. O portu kim kullanıyor?

sudo netstat -tlnp | grep :8080

Çıktıda PID/Program sütununu göreceksiniz. Oradan işlemi bulup gerekli aksiyon alabilirsiniz. Kill etmeniz gerekiyorsa:

# Önce PID'i bul
sudo netstat -tlnp | grep :8080
# Sonra gerekirse durdur
sudo kill -9 <PID>

Bu senaryo ayda birkaç kez karşıma çıkar. Özellikle birden fazla ekibin aynı sunucuda çalıştığı ortamlarda.

Unix Domain Soketleri

Sadece ağ soketleri değil, Unix domain soketlerini de netstat ile görebilirsiniz:

netstat -lx

MySQL, PostgreSQL, PHP-FPM gibi servisler genellikle performans için Unix soketleri kullanır. Bir servisin soket dosyasının doğru yerde olup olmadığını kontrol etmek için bu komut kullanışlıdır.

Sürekli İzleme

-c parametresi ile netstat‘ı sürekli çalıştırabilirsiniz:

netstat -tnpc 2

Bu komut her 2 saniyede bir güncellenir. Ancak yoğun sunucularda bu biraz gürültülü olabilir. Alternatif olarak watch kullanmak daha kontrollü bir yaklaşım:

watch -n 2 'netstat -tnp | grep ESTABLISHED | wc -l'

Bu size her 2 saniyede aktif bağlantı sayısını gösterir.

netstat vs ss: Hangisini Kullanmalıyım?

Açıkçası, modern sistemlerde ss daha hızlı ve daha fazla özellik sunuyor. Büyük sunucularda binlerce bağlantı varken netstat yavaş kalabilir, ss çok daha hızlı çalışır çünkü /proc/net/tcp yerine doğrudan kernel’den veri alır.

ss ile eşdeğer komutlar:

  • netstat -tlnp yerine ss -tlnp
  • netstat -tn yerine ss -tn
  • netstat -s yerine ss -s

Ama şunu da söyleyeyim: Script yazarken veya eski sistemlerle çalışırken netstat sözdizimini bilmek hala değerli. İkisini de öğrenin, ortama göre kullanın.

Pratik Bir Monitoring Scripti

Şu küçük script, ağ durumunu periyodik olarak loglamak için kullanılabilir:

#!/bin/bash

LOG_FILE="/var/log/netstat_monitor.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

echo "=== $DATE ===" >> $LOG_FILE

echo "--- Aktif Baglantilar ---" >> $LOG_FILE
netstat -tn | awk '{print $6}' | sort | uniq -c | sort -rn >> $LOG_FILE

echo "--- En Cok Baglantisi Olan IP'ler ---" >> $LOG_FILE
netstat -tn | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10 >> $LOG_FILE

echo "--- Dinleme Durumundaki Portlar ---" >> $LOG_FILE
netstat -tlnp >> $LOG_FILE

echo "" >> $LOG_FILE

Bu script’i cron’a ekleyerek 5 dakikada bir çalıştırabilirsiniz:

*/5 * * * * /usr/local/bin/netstat_monitor.sh

Güvenlik Perspektifinden netstat

Sunucunuzda beklenmedik bir servis mi çalışıyor? Bir backdoor mı var? Bu soruları netstat ile hızlıca cevaplayabilirsiniz:

sudo netstat -tlnp

Çıktıda tanımadığınız bir port veya program adı görürseniz, acilen araştırın. Özellikle yüksek numaralı portlarda (örneğin 31337, 4444, 1337 gibi hack kültüründe bilinen portlar) dinleyen bir şey varsa, bu ciddi bir uyarı işaretidir.

Ayrıca şunu da kontrol edin: Bazı zararlı yazılımlar meşru process adları kullanır. PID değerini alıp /proc//exe ile gerçek binary’yi kontrol etmek iyi bir pratiktir:

ls -la /proc/<PID>/exe

Sonuç

netstat eski bir araç olabilir, ama ağ sorunlarını debug etmede hala çok değerli. Temel parametreleri ve kombinasyonlarını ezbere bilmek, bir sysadmin olarak verimliliğinizi ciddi şekilde artırır. Özellikle -tlnp, -tnp | grep ESTABLISHED, ve -s kombinasyonlarını günlük işlerinizde aktif kullanmaya başlamanızı öneririm.

Modern sistemlerde ss komutu daha performanslı olsa da, netstat‘ın hala yaşayan sistemlerde yeri var. Her iki komutu da öğrenin ve hangi ortamda ne kullanacağınızı bilin. Ağ sorunlarıyla karşılaştığınızda paniklemek yerine sistematik bir yaklaşımla netstat çıktılarını okumayı alışkanlık haline getirin. Zamanla bu çıktılar size hikayesini anlatmaya başlayacak.

Bir yanıt yazın

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