ip route Komutu ile Linux’ta Yönlendirme Tablosu Yönetimi

Ağ yönetiminin en kritik parçalarından biri, trafiğin nasıl yönlendirileceğini kontrol etmektir. Linux sistemlerde bu kontrolü sağlayan araçların başında ip route komutu gelir. Eski route komutunun modern ve güçlü halefi olan ip route, yönlendirme tablonuzu okumaktan karmaşık politika tabanlı yönlendirmeye kadar her şeyi yapmanıza imkan tanır. Bu yazıda ip route komutunu gerçek dünya senaryolarıyla birlikte derinlemesine inceleyeceğiz.

Yönlendirme Tablosu Nedir?

Bir Linux sunucusuna gelen veya sunucudan çıkan her paket, nereye gideceğini bulmak için yönlendirme tablosuna bakar. Bu tablo, “şu ağa gitmek istiyorsan şu arayüzden çık, şu gateway’i kullan” gibi kurallar içerir. Yanlış yapılandırılmış bir yönlendirme tablosu; erişilemeyen sunucular, kopuk VPN bağlantıları veya asimetrik trafik akışı gibi baş ağrısı sorunlarına yol açar.

ip route, iproute2 paketinin bir parçasıdır ve neredeyse tüm modern Linux dağıtımlarında varsayılan olarak yüklü gelir. Eski ifconfig ve route komutlarının aksine, ip komutu çok daha fazla özellik sunar ve kernel’in netlink arayüzüyle doğrudan iletişim kurar.

Temel Kullanım: Yönlendirme Tablosunu Okumak

Önce mevcut yönlendirme tablosuna bakalım:

ip route show
# veya kısaca
ip route
# veya ip r

Çıktı genellikle şuna benzer:

default via 192.168.1.1 dev eth0 proto dhcp src 192.168.1.100 metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100
10.0.0.0/8 via 10.10.0.1 dev eth1 proto static

Bu çıktıyı satır satır okuyalım:

  • default via 192.168.1.1: Başka bir kurala uymayan tüm trafik 192.168.1.1 gateway’ine gönderilir
  • dev eth0: Bu yönlendirme eth0 arayüzü üzerinden yapılır
  • proto dhcp: Bu route DHCP tarafından eklendi
  • src 192.168.1.100: Bu arayüzden çıkan paketlerin kaynak IP’si
  • metric 100: Öncelik değeri, düşük metric = daha yüksek öncelik
  • scope link: Direkt bağlı ağ, gateway gerekmez
  • proto kernel: Kernel tarafından otomatik eklendi

Daha ayrıntılı çıktı için:

ip route show table all

Bu komut, tüm yönlendirme tablolarını (main, local, default ve özel tablolar) gösterir.

Route Ekleme ve Silme İşlemleri

Statik Route Eklemek

Bir ağa statik route eklemek günlük sysadmin işlerinin olmazsa olmazıdır. Örneğin, 10.20.0.0/16 ağına ulaşmak için 192.168.1.254 gateway’ini kullanmak istiyorsunuz:

ip route add 10.20.0.0/16 via 192.168.1.254

Belirli bir arayüz üzerinden yönlendirmek için:

ip route add 10.20.0.0/16 via 192.168.1.254 dev eth0

Metric değeri belirleyerek öncelik atamak için:

ip route add 10.20.0.0/16 via 192.168.1.254 dev eth0 metric 200

Route Silmek

ip route del 10.20.0.0/16 via 192.168.1.254
# veya sadece hedef ağı belirterek
ip route del 10.20.0.0/16

Default Gateway Değiştirmek

Mevcut default gateway’i silip yenisini eklemek:

ip route del default
ip route add default via 192.168.1.1 dev eth0

Ya da tek seferde değiştirmek için replace kullanabilirsiniz:

ip route replace default via 192.168.1.1 dev eth0

replace komutu çok kullanışlıdır; route varsa günceller, yoksa ekler. Böylece “route already exists” hatasıyla boğuşmazsınız.

Belirli Bir IP İçin Route Sorgulamak

Bir paketin nereye gideceğini bulmak için ip route get kullanırsınız. Bu, troubleshooting’de altın değerindedir:

ip route get 8.8.8.8

Çıktı:

8.8.8.8 via 192.168.1.1 dev eth0 src 192.168.1.100 uid 1000
    cache

Bu çıktı size “8.8.8.8’e gitmek istiyorsan 192.168.1.1 üzerinden et0 arayüzünü kullan, kaynak IP olarak 192.168.1.100’ü kullan” der. Bunu eski route komutuyla yapmak çok daha zahmetliydi.

Belirli bir kaynak IP ile yönlendirmeyi sorgulamak için:

ip route get 10.0.0.1 from 192.168.2.100

Gerçek Dünya Senaryosu 1: Çoklu Ağ Kartı Olan Sunucu

Elimizde şöyle bir sunucu var: İki ağ kartı var, biri internet bağlantısı için (eth0), diğeri iç ağ için (eth1). İç ağdaki 172.16.0.0/12 adres aralığı eth1 üzerinden erişilebilir durumda.

# İnternet trafiği için default gateway
ip route add default via 203.0.113.1 dev eth0

# İç ağ trafiği eth1 üzerinden
ip route add 172.16.0.0/12 via 172.16.0.1 dev eth1

# Yönetim ağı için özel route
ip route add 10.100.0.0/24 via 172.16.0.254 dev eth1 metric 100

Şimdi 172.16.5.50’ye erişimin doğru arayüzden gidip gitmediğini kontrol edelim:

ip route get 172.16.5.50
# Çıktı: 172.16.5.50 via 172.16.0.1 dev eth1 ...

Gerçek Dünya Senaryosu 2: VPN Sonrası Route Yönetimi

OpenVPN veya WireGuard kurduğunuzda, VPN üzerinden sadece belirli ağlara gitmeyi isteyebilirsiniz. Split tunneling olarak bilinen bu yapı için:

# VPN arayüzü üzerinden sadece şirket ağlarına git
ip route add 10.0.0.0/8 dev tun0
ip route add 192.168.100.0/24 dev tun0

# Kritik sunucu için özel route
ip route add 10.50.1.0/24 via 10.8.0.1 dev tun0 metric 50

# İnternet trafiği normal yoldan devam etsin
# (default route değiştirilmez)

VPN bağlantısı kesildiğinde route’ları temizlemek için:

ip route del 10.0.0.0/8 dev tun0
ip route del 192.168.100.0/24 dev tun0

Kalıcı Route Yapılandırması

ip route add ile eklediğiniz route’lar geçicidir, sistem yeniden başladığında kaybolur. Bunları kalıcı hale getirmek için dağıtıma göre farklı yöntemler kullanırsınız.

Debian/Ubuntu Sistemlerde

/etc/network/interfaces dosyasına veya Netplan kullanıyorsanız /etc/netplan/ altındaki YAML dosyalarına eklersiniz:

# /etc/netplan/01-netcfg.yaml
# routes bölümünü interface tanımına ekleyin:
# routes:
#   - to: 10.20.0.0/16
#     via: 192.168.1.254
#     metric: 100

# Netplan yapılandırmasını uygulamak için:
netplan apply

RHEL/CentOS/Rocky Linux Sistemlerde

NetworkManager ile yönetilen sistemlerde:

# nmcli ile kalıcı route eklemek
nmcli connection modify eth0 +ipv4.routes "10.20.0.0/16 192.168.1.254"
nmcli connection up eth0

Ya da eski yöntemle /etc/sysconfig/network-scripts/route-eth0 dosyası oluşturabilirsiniz:

# /etc/sysconfig/network-scripts/route-eth0 içeriği:
10.20.0.0/16 via 192.168.1.254
172.16.0.0/12 via 172.16.0.1

Tüm Dağıtımlar İçin Evrensel Yöntem

/etc/rc.local dosyasına eklemek veya systemd servisi yazmak:

# /etc/systemd/system/static-routes.service
[Unit]
Description=Statik Route Yapılandirmasi
After=network.target

[Service]
Type=oneshot
ExecStart=/sbin/ip route add 10.20.0.0/16 via 192.168.1.254
ExecStart=/sbin/ip route add 172.16.0.0/12 via 172.16.0.1
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
systemctl enable static-routes.service
systemctl start static-routes.service

Policy Based Routing: İleri Seviye Yönlendirme

Birden fazla ISP bağlantısı olan veya kaynak IP’ye göre farklı gateway kullanmak istediğiniz durumlarda policy based routing devreye girer. Bu özellik ip rule ile birlikte kullanılır.

Senaryo: Sunucunuzun iki ISP bağlantısı var. eth0 ISP1 (1.2.3.4/24, gw: 1.2.3.1), eth1 ISP2 (5.6.7.8/24, gw: 5.6.7.1). ISP1’den gelen trafiğin ISP1’den çıkmasını, ISP2’den gelenlerin ISP2’den çıkmasını istiyorsunuz.

# Özel yönlendirme tabloları oluştur
echo "100 isp1" >> /etc/iproute2/rt_tables
echo "200 isp2" >> /etc/iproute2/rt_tables

# Her ISP için ayrı tablo tanımla
ip route add default via 1.2.3.1 table isp1
ip route add default via 5.6.7.1 table isp2

# Kaynak IP'ye göre kural ekle
ip rule add from 1.2.3.4 table isp1
ip rule add from 5.6.7.8 table isp2

# Kuralları kontrol et
ip rule show

Kural listesi şu şekilde görünür:

0:      from all lookup local
32765:  from 1.2.3.4 lookup isp1
32766:  from 5.6.7.8 lookup isp2
32767:  from all lookup main

Blackhole ve Unreachable Route’lar

Belirli bir ağa giden trafiği düşürmek veya ICMP hata mesajı döndürmek için özel route tipleri kullanılabilir. Bu özellik güvenlik ve trafik yönetimi açısından işe yarar.

# Blackhole: paketi sessizce düşür
ip route add blackhole 10.99.0.0/24

# Unreachable: ICMP "network unreachable" döndür
ip route add unreachable 10.88.0.0/24

# Prohibit: ICMP "communication administratively prohibited" döndür
ip route add prohibit 192.168.99.0/24

Blackhole route’lar, DDoS kaynaklarını veya kötü niyetli IP bloklarını engellemek için sıklıkla kullanılır. Firewall kuralı yazmaktan çok daha performanslıdır çünkü kernel seviyesinde, paket daha routing’e girmeden düşürülür.

Gerçek Dünya Senaryosu 3: Load Balancing

ip route, eşit maliyet çoklu yol (ECMP – Equal Cost Multi-Path) ile ilkel bir load balancing yapmanıza da olanak tanır:

# İki farklı gateway üzerinden yük dengeleme
ip route add default 
    nexthop via 192.168.1.1 dev eth0 weight 1 
    nexthop via 192.168.1.2 dev eth1 weight 1

Ağırlık değerlerini değiştirerek trafiği orantısal olarak dağıtabilirsiniz:

# eth0 üzerinden 3 kat daha fazla trafik gönder
ip route add default 
    nexthop via 192.168.1.1 dev eth0 weight 3 
    nexthop via 192.168.1.2 dev eth1 weight 1

Önemli not: ECMP, akış bazlı çalışır. Her paket için yük dengeleme yapmaz, her bağlantı için gateway seçer. Bu nedenle gerçek bir load balancer yerine geçmez ama bant genişliğini dağıtmak için kullanışlıdır.

Yönlendirme Tablosu Troubleshooting

En Sık Karşılaşılan Sorunlar

Asymmetric routing problemi: Paket bir gateway’den girer, başka bir gateway’den çıkar. Stateful firewall’larda bağlantı kopmalarına yol açar.

# Tüm arayüzler üzerindeki route'ları kontrol et
ip route show table all

# Belirli bir kaynaktan hedefe route'u sorgula
ip route get 8.8.8.8 from 10.0.0.5

# ARP tablosunu kontrol et (route doğru ama mac çözülemiyor olabilir)
ip neigh show

Route metric çakışması: Aynı ağa birden fazla route varsa metric değerleri önem kazanır.

# Hangi route'un aktif olduğunu görmek için
ip route show 10.0.0.0/8
# Birden fazla çıktı varsa en düşük metric kazanır

Geçici route kaybı: Sistem yeniden başladıktan sonra route’lar gitmiş. Yukarıda anlattığım kalıcı yapılandırma yöntemlerinden birini kullanmanız gerekiyor.

Faydalı Debug Komutları

# Tüm yönlendirme tablolarını görüntüle
ip route show table all

# Sadece belirli bir tabloyu görüntüle
ip route show table main
ip route show table local

# Route cache istatistikleri (eski kernellerde)
ip route show cache

# Arayüz istatistikleriyle birlikte
ip -s route

# JSON formatında çıktı (scripting için)
ip -j route show | python3 -m json.tool

ip route Parametreleri ve Seçenekleri

Komutun en çok kullanılan parametrelerini özetleyelim:

  • add: Yeni bir route ekler
  • del: Mevcut bir route’u siler
  • change: Var olan route’u değiştirir, yoksa hata verir
  • append: Var olsa da yeni route ekler
  • replace: Varsa günceller, yoksa ekler (en çok tercih edilen)
  • show / list: Yönlendirme tablosunu listeler
  • get: Belirli bir hedefe giden route’u gösterir
  • flush: Belirtilen kriterlere uyan tüm route’ları siler
  • via: Gateway IP adresi
  • dev: Çıkış arayüzü
  • src: Kaynak IP adresi tercihi
  • metric: Route öncelik değeri (düşük = yüksek öncelik)
  • table: Hangi yönlendirme tablosunun kullanılacağı
  • proto: Route protokolü (static, dhcp, kernel, bgp, ospf vb.)
  • scope: Route kapsamı (global, link, host)
  • onlink: Gateway doğrudan bağlı olmasa bile route ekler
  • nexthop: ECMP için sonraki atlama noktası tanımlar
  • weight: ECMP’de her nexthop’un ağırlığı

Senaryo 4: Konteyner ve Sanal Makine Ağ Yönetimi

Docker veya KVM kullandığınızda, konteynerlere/VM’lere özel ağlar tanımlamak gerekir:

# Docker bridge ağından dış dünyaya route
ip route add 172.17.0.0/16 dev docker0

# Belirli bir VM'in subnet'ine route (KVM/libvirt)
ip route add 192.168.122.0/24 dev virbr0

# VM'den container'a çapraz erişim için
ip route add 172.17.0.0/16 via 192.168.122.1 dev virbr0

# Route'un doğruluğunu test et
ip route get 172.17.0.5

Route Flush: Toplu Silme İşlemleri

Belirli kriterlere uyan tüm route’ları temizlemek için flush kullanılır:

# Belirli bir ağdaki tüm route'ları temizle
ip route flush 10.0.0.0/8

# Belirli bir arayüzdeki tüm route'ları temizle
ip route flush dev eth1

# Belirli bir protokolün eklediği route'ları temizle
ip route flush proto static

# Tüm cache'i temizle
ip route flush cache

Dikkat: ip route flush table main komutu tüm yönlendirme tablonuzu siler ve sistemi ağdan koparabilir. Uzak sunucularda çok dikkatli kullanın.

Sonuç

ip route komutu, Linux ağ yönetiminin bel kemiğini oluşturur. Basit bir statik route eklemekten policy based routing ve ECMP load balancing’e kadar geniş bir yelpazede işlev görür. Günlük işlerinizde en çok kullanacağınız komutlar şunlar olacak: ip route show ile tabloyu okumak, ip route get ile troubleshooting yapmak ve ip route add/del ile anlık müdahaleler yapmak.

Kalıcı yapılandırma konusuna özen gösterin; geçici route’lar sizi gecenin köründe “route neden gitti” sorusuyla uğraştırır. Dağıtımınıza uygun kalıcı yapılandırma yöntemini kullanın. NetworkManager ile yönetilen sistemlerde nmcli, Netplan kullanan sistemlerde YAML konfigürasyonu, eski RHEL tabanlı sistemlerde ise route- dosyaları tercih edilmelidir.

Son olarak şunu söylemek gerekir: ip route tek başına yeterli değildir. ip rule (policy routing), ip neigh (ARP yönetimi) ve ss veya netstat gibi araçlarla birlikte kullandığınızda gerçek gücünü ortaya koyar. Bu araç ailesini öğrenmek, ağ sorunlarını çok daha hızlı çözmenizi sağlar.

Yorum yapın