netstat ve ss Komutları ile Açık Port Tespiti
Bir sistem yöneticisi olarak günün birinde “bu sunucuda hangi portlar açık?” sorusunu sormak zorunda kalacaksın. Bu soru bazen bir güvenlik denetimi sırasında, bazen bir uygulama neden bağlanamıyor diye debug yaparken, bazen de gece 2’de üretim sunucusu çöktüğünde karşına çıkar. İşte tam bu noktada netstat ve ss komutları devreye girer. Bu iki araç, ağ bağlantılarını, açık portları ve soket durumlarını görüntülemek için Linux dünyasının en temel silahlarıdır.
netstat mi, ss mi?
Önce şunu netleştirelim: netstat eski nesil, ss ise modern nesil araçtır. netstat, net-tools paketinin bir parçasıdır ve pek çok modern dağıtımda artık varsayılan olarak kurulu gelmez. ss ise iproute2 paketine dahildir ve çok daha hızlıdır çünkü doğrudan kernel’in netlink arayüzüyle konuşur. Yani /proc dosya sistemini parse etmek yerine kernel’den direkt veri alır.
Ama şu gerçeği de kabul edelim: Production ortamında bazen eski sunucularla karşılaşırsın ve orada sadece netstat vardır. Bu yüzden her ikisini de öğrenmek zorundasın. Biz de her iki aracı paralel olarak ele alacağız.
netstat Komutuna Giriş
netstat hâlâ pek çok sysadmin’in aklına ilk gelen araçtır. Ubuntu veya Debian’da kurulu değilse şöyle yükleyebilirsin:
sudo apt install net-tools # Debian/Ubuntu
sudo yum install net-tools # CentOS/RHEL 7
sudo dnf install net-tools # Fedora/RHEL 8+
Temel netstat Kullanımı
En yaygın kullanım şekli şudur:
sudo netstat -tulpn
Bu komuttaki parametrelerin anlamları şöyle:
- -t: TCP soketlerini göster
- -u: UDP soketlerini göster
- -l: Sadece dinleme modundaki (LISTEN) soketleri listele
- -p: Her soketin hangi process’e ait olduğunu göster
- -n: İsimleri çözümleme; sayısal IP ve port göster (daha hızlı çalışır)
Çıktı şöyle görünür:
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
tcp6 0 0 :::80 :::* LISTEN 9012/nginx
tcp6 0 0 :::443 :::* LISTEN 9012/nginx
udp 0 0 0.0.0.0:68 0.0.0.0:* 1111/dhclient
Bu çıktıyı okumayı bilmek kritik. Local Address sütununda 0.0.0.0:22 görüyorsan, SSH tüm ağ arayüzlerinden bağlantı kabul ediyor demektir. 127.0.0.1:3306 görüyorsan MySQL sadece localhost’tan erişilebilir, bu iyi bir işaret. :::80 ise hem IPv4 hem IPv6 üzerinden 80. portun açık olduğunu gösterir.
Aktif Bağlantıları Görmek
Sadece dinleyen portları değil, aktif bağlantıları da görmek istersen:
sudo netstat -tupn
Burada -l parametresini kaldırdık. Bu sayede hem LISTEN hem de ESTABLISHED durumundaki bağlantıları görürsün. Hangisinin hangi uzak IP ile konuştuğunu takip etmek için harika bir yöntemdir.
Belirli Bir Porta Bakış
Diyelim ki sadece 443 portunu kimin kullandığını merak ediyorsun:
sudo netstat -tulpn | grep ':443'
Ya da 80 ve 443 portlarının ikisine birden bakmak istiyorsan:
sudo netstat -tulpn | grep -E ':(80|443)'
ss Komutuna Giriş
ss, Socket Statistics anlamına gelir. Modern Linux sistemlerinde netstat‘ın yerini almış durumdadır ve çok daha zengin filtreleme seçenekleri sunar.
Temel ss Kullanımı
netstat -tulpn ile eşdeğer ss komutu şudur:
sudo ss -tulpn
Parametreler neredeyse aynı:
- -t: TCP soketleri
- -u: UDP soketleri
- -l: Dinleme modundaki soketler
- -p: Process bilgisi
- -n: Sayısal format
Ama ss‘in gücü burada bitmiyor. Çok daha gelişmiş filtreleme yapabilirsin.
ss ile Filtreleme Sanatı
ss‘in en güçlü yanı, kendi içinde gelişmiş bir filtreleme dili sunmasıdır. Bunu dışarıdan grep kullanmak yerine direkt komutun içinde kullanabilirsin.
Belirli bir porta bak:
sudo ss -tulpn sport = :443
22 portunu dinleyen process’i bul:
sudo ss -tlnp '( dport = :22 or sport = :22 )'
Belirli bir durumu filtrele, mesela sadece ESTABLISHED bağlantıları listele:
sudo ss -tnp state established
Belirli bir IP adresinden gelen bağlantıları filtrele:
sudo ss -tnp dst 192.168.1.100
Bu filtreleme yetenekleri sayesinde binlerce satırlık çıktı yerine tam olarak istediğin bilgiye ulaşırsın.
Gerçek Dünya Senaryoları
Teorik bilgi güzel ama asıl mesele bunları hayatta ne zaman nasıl kullanacağını bilmek.
Senaryo 1: Güvenlik Denetimi
Yeni devir aldığın bir sunucu var ve hangi portların dışarıya açık olduğunu bilmiyorsun. İlk iş olarak şunu çalıştır:
sudo ss -tulpn | awk 'NR==1 || /LISTEN/'
Çıktıyı gördükten sonra her satırı tek tek değerlendir:
- Bu port açık olmalı mı?
- Bu servis bu sunucuda çalışmalı mı?
0.0.0.0yerine127.0.0.1dinlemesi gerekmiyorsa gerekli kısıtlamayı yap.
Örneğin Redis’in 0.0.0.0:6379‘dan dinlediğini görürsen bu ciddi bir güvenlik açığıdır. Redis’i sadece localhost’tan erişilebilir yapman ya da firewall kuralı eklemen gerekir.
Senaryo 2: “Uygulama Ayağa Kalkmıyor” Problemi
Bir developer sana gelir: “Uygulamamı başlattım ama bağlanamıyorum.” İlk kontrol noktası portu dinleyip dinlemediği:
sudo ss -tlnp | grep ':8080'
Eğer çıktı boşsa uygulama o portu dinlemiyor demektir. Ya başlatılamadı, ya farklı bir port dinliyor, ya da bind hatası aldı.
Eğer port dinleniyorsa ama bağlanamazsan firewall’u kontrol et:
sudo iptables -L INPUT -n --line-numbers | grep 8080
# ya da
sudo firewall-cmd --list-ports
Senaryo 3: Port Çakışması
Nginx başlatmaya çalışıyorsun ama “Address already in use” hatası alıyorsun. 80. portu kimin kullandığını bul:
sudo ss -tlnp sport = :80
Ya da fuser ile:
sudo fuser 80/tcp
PID’i bulduktan sonra:
ps aux | grep <PID>
Artık suçluyu buldun. Servis çakışmasını çözmek artık kolaylaşır.
Senaryo 4: Şüpheli Bağlantı Tespiti
Gece monitoring alarmı geldi, sunucu tuhaf davranıyor. Aktif dış bağlantılara bak:
sudo ss -tnp state established | grep -v '127.0.0.1|::1'
Ya da beklenmedik portlara bakış için:
sudo ss -tulpn | grep -v -E ':(22|80|443|3306|5432)' | grep LISTEN
Bu komut bilinen servis portları dışında açık olan her şeyi listeler. Burada tanımadığın bir şey görürsen hemen araştır.
İleri Seviye Kullanım Senaryoları
Bağlantı Sayısı İzleme
Bir web sunucusunda kaç aktif TCP bağlantısı olduğunu saymak:
sudo ss -tn state established | wc -l
Belirli bir uzak IP’den kaç bağlantı geldiğini bul. Bu DDoS tespitinde işe yarar:
sudo ss -tn state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20
Bu komut en çok bağlantı açan ilk 20 IP adresini listeler. Eğer tek bir IP’den yüzlerce bağlantı görüyorsan bu bir saldırı işareti olabilir.
TIME_WAIT Durumundaki Soketler
Yüksek trafikli sistemlerde TIME_WAIT soketleri birikerek sorun yaratabilir:
sudo ss -tn state time-wait | wc -l
sudo ss -tn state time-wait | head -20
Eğer bu sayı çok yüksekse kernel parametrelerini ayarlaman gerekebilir:
sudo sysctl net.ipv4.tcp_tw_reuse
sudo sysctl net.ipv4.tcp_fin_timeout
Unix Domain Soketleri
Bazen TCP değil Unix soketleriyle de ilgilenmen gerekir. MySQL, PHP-FPM ve pek çok uygulama Unix soket kullanır:
sudo ss -xlp
-x parametresi Unix domain soketlerini listeler. PHP-FPM’in bir soket üzerinden mi yoksa TCP üzerinden mi çalıştığını anlamak için kullanışlıdır.
Pratik Script Örnekleri
Günlük operasyonları kolaylaştırmak için küçük scriptler hazırlayabilirsin.
Açık portların anlık raporunu çıkaran basit bir script:
#!/bin/bash
# open_ports_report.sh
echo "=== Acik Portlar Raporu - $(date) ==="
echo ""
echo "--- Dinlenen TCP Portlari ---"
sudo ss -tlnp | grep LISTEN | awk '{print $4, $6}' | column -t
echo ""
echo "--- Dinlenen UDP Portlari ---"
sudo ss -ulnp | grep UNCONN | awk '{print $4, $6}' | column -t
echo ""
echo "--- Aktif TCP Baglanti Sayisi ---"
sudo ss -tn state established | wc -l
echo ""
echo "--- En Cok Baglanti Kuran IP Adresleri (Top 10) ---"
sudo ss -tn state established | awk 'NR>1 {print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10
Bu scripti cron ile çalıştırıp logunu saklayabilir, farklı zaman dilimlerindeki durumu karşılaştırabilirsin.
netstat ve ss Komutlarının Yan Yana Karşılaştırması
Aynı işi yapan komutları yan yana görmek öğrenmeyi kolaylaştırır:
- Tüm açık portları listele:
netstat -tulpn/ss -tulpn - Sadece TCP dinleyenleri göster:
netstat -tlnp/ss -tlnp - Aktif bağlantılar:
netstat -tnp/ss -tnp - Unix soketleri:
netstat -xlp/ss -xlp - Tüm soketler:
netstat -anp/ss -anp - Belirli porta filtrele:
netstat -tulpn | grep :80/ss -tulpn sport = :80
Sık Yapılan Hatalar
sudo Kullanmamak
sudo olmadan çalıştırılan ss veya netstat, process bilgilerini göstermez. -p parametresi çalışmaz. Her zaman sudo ile çalıştır.
-n Parametresini Atlamak
-n olmadan komut her port ve IP için DNS çözümlemesi yapar. Bu büyük sistemlerde dakikalar alabilir. Her zaman -n kullan.
Sadece Dinleyenlere Bakmak
Açık port dediğinde sadece LISTEN durumundakiler akla gelir ama asıl tehdit aktif ESTABLISHED bağlantılarda olabilir. Her ikisine de bakma alışkanlığı edin.
IPv6’yı Göz Ardı Etmek
Bir uygulama hem IPv4 hem IPv6 dinliyorsa bunu görmezden gelme. :::80 ifadesi IPv6 üzerinden 80. portun açık olduğunu gösterir ve bu dışarıdan erişilebilir demektir.
Diğer Araçlarla Entegrasyon
ss ve netstat çıktılarını başka araçlarla birleştirerek daha güçlü analizler yapabilirsin.
lsof ile doğrulama:
sudo lsof -i :443
sudo lsof -i TCP -s TCP:LISTEN
nmap ile dışarıdan doğrulama. Sunucunun dışından hangi portların görüldüğünü test etmek için:
nmap -sT -p 1-65535 <sunucu_ip>
nmap -sU -p 1-1000 <sunucu_ip> # UDP tarama
watch ile gerçek zamanlı izleme:
watch -n 2 'sudo ss -tnp state established | wc -l'
Bu komut her 2 saniyede bir aktif TCP bağlantı sayısını günceller. Yük testi sırasında veya bir incident anında bağlantı sayısının nasıl değiştiğini canlı takip edebilirsin.
Güvenlik Kararları İçin Port Analizi
Portları tespit etmek tek başına yeterli değil. Bu bilgiyi eylemle buluşturmak gerekiyor.
Bir portu gördüğünde şu soruları sor:
- Bu servisin bu sunucuda çalışması gerekiyor mu?
- Bu port dışarıya açık olmalı mı, yoksa sadece localhost’tan erişilebilir mi olmalı?
- Bu servisi çalıştıran kullanıcı kim ve gerekli en az yetkiyle mi çalışıyor?
- Bu servisin güvenlik güncellemeleri yapılmış mı?
Gereksiz açık her port bir saldırı yüzeyi demektir. Port minimizasyonu güvenliğin temel prensiplerinden biridir. Bir servis gerekmiyorsa durdur, durduramıyorsan firewall ile kısıtla.
Sonuç
netstat ve ss komutları, bir Linux sistem yöneticisinin günlük hayatında vazgeçilmez araçlardır. Güvenlik denetiminden sorun gidermeye, kapasite planlamasından incident response’a kadar pek çok senaryoda bu komutlara ihtiyaç duyarsın.
Modern sistemlerde ss‘i tercih etmek doğru bir seçimdir; daha hızlı, daha esnek ve daha zengin filtreleme yeteneklerine sahiptir. Ama netstat‘ı da aklından çıkarma, eski sistemlerde ya da kısıtlı ortamlarda hâlâ ihtiyacın olacak.
En önemli nokta şu: Bu araçları sadece problem çıktığında değil, düzenli olarak kullan. Sisteminizin “normal” durumunu bilmeden “anormal” durumu fark edemezsin. Haftalık ya da aylık açık port raporları oluştur, beklenmedik değişiklikleri takip et, güvenlik ekibiyle paylaş. Proaktif davranmak, yangını söndürmekten her zaman daha kolaydır.
