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 -tlnpyeriness -tlnpnetstat -tnyeriness -tnnetstat -syeriness -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.
