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ş.

Bir yanıt yazın

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