Kopya kâğıdı

Linux ağ komutları: ip, ss, ping, traceroute, dig ve curl ile ağ tanılama

Güncellendi: · Skillaria.Top

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örevKomut
Tüm arayüzlerin IP adresleriip -br addr
Arayüz durumu (UP/DOWN)ip -br link
Yönlendirme tablosuip route
Bir adrese paket hangi ağ geçidinden çıkarip route get 8.8.8.8
Komşular (ARP tablosu)ip neigh
Dinleyen portlar ve süreçlersudo ss -tulpn
Kurulu TCP bağlantılarıss -tn state established
Sunucunun erişilebilirliğini kontrol etmeping -c 4 example.com
Sunucuya paketlerin izlediği yoltraceroute example.com, mtr example.com
Ad çözümleme (isimden adrese)dig +short example.com
Belirli bir DNS sunucusuna sorgudig @1.1.1.1 example.com
HTTP yanıtını kontrol etmecurl -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:

BayrakAnlamı
-t / -uTCP / UDP
-lyalnızca dinleyen soketler
-psüreci göster (başkasının süreçleri için sudo gerekir)
-nportları ve adresleri isme çevirme
-akurulu 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?

KomutNe yapar
curl -I URLyalnızca başlıklar (HEAD isteği)
curl -v URLayrıntılı: DNS, bağlantı, TLS, başlıklar
curl -L URLyönlendirmeleri takip et
curl -o file URLdosyaya kaydet
curl -X POST -H 'Content-Type: application/json' -d '{"a":1}' URLJSON gönder
curl -k URLsertifikayı doğrulama (yalnızca hata ayıklama için)
curl --resolve site.ru:443:10.0.0.5 https://site.ruDNS'i atlayıp belirli bir sunucuya bağlan
curl -s -o /dev/null -w '%{http_code} %{time_total}\n' URLyanı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

  1. Arayüz ve adres: ip -br addr — arayüz UP, adres var.
  2. Ağ geçidi: ip route — default via satırı var mı; ping -c 3 <ağ geçidi>.
  3. IP ile dış ağ: ping -c 3 1.1.1.1. Çalışıyorsa yönlendirme sorunsuzdur.
  4. DNS: dig +short example.com. IP ile ping çalışırken boş sonuç veya hata varsa sorun çözümleyicidedir.
  5. Port: nc -zv host 443 veya curl -v. Sunucuda ss -tulpn ile servisin dinleyip dinlemediğine ve hangi adreste dinlediğine bakın.
  6. Güvenlik duvarı: sudo nft list ruleset, sudo iptables -L -n, sudo ufw status.
  7. Uygulama: curl -I ve 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ığı
ifconfigip addr, ip link
route -nip route
arp -nip neigh
netstat -tulpnss -tulpn
nslookupdig

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 konuyu videoyla öğrenin

Bu konu “Linux: с нуля до уверенного администрирования” kursunda uygulamalı olarak ayrıntılı işleniyor.

Kursa git