00 netstat vs ss — neden ss daha hızlı
netstat ve ss aynı bilgiyi döker. Ama farklı yollarla.
netstat, bilgiyi /proc/net/tcp, /proc/net/tcp6, /proc/net/udp gibi sanal dosyalar üzerinden okur. Kernel bu dosyaları her okumada sıfırdan oluşturur — binlerce soket varsa bu yavaştır.
ss (Socket Statistics), doğrudan kernel'ın Netlink socket API'sini kullanır. Kernel, socket bilgisini isteğe uygun filtreli olarak döner. Sonuç: binlerce socket'te netstat saniyeler alırken ss milisaniyeler alır.
# netstat — iproute2 paketi olmayan sistemlerde hâlâ yaygın
netstat -tlnp # TCP, listening, sayısal, process
netstat -an # tüm soketler, sayısal
netstat -rn # routing tablosu
# ss — modern, hızlı, zengin filtre
ss -tlnp # TCP, listening, sayısal, process
ss -an # tüm soketler, sayısal
# iproute2 paketi ile ss gelir
apt-get install iproute2
Busybox'ta ss mevcut ama sınırlıdır — filtre sözdizimi ve bazı flagler desteklenmeyebilir. Busybox netstat daha tutarlı çalışır. Hangi aracın ne desteklediğini cihaza özgü test et.
01 ss temel kullanım ve flagler
ss'in en sık kullanılan flaglerini ezberle — birkaç kombinasyon günlük işlerin %90'ını karşılar.
En sık kullanılan kombinasyonlar
# Hangi portlar dinleniyor? (En sık kullanılan)
ss -tlnp
# Tüm TCP bağlantıları (ESTABLISHED dahil)
ss -tnp
# UDP portları
ss -ulnp
# TCP + UDP hepsi
ss -tunlp
# Özet — kaç soket var toplamda
ss -s
# Timer bilgisi ile — TIME_WAIT ne zaman kapanacak
ss -tno
# Unix domain soketleri
ss -xlp
Çıktı formatı
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.1.10:22 192.168.1.5:54321 users:(("sshd",pid=1234,fd=3))
LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=5678,fd=6))
│ │ │ │ │ └─ sürec bilgisi (-p ile)
│ │ │ │ └─ karşı taraf (dinlemede ise *)
│ │ │ └─ yerel adres:port
│ │ └─ gönderi kuyruğu (0 idealdir, yükseğe dikkat)
│ └─ alma kuyruğu (0 idealdir)
└─ TCP durumu
02 Bağlantı durumları — TCP state machine
ss çıktısında her satırın State sütununu doğru oku. Yanlış durum sorun işaretidir.
Sorun belirtileri
Uygulama, karşı tarafın kapattığı soketi kapatmıyor. Bu bir kaynak sızıntısı (resource leak) işaretidir. Uygulamanın soket yönetim kodunu incele — close() çağrılmıyor olabilir.
Her TCP bağlantısı kapandıktan sonra 2×MSL (genellikle 60-120 saniye) TIME_WAIT'te bekler. Yüksek trafik sunucusunda bu normaldir ama port tükenmesine yol açabilir. net.ipv4.tcp_tw_reuse=1 sysctl değeri TIME_WAIT soketlerin yeniden kullanımını sağlar.
03 ss filtreleri — port, state, pid
ss, güçlü bir iç filtre dili sunar. Binlerce soket arasından sadece ilgilendiğini bul.
# Belirli porta ait bağlantılar (kaynak port)
ss -tnp 'sport = :80'
# Belirli hedefe giden bağlantılar (hedef port)
ss -tnp 'dport = :443'
# Belirli IP adresine bağlantılar
ss -tnp 'dst 8.8.8.8'
ss -tnp 'src 192.168.1.10'
# Yalnızca ESTABLISHED durumundakiler
ss -tnp state established
# Yalnızca TIME_WAIT durumundakiler
ss -tn state time-wait
# Tüm non-LISTEN durumundakiler
ss -tn '! state listen'
# Port 80'e ESTABLISHED bağlantı sayısı
ss -tn state established 'dport = :80' | wc -l
# Belirli PID'in soketleri (-p ile PID bilgisi alınır)
ss -tnp | grep 'pid=1234'
# 8000-9000 arasındaki portlarda dinleyenler
ss -tlnp 'sport >= :8000 and sport <= :9000'
ss filtresi şu operatörleri destekler: = != < > <= >=. Mantıksal: and, or, !. Adres: src, dst. State: state established, state listen vb.
04 ip komutu — addr, link, route, neigh
ip komutu (iproute2 paketi), eski ifconfig/route/arp üçlüsünün modern ve kapsamlı yerine geçenidir.
ip addr — IP adresleri
# Tüm interface'lerin IP adreslerini göster
ip addr
ip addr show # aynısı
ip addr show dev eth0 # sadece eth0
# Kısa format (sadece IPv4)
ip -4 addr show
# IP adresi ekle
sudo ip addr add 192.168.1.10/24 dev eth0
# IP adresi sil
sudo ip addr del 192.168.1.10/24 dev eth0
# İkincil IP adresi ekle (alias)
sudo ip addr add 192.168.1.20/24 dev eth0 label eth0:1
ip link — network interface'leri
# Tüm interface'leri listele
ip link show
ip link show eth0 # sadece eth0
# Sadece UP olan interface'ler
ip link show up
ip route — routing tablosu
# Routing tablosunu göster
ip route
ip route show
# Belirli bir hedefe hangi route kullanılır?
ip route get 8.8.8.8
# 8.8.8.8 via 192.168.1.1 dev eth0 src 192.168.1.10
ip neigh — ARP tablosu
# ARP tablosunu göster (komşu/neighbor cache)
ip neigh
ip neigh show dev eth0 # sadece eth0
# ARP girişi ekle (statik ARP)
sudo ip neigh add 192.168.1.1 lladdr aa:bb:cc:dd:ee:ff dev eth0
# ARP girişi sil
sudo ip neigh del 192.168.1.1 dev eth0
# ARP tablosunu temizle (tüm interface)
sudo ip neigh flush all
ip neigh çıktı durumları
05 ip ile interface yönetimi
ip link ile network interface'leri yönet — up/down, MTU, promiscuous mode ve daha fazlası.
# Interface aç / kapat
sudo ip link set eth0 up
sudo ip link set eth0 down
# MTU değerini değiştir
sudo ip link set eth0 mtu 9000 # Jumbo frame
sudo ip link set eth0 mtu 1500 # Standart Ethernet
# Promiscuous mode aç (tcpdump gibi araçlar için)
sudo ip link set eth0 promisc on
sudo ip link set eth0 promisc off
# MAC adresini değiştir
sudo ip link set eth0 down
sudo ip link set eth0 address 02:00:00:00:00:01
sudo ip link set eth0 up
# Multicast etkinleştir / devre dışı bırak
sudo ip link set eth0 multicast on
# TX queue uzunluğunu değiştir (gönderme kuyruğu)
sudo ip link set eth0 txqueuelen 1000
# Sanal interface (dummy) oluştur — test için
sudo ip link add dummy0 type dummy
sudo ip link set dummy0 up
sudo ip addr add 10.0.0.1/32 dev dummy0
# VLAN interface oluştur
sudo ip link add link eth0 name eth0.100 type vlan id 100
sudo ip link set eth0.100 up
Embedded sistemlerde özellikle VPN veya tunnel üzerinde çalışırken MTU uyumsuzluğu gizli bir sorun kaynağıdır. Büyük paketler parçalanır (fragmentation) veya PMTU Discovery başarısız olursa bağlantı kesilir. ping -s 1472 -M do gateway_ip ile path MTU'yu test et.
06 ip ile statik route yönetimi
ip route ile kernel routing tablosunu yönet — statik route ekle, sil, varsayılan gateway ayarla.
# Varsayılan gateway ekle
sudo ip route add default via 192.168.1.1
# Varsayılan gateway sil
sudo ip route del default via 192.168.1.1
# Belirli ağa statik route ekle
sudo ip route add 10.10.0.0/16 via 192.168.1.254
# Belirli interface üzerinden route
sudo ip route add 10.10.0.0/16 dev eth1
# Route sil
sudo ip route del 10.10.0.0/16 via 192.168.1.254
# Blackhole route — belirli ağa trafiği düşür (null route)
sudo ip route add blackhole 192.168.100.0/24
# Route metric (öncelik) ayarla — düşük metric önceliklidir
sudo ip route add default via 192.168.1.1 metric 100
sudo ip route add default via 10.0.0.1 metric 200 # yedek gateway
# Hangi route kullanılacak — tanılama
ip route get 10.10.0.1
# 10.10.0.1 via 192.168.1.254 dev eth0 src 192.168.1.10
Policy routing — birden fazla tablo
# İkinci routing tablosu oluştur (1-252 arası tablo ID)
sudo ip route add default via 10.0.0.1 table 200
# Kaynak IP'ye göre routing kural ekle
sudo ip rule add from 10.0.0.0/24 table 200
# Kuralları listele
ip rule show
07 Pratik: embedded network debug
Embedded cihazda ağ bağlantısı kesildi. Sistematik debug adımları.
Senaryo 1: Bağlantı kesilmesi
# 1. Interface durumu kontrol
ip link show eth0
# "DOWN" görüyorsan: ip link set eth0 up
# 2. IP adresi var mı?
ip addr show eth0
# Adres yoksa: DHCP çalışıyor mu? dhclient / udhcpc durumunu kontrol et
# 3. Default route var mı?
ip route show
# "default via ..." yoksa gateway ekle
# 4. Gateway'e ping
ping -c 3 192.168.1.1
# Ping başarısızsa: fiziksel bağlantı, kablo, switch
# 5. DNS çözümleme
ping -c 1 8.8.8.8 # IP ile dene (DNS bypass)
ping -c 1 google.com # DNS ile dene
# IP çalışıyor ama DNS değilse: /etc/resolv.conf kontrol et
# 6. ARP tablosunu kontrol et
ip neigh show
# Gateway'in ARP'ı FAILED ise: fiziksel katman sorunu
Senaryo 2: ARP storm tespiti
# ARP paket sayısını izle
sudo tcpdump -nn -i eth0 'arp' -l | \
awk '{count++; if(count % 100 == 0) print count " ARP packets"}'
# Saniyede 100+ ARP görüyorsan storm var
# ARP flood kaynağını bul
sudo tcpdump -nn -e -i eth0 'arp' -l | \
awk '{print $2}' | \
sort | uniq -c | sort -rn | head -5
# Sorunlu kaynağa statik ARP ekle (storm sonlandırır)
sudo ip neigh replace 192.168.1.50 lladdr aa:bb:cc:dd:ee:ff dev eth0 nud permanent
Senaryo 3: Route sorunu
# Hedef için route var mı?
ip route get 10.20.30.40
# "RTNETLINK answers: Network is unreachable" → route eksik
# Hangi interface üzerinden çıkıyor?
ip route get 10.20.30.40 | grep dev
# Route ekle ve test et
sudo ip route add 10.20.0.0/16 via 192.168.1.254
ping -c 3 10.20.30.40
# Traceroute ile hop'ları izle
traceroute 10.20.30.40
# Veya mtr ile:
mtr --report -n 10.20.30.40