Linux ağ komutları: ip, ss, ping, traceroute, dig ve curl ile ağ tanılama
Başlıca Linux ağ komutları — ip (adresler, arayüzler ve yönlendirme), ss (açık portlar ve bağlantılar), ping ve traceroute (bir sunucunun erişilebilirliği ve ona giden yol), dig (DNS kontrolü) ve curl (HTTP servislerine istek). Tanılama katman katman yapılır: arayüz ve adres, yönlendirme, DNS, port erişilebilirliği, uygulama yanıtı.
Linux ağ komutları günlük tanılamanın neredeyse tamamını karşılar: ip adresleri ve yönlendirmeleri gösterir, ss açık portları ve bağlantıları, ping ve traceroute bir sunucunun erişilebilirliğini kontrol eder, dig DNS'i, curl ise web servisinin yanıtını. Aşağıda bayrakların özeti ve "ağ çalışmıyor" durumunda nedeni bulmak için izlenebilecek adımlar var.
Özet tablo: Linux ağ komutları tek bakışta
| Görev | Komut |
|---|---|
| Tüm arayüzlerin IP adresleri | ip -br addr |
| Arayüz durumu (UP/DOWN) | ip -br link |
| Yönlendirme tablosu | ip route |
| Bir adrese paket hangi ağ geçidinden çıkar | ip route get 8.8.8.8 |
| Komşular (ARP tablosu) | ip neigh |
| Dinleyen portlar ve süreçler | sudo ss -tulpn |
| Kurulu TCP bağlantıları | ss -tn state established |
| Sunucunun erişilebilirliğini kontrol etme | ping -c 4 example.com |
| Sunucuya paketlerin izlediği yol | traceroute example.com, mtr example.com |
| Ad çözümleme (isimden adrese) | dig +short example.com |
| Belirli bir DNS sunucusuna sorgu | dig @1.1.1.1 example.com |
| HTTP yanıtını kontrol etme | curl -I https://example.com |
| Bağlantı ve TLS ayrıntıları | curl -v https://example.com |
| TCP portu açık mı | nc -zv host 443 |
| Sunucu adı | hostnamectl, hostname -I |
ip: adresler, arayüzler ve yönlendirme
ip komutu, iproute2 paketinden gelir ve eski ifconfig ile route komutlarının yerini almıştır. Alt komutlar kısaltılabilir: ip a = ip addr, ip r = ip route. -br bayrağı kısa çıktı verir, -c ise renklendirir.
$ ip -br addr
lo UNKNOWN 127.0.0.1/8 ::1/128
eth0 UP 192.168.1.25/24 fe80::a00:27ff:fe4e:66a1/64
docker0 DOWN 172.17.0.1/16
Arayüzde gerekli ağa ait adres yoksa veya arayüz DOWN durumundaysa, sorun bu katmanda demektir ve daha ileri bakmaya gerek yoktur.
IP adresi ekleme ve arayüzü açma
sudo ip link set eth0 up
sudo ip addr add 192.168.1.50/24 dev eth0
sudo ip addr del 192.168.1.50/24 dev eth0
ip ile yapılan değişiklikler yeniden başlatmaya kadar geçerlidir. Kalıcı ayarlar sistem yapılandırmasında tutulur: Ubuntu'da netplan, Fedora ve RHEL'de NetworkManager (nmcli), sunucularda systemd-networkd.
Yönlendirme ve varsayılan ağ geçidi
$ ip route
default via 192.168.1.1 dev eth0 proto dhcp metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.25
$ ip route get 10.20.0.5
10.20.0.5 via 192.168.1.1 dev eth0 src 192.168.1.25 uid 1000
default via satırı, daha belirli bir yönlendirmeye uymayan her şeyin gideceği ağ geçididir. Bu satır yoksa yerel ağ çalışsa bile internet olmaz. Yönlendirme eklemek için: sudo ip route add 10.20.0.0/16 via 192.168.1.254.
ss: hangi portlar açık ve onları kim dinliyor
ss, netstat'in yerini almıştır ve daha hızlı çalışır. En sık kullanılan kombinasyon ss -tulpn'dir:
| Bayrak | Anlamı |
|---|---|
-t / -u | TCP / UDP |
-l | yalnızca dinleyen soketler |
-p | süreci göster (başkasının süreçleri için sudo gerekir) |
-n | portları ve adresleri isme çevirme |
-a | kurulu bağlantılar dahil tüm soketler |
-s | özet istatistik |
$ sudo ss -tulpn
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=812,fd=6))
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=640,fd=3))
tcp LISTEN 0 151 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=901,fd=21))
Adrese dikkat edin: 0.0.0.0 servisin tüm arayüzlerden bağlantı kabul ettiği anlamına gelir, 127.0.0.1 ise yalnızca yerel bağlantı kabul ettiği anlamına gelir. Veritabanının başka bir makineden "yanıt vermemesinin" sık nedeni budur.
Portu kimin kullandığını bulma
sudo ss -ltnp 'sport = :8080'
sudo ss -tn dst 10.0.0.7 # belirli bir adrese bağlantılar
ss -tan state time-wait | wc -l # TIME-WAIT durumundaki soket sayısı
ping: düğüm erişilebilir mi
ping, ICMP echo istekleri gönderir ve yanıt süresini ile paket kaybını gösterir. Linux'ta sonsuza kadar çalışır, bu yüzden paket sayısını -c ile belirleyin.
$ ping -c 4 8.8.8.8
64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=12.4 ms
...
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 12.1/12.5/13.0/0.3 ms
Kullanışlı bayraklar: -i 0.2 — aralık, -W 2 — yanıt zaman aşımı, -4/-6 — protokol sürümü, -s 1472 -M do — parçalanma olmadan MTU kontrolü. Birçok sunucu ve bulut ICMP'yi engeller: ping yanıtının olmaması, düğümün erişilemez olduğu anlamına gelmez.
traceroute ve mtr: paketler nerede kayboluyor
traceroute, hedefe giden yoldaki düğümleri gösterir. Bazı atlamalarda yıldız (*) görmek normaldir: ara yönlendirici yanıt vermiyor olabilir. Asıl uyarı işareti, bir atlamadan sonra tüm satırların yıldız olmasıdır.
traceroute -n example.com # DNS isimleri olmadan, daha hızlı
sudo traceroute -T -p 443 example.com # UDP yerine TCP, güvenlik duvarlarından geçer
tracepath example.com # root gerektirmez, ayrıca MTU'yu gösterir
mtr, ping ile traceroute'u birleştirir ve her atlama için kayıp istatistiğini gerçek zamanlı günceller. Rapor için: mtr -rwc 50 example.com.
dig: DNS kontrolü
dig, dnsutils paketinden gelir (RHEL'de bind-utils) ve DNS kontrolünün başlıca aracıdır. Kısa biçim yalnızca yanıtı döndürür:
$ dig +short example.com
93.184.215.14
$ dig example.com MX +short
$ dig @8.8.8.8 example.com A # belirli bir sunucuya sor
$ dig -x 8.8.8.8 +short # ters kayıt (PTR)
$ dig +trace example.com # kök sunuculardan başlayarak zinciri izle
Tam çıktıda status alanına bakın: NOERROR — kayıt bulundu, NXDOMAIN — alan adı yok, SERVFAIL — sunucu yanıt veremedi (çoğunlukla DNSSEC sorunu veya yetkili sunucuya erişilememesi). dig @8.8.8.8 yanıt verip normal dig vermiyorsa, sorun yerel çözümleyicidedir: /etc/resolv.conf ve resolvectl status komutlarını kontrol edin.
dig, /etc/hosts dosyasını okumaz. Bir adın uygulamanın göreceği şekilde çözülüp çözülmediğini görmek için getent hosts example.com kullanın.
curl: HTTP ve API kontrolü
curl, son soruya cevap verir: servis yanıt veriyor mu ve tam olarak ne döndürüyor?
| Komut | Ne yapar |
|---|---|
curl -I URL | yalnızca başlıklar (HEAD isteği) |
curl -v URL | ayrıntılı: DNS, bağlantı, TLS, başlıklar |
curl -L URL | yönlendirmeleri takip et |
curl -o file URL | dosyaya kaydet |
curl -X POST -H 'Content-Type: application/json' -d '{"a":1}' URL | JSON gönder |
curl -k URL | sertifikayı doğrulama (yalnızca hata ayıklama için) |
curl --resolve site.ru:443:10.0.0.5 https://site.ru | DNS'i atlayıp belirli bir sunucuya bağlan |
curl -s -o /dev/null -w '%{http_code} %{time_total}\n' URL | yanıt kodu ve süre |
$ curl -s -o /dev/null -w '%{http_code} %{time_connect} %{time_total}\n' https://example.com
200 0.041 0.187
curl'ün hata mesajları hangi katmanda sorun olduğunu iyi gösterir: Could not resolve host — DNS, Connection refused — port kapalı veya dinleyen yok, Connection timed out — paketleri güvenlik duvarı kesiyor veya yönlendirme yok, SSL certificate problem — sertifika sorunu.
Tanılama sırası: "ağ çalışmıyor" durumunda
- Arayüz ve adres:
ip -br addr— arayüz UP, adres var. - Ağ geçidi:
ip route—default viasatırı var mı;ping -c 3 <ağ geçidi>. - IP ile dış ağ:
ping -c 3 1.1.1.1. Çalışıyorsa yönlendirme sorunsuzdur. - DNS:
dig +short example.com. IP ile ping çalışırken boş sonuç veya hata varsa sorun çözümleyicidedir. - Port:
nc -zv host 443veyacurl -v. Sunucudass -tulpnile servisin dinleyip dinlemediğine ve hangi adreste dinlediğine bakın. - Güvenlik duvarı:
sudo nft list ruleset,sudo iptables -L -n,sudo ufw status. - Uygulama:
curl -Ive servis günlükleri (journalctl -u nginx).
Adımları alttan yukarı izleyin ve hiçbirini atlamayın: birkaç dakika içinde sorunun hangi katmanda olduğunu bulursunuz; her şeyi baştan yeniden başlatmanız gerekmez.
Eski ve yeni komutlar
| Eski (net-tools) | Modern karşılığı |
|---|---|
ifconfig | ip addr, ip link |
route -n | ip route |
arp -n | ip neigh |
netstat -tulpn | ss -tulpn |
nslookup | dig |
Yeni dağıtımlarda net-tools çoğu zaman hiç kurulu değildir; yeni komutlara alışmak en iyisidir.
Sonuç
Günlük tanılama için altı Linux ağ komutu yeterlidir: ip, ss, ping, traceroute, dig ve curl. Katman katman ilerleyin — adres, yönlendirme, DNS, port, uygulama — ve sorunu hızlıca bulun. Ağ komutları ve tipik arızaların incelenmesi kurstaki Linux uygulamalarında ele alınır.
Sık sorulan sorular
Sistemde neden ifconfig komutu yok?
Bu komut, modern dağıtımlarda varsayılan olarak kurulmayan eski net-tools paketinin parçasıdır. ip addr kullanın veya net-tools'u elle kurun.
Komut satırından dış IP adresimi nasıl öğrenirim?
curl ifconfig.me veya curl -4 icanhazip.com komutunu çalıştırın; dış bir servis internete çıkarken kullandığınız adresi döndürür. ip addr yalnızca arayüzlerin adreslerini gösterir, bunlar genellikle iç ağa aittir.
ping ile port kontrolü arasındaki fark nedir?
ping, düğümün ICMP ile erişilebilir olup olmadığını kontrol eder ama belirli bir servis hakkında bilgi vermez. Sunucunun bir porta bağlantı kabul edip etmediğini görmek için nc -zv host port veya curl kullanın.
Bir ağ arayüzünün hızını ve yükünü nasıl görürüm?
Bayt ve hata sayaçlarını ip -s link gösterir; anlık yükü iftop, nload veya bmon gibi araçlar gösterir. İki makine arasındaki bant genişliğini iperf3 ile ölçersiniz.
DNS sunucusunu geçici olarak nasıl değiştiririm?
systemd-resolved kullanan sistemlerde sudo resolvectl dns eth0 1.1.1.1 komutunu çalıştırın. Tek seferlik bir sorgu için sunucuyu doğrudan istekte belirtmek daha kolaydır: dig @1.1.1.1 example.com.
Bu konu “Linux: с нуля до уверенного администрирования” kursunda uygulamalı olarak ayrıntılı işleniyor.
Kursa git