systemd-networkd ile Ağ Yapılandırması

Ağ yapılandırması, sistem yöneticilerinin en sık uğraştığı konuların başında gelir. NetworkManager, ifupdown, netplan… Yıllar içinde onlarca araç geldi geçti. Ama systemd ekosistemi içinde yer alan systemd-networkd, özellikle sunucu ortamları ve container altyapıları için son derece temiz ve öngörülebilir bir yapılandırma deneyimi sunuyor. Minimal bağımlılık, hızlı başlangıç süresi ve systemd ile doğal entegrasyon… Birkaç kez “neden daha önce geçmedim?” diye düşündüren bir araç bu.

Bu yazıda systemd-networkd’yi sıfırdan kuracağız, temel ve gelişmiş yapılandırmaları inceleyeceğiz, gerçek dünya senaryoları üzerinden gideceğiz. Uzun ama pratik bir yazı olacak, hazır mısınız?

systemd-networkd Nedir ve Neden Tercih Edilmeli?

systemd-networkd, systemd paketinin bir parçası olarak gelen, çekirdek ağ arayüzlerini yönetmek için tasarlanmış bir daemon’dır. NetworkManager’dan farklı olarak masaüstü ortamlarına yönelik değil, doğrudan sunucu ve gömülü sistemler için optimize edilmiştir.

Tercih edilmesinin başlıca nedenleri şunlardır:

  • Hafiflik: NetworkManager gibi D-Bus üzerinden GUI entegrasyonu içermez, kaynak tüketimi minimumdur
  • Bildirimsel yapılandırma: .network ve .netdev dosyaları açık ve okunabilirdir
  • systemd entegrasyonu: systemd-resolved, systemd-timesyncd ile doğal çalışır
  • Container desteği: macvlan, veth, bridge gibi sanal arayüzleri kolayca yönetir
  • Hız: Boot sürecinde NetworkManager’a kıyasla çok daha hızlı ayağa kalkar

Dezavantajları da yok değil tabii. Wi-Fi yönetimi için wpa_supplicant ile ayrıca çalışmanız gerekir, NetworkManager kadar “sihirli” bir otomatik algılama sunmaz. Ama sunucu ortamında bu zaten istediğiniz bir şeydir: sürpriz olmayan, deterministik davranış.

Kurulum ve Temel Aktivasyon

Çoğu modern dağıtımda systemd-networkd zaten yüklüdür ama aktif olmayabilir. Önce mevcut durumu kontrol edelim:

systemctl status systemd-networkd
systemctl status NetworkManager

Eğer NetworkManager aktifse ve geçiş yapacaksanız, önce onu devre dışı bırakmanız gerekir. Bunu SSH üzerinden yapıyorsanız dikkatli olun, bağlantıyı kaybedebilirsiniz. Fiziksel erişiminiz varsa ya da konsol üzerindeyseniz:

# NetworkManager'ı durdur ve devre dışı bırak
sudo systemctl stop NetworkManager
sudo systemctl disable NetworkManager

# systemd-networkd ve systemd-resolved'u aktifleştir
sudo systemctl enable --now systemd-networkd
sudo systemctl enable --now systemd-resolved

# resolv.conf'u systemd-resolved ile yönetmek için sembolik link oluştur
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

Bu noktada arayüzleriniz yapılandırılmamış olacak. Yapılandırma dosyalarını oluşturana kadar ağ bağlantısı olmayacak, bu yüzden sırayı doğru planlamak önemli.

Yapılandırma Dosyası Mimarisi

systemd-networkd iki ana dizinden yapılandırma okur:

  • /usr/lib/systemd/network/: Dağıtım tarafından sağlanan yapılandırmalar (dokunmayın)
  • /etc/systemd/network/: Sistem yöneticisinin yapılandırmaları (buraya yazın)
  • /run/systemd/network/: Runtime yapılandırmalar (geçici, yeniden başlatmada silinir)

Öncelik sırası: /etc > /run > /usr/lib

Üç tür yapılandırma dosyası vardır:

  • .network: Mevcut ağ arayüzlerine IP adresi, route, DNS gibi ağ parametrelerini atar
  • .netdev: Bridge, VLAN, VETH gibi sanal ağ arayüzleri oluşturur
  • .link: Ağ arayüzü düzeyinde düşük seviyeli ayarlar yapar (MTU, MAC adresi, vs.)

Dosya adları önemlidir çünkü alfabetik sırayla işlenir. 10-eth0.network, 20-bridge.network gibi önekler kullanmak iyi bir alışkanlıktır.

Statik IP Yapılandırması

En temel senaryo: bir sunucuya statik IP adresi atamak.

# /etc/systemd/network/10-eth0.network dosyasını oluştur
sudo nano /etc/systemd/network/10-eth0.network
[Match]
Name=eth0

[Network]
Address=192.168.1.100/24
Gateway=192.168.1.1
DNS=8.8.8.8
DNS=8.8.4.4
NTP=pool.ntp.org

Dosyayı kaydedip servisi yeniden başlatın:

sudo systemctl restart systemd-networkd

Yapılandırmayı doğrulamak için:

networkctl status eth0
ip addr show eth0
ip route show

networkctl komutu, systemd-networkd’ye özgü bir araçtır ve arayüzlerin durumunu çok net gösterir. configured, degraded, routable gibi durumlar, arayüzün hangi aşamada olduğunu söyler.

DHCP ile Otomatik IP Yapılandırması

Tüm sunuculara statik IP vermek mümkün olmayabilir. DHCP ile otomatik yapılandırma da oldukça basit:

# /etc/systemd/network/10-dhcp.network
[Match]
Name=eth0

[Network]
DHCP=yes

[DHCP]
UseDNS=yes
UseNTP=yes
UseDomains=yes
RouteMetric=100

[DHCP] bölümündeki seçenekler çok işe yarar. UseDNS=yes DHCP sunucusundan gelen DNS bilgisini kullanır, RouteMetric=100 ise birden fazla arayüz olduğunda hangi route’un öncelikli olacağını belirler.

İpucu: Hem IPv4 hem IPv6 için DHCP istiyorsanız DHCP=yes kullanın. Sadece IPv4 için DHCP=ipv4, sadece IPv6 için DHCP=ipv6 yazın.

Birden Fazla Arayüz Yönetimi

Gerçek dünyada sunucuların genellikle birden fazla ağ arayüzü olur. Bir yönetim ağı, bir üretim ağı… Bunu yönetmek çok temiz:

# /etc/systemd/network/10-management.network
[Match]
Name=eth0

[Network]
Address=10.0.0.10/24
Gateway=10.0.0.1
DNS=10.0.0.53
# /etc/systemd/network/20-production.network
[Match]
Name=eth1

[Network]
Address=192.168.10.50/24
# Bu arayüz için default gateway YOK
# Routing tablosunu kirletmemek için

Burada dikkat edilmesi gereken nokta: her arayüz için ayrı default gateway tanımlamayın. Birden fazla default gateway routing sorunlarına yol açar. Yönetim ağından SSH erişimi sağlanacaksa, üretim arayüzüne gateway eklemeyin, sadece network prefix yeterli.

Wildcard ile Esnek Eşleştirme

[Match] bölümü sadece Name= ile sınırlı değil. Wildcard ve diğer kriterleri kullanarak çok daha esnek yapılandırmalar yapabilirsiniz:

# /etc/systemd/network/10-wired.network
# Tüm ethernet arayüzlerini DHCP ile yapılandır
[Match]
Name=en*
Type=ether

[Network]
DHCP=ipv4

[DHCP]
ClientIdentifier=mac
# /etc/systemd/network/10-specific-mac.network
# Belirli bir MAC adresine sahip arayüzü yakala
[Match]
MACAddress=aa:bb:cc:dd:ee:ff

[Network]
Address=10.10.10.5/24
Gateway=10.10.10.1

MAC adresi eşleştirme özellikle donanımın değiştiği veya arayüz adının öngörülemez olduğu ortamlarda çok kullanışlıdır. Hypervisor üzerinde çalışan VM’lerde interface isimleri tutarsız olabilir, MAC adresi ise sabit kalır.

Bridge Yapılandırması

Container ve sanal makine altyapılarında en sık ihtiyaç duyulan senaryo: bir bridge oluşturup fiziksel arayüzü buna bağlamak. KVM/QEMU ile çalışıyorsanız veya LXC container’ları kullanıyorsanız bu yapılandırma şart.

Önce bridge arayüzünü .netdev dosyasıyla oluşturun:

# /etc/systemd/network/10-bridge.netdev
[NetDev]
Name=br0
Kind=bridge

[Bridge]
ForwardDelaySec=0
STP=false

Sonra fiziksel arayüzü bridge’e bağlayın:

# /etc/systemd/network/20-eth0-bridge.network
[Match]
Name=eth0

[Network]
Bridge=br0

Son olarak bridge arayüzüne IP adresi atayın:

# /etc/systemd/network/30-br0.network
[Match]
Name=br0

[Network]
Address=192.168.1.100/24
Gateway=192.168.1.1
DNS=8.8.8.8

Sıralama önemli: önce br0 oluşturulmalı (10-), sonra eth0 ona bağlanmalı (20-), en son br0‘a IP atanmalı (30-). Bu yüzden dosya adı önekleri kritik.

Bridge’i doğrulamak için:

networkctl status br0
bridge link show

VLAN Yapılandırması

Kurumsal ağ ortamlarında VLAN kullanımı kaçınılmaz. systemd-networkd ile VLAN yapılandırması da .netdev dosyaları üzerinden yapılır:

# /etc/systemd/network/10-vlan100.netdev
[NetDev]
Name=vlan100
Kind=vlan

[VLAN]
Id=100
# /etc/systemd/network/20-eth0-vlan.network
# Fiziksel arayüze VLAN'ı bağla
[Match]
Name=eth0

[Network]
VLAN=vlan100
# Aynı anda birden fazla VLAN ekleyebilirsiniz:
# VLAN=vlan200
# VLAN=vlan300
# /etc/systemd/network/30-vlan100.network
[Match]
Name=vlan100

[Network]
Address=172.16.100.10/24
Gateway=172.16.100.1

Bu yapılandırma, eth0 fiziksel arayüzü üzerinden VLAN 100 trafiğini vlan100 sanal arayüzüne yönlendirir. Switch tarafında trunk port yapılandırması yapıldığını varsayıyorum, sistem tarafı bu kadar temiz.

Bonding ile Yüksek Erişilebilirlik

Üretim ortamlarında tek noktadan başarısızlığı önlemek için NIC bonding kullanılır. Aktif-yedek veya yük dengeleme modunda çalışabilir:

# /etc/systemd/network/10-bond0.netdev
[NetDev]
Name=bond0
Kind=bond

[Bond]
Mode=active-backup
MIIMonitorSec=1s
PrimaryReselectPolicy=always
# /etc/systemd/network/20-eth0-bond.network
[Match]
Name=eth0

[Network]
Bond=bond0

[Link]
PrimarySlave=yes
# /etc/systemd/network/20-eth1-bond.network
[Match]
Name=eth1

[Network]
Bond=bond0
# /etc/systemd/network/30-bond0.network
[Match]
Name=bond0

[Network]
Address=192.168.1.50/24
Gateway=192.168.1.1
DNS=192.168.1.1

Mode=active-backup birincil NIC çalışırken yedek NIC’i pasif tutar, birincil başarısız olursa otomatik geçiş yapar. Yük dengeleme için Mode=balance-tlb veya Mode=802.3ad kullanabilirsiniz ama switch tarafında da konfigürasyon gerektirir.

networkctl ile Durum İzleme

systemd-networkd ile birlikte gelen networkctl aracı, ağ durumunu izlemek için çok kullanışlıdır:

# Tüm arayüzlerin listesi ve durumu
networkctl list

# Belirli bir arayüzün detaylı durumu
networkctl status eth0

# Tüm arayüzlerin detaylı durumu
networkctl status

# Yapılandırmayı tekrar yükle (restart gerektirmez)
networkctl reload

# Belirli bir arayüzü yeniden yapılandır
networkctl reconfigure eth0

# İstatistikler
networkctl statistics

networkctl list çıktısında her arayüzün SETUP ve OPERATIONAL durumunu görürsünüz. Eğer bir arayüz configuring durumunda takılı kaldıysa, muhtemelen bir IP alamıyor veya yapılandırma dosyasında sorun var demektir.

Log’lara bakmak için:

journalctl -u systemd-networkd -f
journalctl -u systemd-networkd --since "1 hour ago"

Routing ve İleri Seviye Ağ Yapılandırması

Bazı senaryolarda varsayılan route yönetimi yeterli olmayabilir. Policy routing veya statik route ekleme gerekebilir:

# /etc/systemd/network/10-eth0.network
[Match]
Name=eth0

[Network]
Address=10.0.1.10/24
Gateway=10.0.1.1

[Route]
Destination=172.16.0.0/12
Gateway=10.0.1.254
Metric=100

[Route]
Destination=192.168.100.0/24
Gateway=10.0.1.253

Bu örnekte eth0 arayüzüne iki statik route ekledik. 172.16.0.0/12 bloğu için farklı bir gateway, 192.168.100.0/24 için başka bir gateway tanımladık. Kurumsal ağlarda farklı VLAN’lara erişim için böyle bir yapılandırma oldukça yaygındır.

IPv6 ve DNS yapılandırması için gelişmiş bir örnek:

# /etc/systemd/network/10-dual-stack.network
[Match]
Name=eth0

[Network]
Address=10.0.0.100/24
Address=2001:db8::100/64
Gateway=10.0.0.1
IPv6AcceptRA=yes
DNS=10.0.0.53
DNS=2001:db8::53
Domains=example.local
IPForward=yes

IPForward=yes bu arayüz için IP yönlendirmeyi etkinleştirir. Router veya NAT gateway olarak çalışan sistemlerde bu gereklidir.

Gerçek Dünya Senaryosu: Proxmox Benzeri Bir Sanallaştırma Sunucusu

Elimde 4 portlu bir ağ kartına sahip bir sunucu var diyelim. Planlama:

  • eth0 ve eth1: Management ağı için bond (yedekli)
  • eth2: VM’ler için bridge
  • eth3: Storage ağı (iSCSI/NFS)
# 10-mgmt-bond.netdev - Management bond
[NetDev]
Name=bond-mgmt
Kind=bond

[Bond]
Mode=active-backup
MIIMonitorSec=1s
# 20-eth0-bond.network
[Match]
Name=eth0
[Network]
Bond=bond-mgmt
# 20-eth1-bond.network
[Match]
Name=eth1
[Network]
Bond=bond-mgmt
# 25-vm-bridge.netdev - VM bridge
[NetDev]
Name=br-vms
Kind=bridge
[Bridge]
ForwardDelaySec=0
STP=false
# 30-bond-mgmt.network - Management IP
[Match]
Name=bond-mgmt
[Network]
Address=10.10.0.5/24
Gateway=10.10.0.1
DNS=10.10.0.53
Domains=datacenter.local
# 30-eth2-bridge.network - eth2'yi VM bridge'e bağla
[Match]
Name=eth2
[Network]
Bridge=br-vms
# 35-br-vms.network - VM bridge yapılandırması
[Match]
Name=br-vms
[Network]
# IP yok, VM'ler kendi IP'lerini alacak
LinkLocalAddressing=no
# 30-eth3-storage.network - Storage ağı
[Match]
Name=eth3
[Network]
Address=192.168.200.5/24
# Gateway yok! Storage ağından internete çıkmak istemiyoruz
MTUBytes=9000

Storage ağında Jumbo Frame (MTU 9000) kullanmak iSCSI performansını ciddi ölçüde artırır. .network dosyasında doğrudan belirtebilirsiniz.

Hata Ayıklama Tüyoları

systemd-networkd ile çalışırken zaman zaman sorunlarla karşılaşırsınız. İşte en sık karşılaşılan durumlar ve çözümleri:

Arayüz yapılandırılmıyor:

# Debug seviyesinde logları göster
sudo systemd-networkd --debug
# veya
sudo SYSTEMD_LOG_LEVEL=debug /lib/systemd/systemd-networkd

DNS çalışmıyor:

# systemd-resolved durumu
resolvectl status
resolvectl query google.com
# DNS önbelleğini temizle
resolvectl flush-caches

Yapılandırma dosyası sözdizimi kontrolü:

# networkd-dispatcherd ile test
sudo networkctl reload
journalctl -u systemd-networkd -n 50

Arayüz durumu degraded olarak görünüyorsa:

Bu genellikle arayüzün IP aldığını ama carrier (fiziksel bağlantı) sorunu yaşadığını gösterir. networkctl status çıktısını dikkatlice inceleyin.

# Fiziksel bağlantı durumu
ip link show
ethtool eth0 | grep "Link detected"

systemd-networkd ile systemd-resolved Entegrasyonu

systemd-networkd, DNS yapılandırmasını otomatik olarak systemd-resolved’a iletir. Bu entegrasyon sayesinde per-interface DNS, DNS-over-TLS ve DNSSEC gibi özellikler kolayca kullanılabilir.

# /etc/systemd/resolved.conf
[Resolve]
DNS=1.1.1.1 8.8.8.8
FallbackDNS=9.9.9.9
Domains=~.
DNSSEC=opportunistic
DNSOverTLS=opportunistic
Cache=yes

Bu yapılandırmayla birincil DNS olarak Cloudflare ve Google, yedek olarak Quad9 kullanılır, DNSSEC ve DNS-over-TLS fırsatçı modda etkinleştirilir.

# DNS durumunu kontrol et
resolvectl status
resolvectl statistics

Sonuç

systemd-networkd, özellikle sunucu ve altyapı ortamlarında ağ yapılandırmasını son derece temiz ve yönetilebilir bir hale getiriyor. Dosya tabanlı bildirimsel yapısı, neyin nerede yapılandırıldığını her zaman netleştiriyor; NetworkManager’ın bazen “nereye yazdı acaba?” dedirten sihirli davranışları yok.

Öğrenme eğrisi var, özellikle bridge, VLAN ve bonding gibi gelişmiş yapılandırmalar için .netdev ve .network dosyaları arasındaki ilişkiyi kavramak biraz zaman alıyor. Ama bir kez oturduğunda, otomasyonla birleştirdiğinizde (Ansible, cloud-init…) inanılmaz öngörülebilir bir altyapı elde ediyorsunuz.

Tavsiyem: Önce test ortamında deneyin, birkaç farklı senaryo kurun, networkctl ve journalctl ile çıktıları inceleyin. Sonra üretim sunucularınıza geçin. Ve unutmayın, SSH üzerinden NetworkManager’dan systemd-networkd’ye geçiş yapıyorsanız, önce yapılandırma dosyalarını hazırlayın, sonra servisi değiştirin; yoksa kendinizi konsolun başında bulabilirsiniz.

Yorum yapın