BIRD ve birdc ile Linux’ta Dinamik Yönlendirme Protokolleri (BGP/OSPF) Yapılandırması ve Yönetimi

Büyük bir altyapı yönetirken en çok canımı sıkan şeylerden biri statik route’larla boğuşmaktı. Bir sunucu eklendiğinde, bir link değiştiğinde ya da bir data center taşındığında, elle yüzlerce route güncellemek… Bu tam anlamıyla bir kabus. BIRD ile tanışmam tam da bu noktada oldu ve o günden bu yana dinamik yönlendirme protokollerini Linux üzerinde yönetmek için başka bir araca ihtiyaç duymadım.

BIRD (BIRD Internet Routing Daemon), Linux ve diğer Unix sistemlerde BGP, OSPF, RIP gibi routing protokollerini çalıştırmanızı sağlayan açık kaynaklı, üretim kalitesinde bir routing daemon’ıdır. ISP’lerin, hosting firmaların ve büyük kurumsal ağların vazgeçilmezi haline gelmiştir. birdc ise BIRD’ün kontrol arayüzü, yani sizin CLI’dan daemon’a konuşmanızı sağlayan araç.

Bu yazıda gerçek dünyadan senaryolarla hem BIRD kurulumunu, hem BGP hem de OSPF yapılandırmasını, hem de birdc ile günlük yönetim operasyonlarını ele alacağız.

BIRD Kurulumu

Çoğu modern dağıtımda BIRD paket depolarında hazır gelir. Debian/Ubuntu ailesi için:

apt update && apt install bird2 -y

Red Hat/CentOS/Rocky Linux için:

dnf install bird -y

Kurulumdan sonra servis durumunu kontrol edelim:

systemctl status bird
systemctl enable bird

BIRD 2.x ile 1.x arasında önemli farklar var. BIRD 2 hem IPv4 hem IPv6’yı tek bir daemon altında yönetiyor. Eski BIRD 1.x’te bird ve bird6 ayrı servislerdi. Eğer üretim ortamınızda hâlâ 1.x kullanıyorsanız, mümkün olan ilk fırsatta geçişi yapmanızı tavsiye ederim. Konfigurasyon sözdizimi biraz değişiyor ama kazanımlar çok daha büyük.

Ana konfigürasyon dosyası /etc/bird/bird.conf konumundadır. Her şey buradan yönetilir.

Temel BIRD Konfigürasyon Yapısı

BIRD konfigürasyonu birkaç ana bloktan oluşur. Önce genel bir yapıya bakalım:

cat /etc/bird/bird.conf

Örnek minimal bir yapılandırma:

# Router kimliği - genellikle loopback IP'si kullanılır
router id 10.0.0.1;

# Log seviyesi
log syslog all;

# Protocol tanımları
protocol device {
    scan time 10;
}

protocol direct {
    ipv4;
    ipv6;
}

protocol kernel {
    ipv4 {
        export filter {
            if net ~ [0.0.0.0/0] then reject;
            accept;
        };
    };
    learn;
}

Burada protocol kernel bloğu kritik. BIRD’ün öğrendiği route’ları Linux kernel routing tablosuna yazmasını sağlar. learn direktifi de kernel’daki mevcut route’ları BIRD’ün öğrenmesine izin verir. Export filter’da default route’u reddediyoruz ki kernel tablosunu kirletmeyelim.

protocol device ise BIRD’ün network interface’lerini görmesini sağlar. Bunu koymadan hiçbir şey çalışmaz, genellikle unutulan ama can sıkan bir detaydır.

OSPF Yapılandırması

OSPF, aynı AS (Autonomous System) içindeki router’lar arasında kullanılan bir iç yönlendirme protokolüdür. Küçük-orta ölçekli ağlarda veya bir data center içinde son derece kullanışlıdır.

Senaryo: Üç farklı sunucumuz var, hepsi aynı veri merkezinde. Bu sunucular arasındaki /32 loopback adreslerini ve bağlı ağları dinamik olarak öğrenmesini istiyoruz.

# /etc/bird/bird.conf içine eklenecek OSPF bloğu

protocol ospf v2 OSPF_INTERNAL {
    area 0.0.0.0 {
        interface "eth0" {
            type broadcast;
            hello 10;
            retransmit 5;
            cost 10;
            wait 40;
            dead 40;
        };
        interface "lo" {
            stub;
        };
    };

    ipv4 {
        import all;
        export filter {
            if source = RTS_STATIC then accept;
            if source = RTS_DEVICE then accept;
            reject;
        };
    };
}

Burada stub interface olarak tanımlanan loopback, OSPF neighbor ilişkisi kurmadan sadece prefix olarak duyurulur. type broadcast ise Ethernet segmentlerinde kullanılır ve DR/BDR seçimi yapar.

Export filter’da sadece statik ve device route’ları dışarı veriyoruz. Bunu daraltmazsanız, OSPF’ten öğrendiğiniz route’ları tekrar OSPF’e inject edersiniz ve bu routing döngülerine yol açabilir.

Konfigürasyonu uyguladıktan sonra BIRD’ü yeniden yükleyelim:

birdc configure
# veya
systemctl reload bird

birdc configure tercih edilmeli çünkü servis yeniden başlatmadan konfigürasyon yüklenir. Üretim ortamında routing kesintisi yaratmadan yapabilmek çok değerlidir.

BGP Yapılandırması

BGP, internetteki AS’lar arasındaki yönlendirme protokolüdür. Hem upstream ISP bağlantısı hem de iBGP (internal BGP) için kullanılır.

eBGP: ISP ile Bağlantı

Senaryo: Bir ISP’den IP bloğumuz var ve bu bloğu BGP ile duyurmamız gerekiyor. ISP’nin ASN’i 65001, bizimki 65100.

# BGP için önce AS numaramızı tanımlıyoruz
define MY_ASN = 65100;
define MY_PREFIX = 203.0.113.0/24;

protocol bgp UPSTREAM_ISP {
    local as MY_ASN;
    neighbor 192.0.2.1 as 65001;

    ipv4 {
        import filter {
            # Sadece default route'u kabul et
            if net = 0.0.0.0/0 then accept;
            reject;
        };

        export filter {
            # Sadece kendi prefix'imizi duyur
            if net = MY_PREFIX then accept;
            reject;
        };
    };

    hold time 90;
    keepalive time 30;
}

Bu yapılandırmada ISP’den sadece default route alıyoruz ve ona sadece kendi /24 bloğumuzu duyuruyoruz. Gerçek dünyada bu kadar sade olmaz tabii; route-map benzeri filtreleme, community tagging, prepend stratejileri gündeme girer. Ama temel yapı bu şekilde.

iBGP: Data Center İçi Route Yayılımı

Büyük ortamlarda aynı AS içindeki router’lar arasında iBGP kullanılır. Route Reflector mimarisi burada devreye girer:

protocol bgp ROUTE_REFLECTOR {
    local as MY_ASN;
    neighbor 10.0.0.254 as MY_ASN;

    # Route Reflector Client olarak işaretliyoruz
    rr client;

    ipv4 {
        import all;
        export all;
    };

    next hop self;
}

next hop self direktifi iBGP’de kritik. iBGP’de next-hop değiştirilmez, bu yüzden client’ların erişemediği next-hop adresleri alabiliriz. next hop self bunu çözer.

birdc ile Yönetim ve İzleme

birdc BIRD’ün kontrol soketi üzerinden çalışır. Gerçek zamanlı durum görmek, route tablosunu sorgulamak ve debugging yapmak için ana aracınız.

Temel Durum Kontrolü

# Tüm protokollerin durumunu göster
birdc show protocols

# Belirli bir protokolün detayları
birdc show protocols UPSTREAM_ISP

# OSPF komşularını listele
birdc show ospf neighbors

show protocols çıktısında her protokolün durumunu (up/down/start) ve ne zamandan beri aktif olduğunu görürsünüz. BGP session’ı düştüğünde, OSPF komşuluğu kesildiğinde ilk bakacağınız yer burası.

Route Tablosu Sorgulama

# Tüm route tablosunu göster
birdc show route

# Belirli bir prefix'i ara
birdc show route for 203.0.113.0/24

# Protokole göre filtrele
birdc show route protocol UPSTREAM_ISP

# Daha detaylı çıktı için
birdc show route all

show route all çıktısı BGP attribute’larını da gösterir: AS path, MED, local preference, communities. Bir route neden tercih edilmiyor sorusunu cevaplamak için bu komut çok işe yarar.

BGP Oturumu Yönetimi

Bazen bir BGP session’ını elle yeniden başlatmak gerekir. Yeni bir filtre uyguladınız, karşı tarafla policy değişikliği yaptınız gibi durumlar:

# BGP session'ı yeniden başlat
birdc disable UPSTREAM_ISP
birdc enable UPSTREAM_ISP

# Soft reset - session'ı kesmeden route'ları yeniden değerlendir
birdc reload UPSTREAM_ISP

# Sadece import veya export tarafını resetle
birdc reload in UPSTREAM_ISP
birdc reload out UPSTREAM_ISP

reload ile restart arasındaki fark çok önemli. reload BGP session’ını kesmeden route’ları yeniden işler. Üretimde bunu tercih edin. Session kapanırsa, yeniden açılana kadar (genellikle saniyeler içinde olsa da) trafik kesintisi yaşanabilir.

OSPF Debugging

# OSPF veritabanını göster
birdc show ospf database

# OSPF interface durumu
birdc show ospf interface

# OSPF topology
birdc show ospf topology

# Belirli bir area için
birdc show ospf topology area 0.0.0.0

show ospf database çıktısından LSA (Link State Advertisement) bilgilerini inceleyebilirsiniz. İki router arasında OSPF ilişkisi kurulmuyor, sürekli ExStart/Exchange durumunda kalıyor gibi problemlerde buraya bakın. MTU mismatch en yaygın sebeplerden biridir, bunu da unutmayın.

Gerçek Dünya Senaryosu: Anycast DNS Altyapısı

Birçok lokasyonda aynı IP adresini duyurarak en yakın sunucuya yönlendirme yapan anycast, BGP ile kolayca kurulabilir. Örneğin DNS sunucularınızın 192.0.2.100/32 adresini birden fazla PoP’tan duyurmasını istiyorsunuz:

# Statik route tanımı
protocol static ANYCAST_ROUTES {
    ipv4;
    route 192.0.2.100/32 blackhole;
}

# Bu route'u BGP ile duyur
protocol bgp POP_ISTANBUL {
    local as 65100;
    neighbor 10.1.0.1 as 65100;
    next hop self;

    ipv4 {
        import none;
        export filter {
            if proto = "ANYCAST_ROUTES" then accept;
            reject;
        };
    };
}

Burada blackhole route ilginç bir detay. BIRD’ün bu prefix’i kernel’a blackhole olarak yazmasını sağlar. Asıl servis loopback’te dinliyor olacak, kernel onu doğru yere iletecek. BGP’ye sadece “bu prefix bende var” diyoruz, gerçek trafik yönlendirmesini kernel halleder.

Filtre Sistemi: BIRD’ün Güçlü Silahı

BIRD’ün filter dili oldukça güçlü. BGP community’lerine göre route kabul/reddetmek, local preference ayarlamak, prepend yapmak hepsi filter’larla yapılır:

# Filter tanımı
filter BGP_IN_FILTER {
    # Blackhole community'si taşıyan route'ları reddet
    if (65100, 666) ~ bgp_community then reject;

    # /24'ten uzun prefix'leri reddet (prefix hijack koruması)
    if net.len > 24 then reject;

    # Default route'u özel işle
    if net = 0.0.0.0/0 then {
        bgp_local_pref = 100;
        accept;
    }

    accept;
}

# Kullanımı
protocol bgp PEER_1 {
    ipv4 {
        import filter BGP_IN_FILTER;
        export all;
    };
}

Prefix uzunluğu kontrolü gerçek dünyada çok önemli. /25 ve daha uzun prefix’leri accept etmemelisiniz, yoksa route hijacking saldırılarına açık kalırsınız. Birçok ISP de zaten bu uzunluktaki prefix’leri filtreler.

Loglama ve Sorun Giderme

BIRD loglarını takip etmek için:

# Syslog üzerinden
journalctl -u bird -f

# BIRD'ün kendi debug mekanizması
birdc debug UPSTREAM_ISP all

# Debug'ı kapat
birdc debug UPSTREAM_ISP off

# Sadece belirli event'leri debug et
birdc debug UPSTREAM_ISP { events, states }

debug all üretimde dikkatli kullanın. Yoğun bir BGP session’ında log’lar çok hızlı büyür ve disk dolabilir. Problemi tespit ettikten sonra mutlaka kapatın.

Bir BGP session neden açılmıyor sorusunu araştırırken şu sırayı takip ederim:

  • TCP bağlantısı kuruluyor mu? (ss -tn | grep 179)
  • OPEN mesajları değiş tokuş ediliyor mu? (debug events ile bakılır)
  • Hold time ve keepalive değerleri uyuşuyor mu?
  • AS numaraları doğru mu?
  • MD5 authentication kullanılıyorsa key uyuşuyor mu?
# BGP port kontrolü
ss -tnlp | grep 179

# Neighbor'a TCP bağlantısı test et
telnet 192.0.2.1 179

Konfigürasyon Dosyası Yönetimi

Büyük ortamlarda tek bir bird.conf yerine include mekanizması kullanmak hayat kurtarır:

# Ana bird.conf
router id 10.0.0.1;
log syslog all;

include "/etc/bird/protocols/*.conf";
include "/etc/bird/filters/*.conf";

Her protokol için ayrı dosya, her filter seti için ayrı dosya. Git ile versiyonlayın. Bir değişiklik öncesi her zaman:

# Konfigürasyonu test et (uygulamadan)
bird --config /etc/bird/bird.conf --dry-run

# Ya da birdc ile
birdc configure check

configure check komutu konfigürasyonun sözdizimini ve semantiğini doğrular ama uygulamaz. Bu komutu kullanmayı alışkanlık haline getirin.

Sonuç

BIRD, Linux’ta production-grade dinamik yönlendirme için en olgun ve güvenilir çözümlerden biri. Özellikle BIRD 2.x ile gelen tek daemon altında IPv4/IPv6 yönetimi, büyük altyapılarda operasyonel yükü ciddi ölçüde azaltıyor.

birdc ise bu daemon’ın beyniyle konuşmanızı sağlayan araç. Route debugging’den BGP session yönetimine, OSPF topoloji görüntülemesine kadar her şey birdc üzerinden halledilebiliyor. Komutları ezberlemek yerine hangi senaryoda neye bakmanız gerektiğini bilmek asıl beceri.

Öğrenme eğrisi biraz dik, konfigürasyon dili alışılana kadar biraz karmaşık gelebilir. Ama test ortamında GNS3 veya EVE-NG ile birkaç senaryo kurarak pratik yaparsanız, kısa sürede production’a geçiş için kendinize güvenirsiniz. Dinamik yönlendirmenin size katan esnekliği bir kez tattınızda, statik route cehennemine geri dönmek istemezsiniz.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir