Linux’ta Yazılım Köprüsü Oluşturma: bridge-utils ve ip link Kullanımı
Sanallaştırma ortamlarında veya çoklu ağ arayüzü gerektiren senaryolarda, bir noktada mutlaka karşınıza çıkacak bir kavram var: yazılım köprüsü, yani bridge. KVM/QEMU sanal makineleri, LXC konteynerlar, ya da sadece birkaç fiziksel arabirimi tek bir ağ segmentinde birleştirmek istediğinizde bridge olmadan ilerlemeniz neredeyse imkansız. Yıllar içinde onlarca sunucuda bridge yapılandırması yaptım ve her seferinde şunu fark ettim: temel kavramı kavradıktan sonra her şey yerine oturuyor.
Yazılım Köprüsü Nedir, Ne İşe Yarar?
Fiziksel dünyada bir network switch düşünün. Birden fazla cihazı aynı Layer 2 segmentine bağlar, MAC adreslerini öğrenir ve trafiği buna göre yönlendirir. Linux’taki software bridge de tam olarak bunu yapar, fakat tamamen yazılım katmanında.
Tipik kullanım senaryoları şunlardır:
- KVM/QEMU sanallaştırma: Sanal makinelerin fiziksel ağa erişimi için
- LXC/LXD konteynerleri: Konteyner ağ izolasyonu ve dış erişim
- Ağ test ortamları: Birden fazla interface’i test amaçlı birleştirmek
- Yedeklilik ve link aggregation: Birden fazla fiziksel bağlantıyı köprülemek
- SDN altyapıları: Open vSwitch gibi araçların altında bile benzer prensipler çalışır
Linux kernel 2.2’den beri bridge desteği mevcut. Biz iki farklı yöntemle bu işi yapacağız: eski nesil bridge-utils paketi ve modern ip link komutu.
Gerekli Araçların Kurulumu
Önce ortamı hazırlayalım. bridge-utils paketi Debian/Ubuntu tabanlı sistemlerde varsayılan olarak gelmiyor:
# Debian/Ubuntu
sudo apt update && sudo apt install bridge-utils
# RHEL/CentOS/Rocky Linux
sudo dnf install bridge-utils
# Arch Linux
sudo pacman -S bridge-utils
iproute2 paketi ise modern dağıtımlarda neredeyse her zaman kurulu geliyor. Kontrol etmek için:
ip -V
# Çıktı: ip utility, iproute2-5.x.x gibi bir şey görmeli
brctl --version
# Çıktı: bridge-utils versiyonunu gösterir
Kernel tarafında bridge modülünün yüklü olup olmadığını kontrol edin:
lsmod | grep bridge
# Çıktı yoksa modülü yükleyin:
sudo modprobe bridge
bridge-utils ile Bridge Oluşturma
bridge-utils paketi temel olarak brctl komutunu sağlar. Eski ama hala birçok ortamda göreceğiniz bir araç.
Temel Bridge Oluşturma
# br0 adında bir bridge oluştur
sudo brctl addbr br0
# Mevcut bridge'leri listele
sudo brctl show
# Bir interface'i bridge'e ekle (eth1'i br0'a bağla)
sudo brctl addif br0 eth1
# Bridge'e IP adresi ata
sudo ip addr add 192.168.1.100/24 dev br0
# Bridge'i aktif et
sudo ip link set br0 up
# eth1'i de aktif et (bridge member'lar için gerekli)
sudo ip link set eth1 up
brctl show komutunun çıktısı şuna benzeyecek:
bridge name bridge id STP enabled interfaces
br0 8000.aabbccdd1122 no eth1
brctl’nin Temel Parametreleri
addbr: Yeni bridge oluşturur delbr: Bridge’i siler addif: Bridge’e interface ekler delif: Bridge’den interface çıkarır show: Tüm bridge’leri ve bağlı interface’leri listeler showmacs: Bridge’in MAC tablosunu gösterir showstp: STP (Spanning Tree Protocol) bilgisini gösterir stp: Bridge üzerinde STP’yi etkinleştirir/devre dışı bırakır
# MAC adres tablosunu görüntüle
sudo brctl showmacs br0
# STP'yi etkinleştir (döngü önleme için önemli)
sudo brctl stp br0 on
# Bridge'i sil (önce interface'leri çıkarmanız gerekir)
sudo brctl delif br0 eth1
sudo ip link set br0 down
sudo brctl delbr br0
ip link ile Modern Bridge Yönetimi
iproute2 içindeki ip link komutu, brctl‘nin neredeyse tüm işlevlerini karşılıyor ve hatta daha fazlasını yapıyor. Red Hat ve modern dağıtımlar artık bridge-utils‘i deprecated olarak işaretledi, bu nedenle ip komutunu öğrenmek uzun vadede daha mantıklı.
ip link ile Bridge Oluşturma
# Bridge oluştur
sudo ip link add name br0 type bridge
# Interface'i bridge'e bağla (enslaving)
sudo ip link set eth1 master br0
# Alternatif sözdizimi
sudo ip link set dev eth1 master br0
# Bridge'e IP ver
sudo ip addr add 192.168.1.100/24 dev br0
# Her ikisini de aktif et
sudo ip link set br0 up
sudo ip link set eth1 up
# Bridge bilgilerini görüntüle
ip link show type bridge
ip link show master br0
Bridge Detaylarını Görüntüleme
ip komutunun bridge alt komutu daha detaylı bilgi verir:
# Tüm bridge'leri listele
bridge link show
# MAC forwarding tablosunu görüntüle
bridge fdb show dev br0
# Bridge VLAN bilgisi
bridge vlan show
# Bridge istatistikleri
ip -s link show br0
Gerçek Dünya Senaryosu: KVM Sanal Makineleri için Bridge
En çok karşılaşacağınız senaryo bu. KVM ile bir sanal makine açtığınızda, default olarak NAT kullanıyor ve sanal makine dışarıdan erişilemiyor. Bunu çözmek için fiziksel interface’i bir bridge’e bağlıyoruz.
Diyelim ki sunucunuzda enp3s0 adında bir fiziksel interface var ve IP’si 10.0.0.50/24, gateway 10.0.0.1.
# 1. Bridge oluştur
sudo ip link add name virbr1 type bridge
# 2. STP'yi kapat (basit ortamlarda döngü riski düşük, latency azaltır)
sudo ip link set virbr1 type bridge stp_state 0
# 3. Fiziksel interface'i bridge'e bağla
# DİKKAT: Bunu yaparken mevcut IP yapılandırması kaybolacak!
sudo ip addr flush dev enp3s0
sudo ip link set enp3s0 master virbr1
# 4. Bridge'e IP ver
sudo ip addr add 10.0.0.50/24 dev virbr1
# 5. Her ikisini aktif et
sudo ip link set enp3s0 up
sudo ip link set virbr1 up
# 6. Default gateway ekle
sudo ip route add default via 10.0.0.1 dev virbr1
Bu adımları yaparken SSH bağlantısı üzerinden çalışıyorsanız dikkatli olun. ip addr flush komutundan sonra bağlantınız kopacak. Bu işlemleri ya konsoldan ya da tek bir komut satırında zincirleme yapmanızı öneririm.
Kalıcı Bridge Yapılandırması
Şimdiye kadar yaptığımız her şey geçici. Sistem yeniden başladığında tüm bu yapılandırma uçup gidecek. Kalıcı hale getirmek için dağıtıma göre farklı yöntemler var.
Debian/Ubuntu – Netplan ile (Ubuntu 18.04+)
# /etc/netplan/01-bridge.yaml
network:
version: 2
ethernets:
enp3s0:
dhcp4: false
bridges:
br0:
interfaces: [enp3s0]
addresses: [10.0.0.50/24]
routes:
- to: default
via: 10.0.0.1
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
parameters:
stp: false
forward-delay: 0
dhcp4: false
# Yapılandırmayı uygula
sudo netplan apply
# Syntax kontrolü
sudo netplan try
RHEL/Rocky Linux – nmcli ile
# Bridge connection oluştur
sudo nmcli connection add type bridge
con-name br0
ifname br0
ipv4.addresses 10.0.0.50/24
ipv4.gateway 10.0.0.1
ipv4.dns "8.8.8.8 8.8.4.4"
ipv4.method manual
# Physical interface'i bridge'e bağla
sudo nmcli connection add type ethernet
con-name br0-port1
ifname enp3s0
master br0
# Bağlantıları etkinleştir
sudo nmcli connection up br0
sudo nmcli connection up br0-port1
VLAN Farkındalıklı Bridge Yapılandırması
Modern datacenter ortamlarında sadece düz bridge yetmez, VLAN segmentasyonu da gerekir. Linux bridge’i VLAN-aware modda çalıştırabilirsiniz.
# VLAN-aware bridge oluştur
sudo ip link add name br0 type bridge vlan_filtering 1
# Interface'i ekle
sudo ip link set eth1 master br0
sudo ip link set eth2 master br0
# br0'u aktif et
sudo ip link set br0 up
sudo ip link set eth1 up
sudo ip link set eth2 up
# eth1'e VLAN 10 ve 20'yi trunk olarak ekle
bridge vlan add dev eth1 vid 10 trunk
bridge vlan add dev eth1 vid 20 trunk
# eth2'yi VLAN 10'un access portu yap
bridge vlan add dev eth2 vid 10 pvid untagged
# Mevcut VLAN yapılandırmasını görüntüle
bridge vlan show
Troubleshooting: Karşılaşılan Yaygın Sorunlar
Bridge Üzerinden Traffic Geçmiyor
Bu durumla sık karşılaşılır. Genellikle iptables veya nftables sebebiyle olur:
# iptables bridge filtering kontrolü
cat /proc/sys/net/bridge/bridge-nf-call-iptables
# Eğer 1 ise ve sorun varsa, geçici olarak 0 yapabilirsiniz
echo 0 | sudo tee /proc/sys/net/bridge/bridge-nf-call-iptables
echo 0 | sudo tee /proc/sys/net/bridge/bridge-nf-call-ip6tables
# Kalıcı hale getirmek için
cat >> /etc/sysctl.conf << EOF
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-ip6tables = 0
EOF
sudo sysctl -p
Interface Bridge’e Eklenemiyor
# Interface başka bir master'a bağlı olabilir
ip link show eth1 | grep master
# Varsa önce çıkarın
sudo ip link set eth1 nomaster
# Sonra tekrar ekleyin
sudo ip link set eth1 master br0
MAC Flooding Problemi
# MAC tablosunun yaşını ayarlayın (default 300 saniye)
sudo ip link set br0 type bridge ageing_time 150
# Ya da brctl ile
sudo brctl setageing br0 150
# Mevcut MAC tablosunu temizlemek için (dikkatli kullanın)
bridge fdb flush dev br0
ip link Bridge Parametreleri
ip link set type bridge ile ayarlayabileceğiniz parametreler:
stp_state 0/1: Spanning Tree Protocol’ü kapatır/açar forward_delay : STP forward delay süresini ayarlar hello_time : STP hello mesaj aralığı max_age : STP mesajlarının maksimum yaşı ageing_time : MAC tablosu giriş süresi vlan_filtering 0/1: VLAN filtrelemeyi etkinleştirir vlan_default_pvid : Yeni eklenen portlar için varsayılan VLAN ID mcast_snooping 0/1: Multicast snooping’i kontrol eder nf_call_iptables 0/1: Netfilter hook’larını kontrol eder
Performans İpuçları
Bridge’in CPU’ya bindirdiği yükü azaltmak için şu ayarları değerlendirin:
# Multicast snooping'i kapat (gerekli değilse)
sudo ip link set br0 type bridge mcast_snooping 0
# TX/RX queue boyutlarını artır
sudo ip link set eth1 txqueuelen 10000
# Bridge üzerinde offloading aktif et (NIC destekliyorsa)
sudo ethtool -K eth1 tx-checksum-ipv4 on
# Mevcut bridge ayarlarını görüntüle
ip -d link show br0
ip -d link show br0 komutundaki -d flag’i detaylı çıktı verir ve tüm bridge parametrelerini gösterir. Debug sırasında bu çıktı çok değerli.
Sonuç
Linux bridge yapılandırması ilk bakışta karmaşık görünebilir, ama temel mantığı kavradıktan sonra oldukça sistematik bir hal alıyor. brctl, eski sistemlerde veya hızlı testlerde hala kullanışlı, ancak production ortamlar için ip link ve bridge komutlarına geçmek hem daha sürdürülebilir hem de daha yetenekli.
Özellikle dikkat etmeniz gereken noktaları özetleyeyim: uzak sunucularda interface yapılandırmasını değiştirirken her zaman bir konsoldan ya da out-of-band erişimden yedek bir bağlantınız olsun. Bridge’e fiziksel interface bağlarken o interface üzerindeki IP konfigürasyonu otomatik olarak çalışmaz hale gelir. Ve son olarak, RHEL/Rocky Linux tabanlı ortamlarda NetworkManager’ı görmezden gelip doğrudan ip komutuyla yapılan değişiklikler, NetworkManager’ın bir sonraki müdahalesinde ezilecektir; bu yüzden nmcli veya connection dosyalarını kullanmak çok daha güvenli.
Sanallaştırma altyapısı kurarken ya da SDN projelerinde bridge’lerin nasıl çalıştığını anlamak, üst katmandaki karmaşık sistemleri de kavramayı kolaylaştıracak. Open vSwitch bile aslında bu temel prensiplerin üzerine inşa edilmiş.
