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.