~/yazilar/netplan-ile-ag-yapilandirmasi
Netplan ile statik IP, VLAN ve bond
içindekiler
Uzaktaki bir sunucunun ağ ayarını SSH üzerinden değiştirmek, oturduğun dalı kesmeye benziyor. YAML'da bir girinti kayıyor ya da gateway yanlış yazılıyor, bağlantı gidiyor ve konsola ulaşman gerekiyor. Konsol başka binadaki bir hipervizörün arayüzündeyse ya da fiziksel sunucunun uzaktan yönetim kartı hiç ayarlanmamışsa iş uzuyor.
Netplan'ın netplan try komutu tam bu durum için var: yeni ayarı uyguluyor, senden onay bekliyor, onay gelmezse eskisine dönüyor. Statik IP, DNS ve VLAN değişikliklerini try ile uyguluyorum. Bond'da bunun neden işe yaramadığını o bölümde anlatıyorum. Örnekler sunucu kurulumunun varsayılanı olan networkd backend'i için.
Önce elindekine bak
ip -br link
ip -br addr
ls -l /etc/netplan/lo UNKNOWN 00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
ens18 UP 52:54:00:12:34:01 <BROADCAST,MULTICAST,UP,LOWER_UP>
ens19 UP 52:54:00:12:34:02 <BROADCAST,MULTICAST,UP,LOWER_UP>
lo UNKNOWN 127.0.0.1/8 ::1/128
ens18 UP 192.0.2.57/24 fe80::5054:ff:fe12:3401/64
ens19 UP fe80::5054:ff:fe12:3402/64
-rw------- 1 root root 412 ... 50-cloud-init.yamlBu sunucu şu an adresini DHCP'den alıyor (192.0.2.57), hedef onu 192.0.2.10 statik adresine taşımak. Arayüz adları ortama göre değişiyor. Proxmox ve KVM'de ens18, VMware'de ens160 ya da ens192, fiziksel sunucularda eno1 ya da enp3s0f0 gibi isimler görürsün. Aşağıdaki örneklerde kendi adlarını kullan.
Dizindeki dosyanın adı 50-cloud-init.yaml ise içinde şuna benzer bir uyarı vardır:
# This file is generated from information provided by the datasource. Changes
# to it will not persist across an instance reboot. To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}Bu uyarıyı ciddiye al. cloud-init ağı yönetmeye devam ederse yaptığın değişiklik bir sonraki açılışta silinebiliyor. Ağı elle yöneteceksem önce cloud-init'i ağdan çekiyorum:
echo 'network: {config: disabled}' | sudo tee /etc/cloud/cloud.cfg.d/99-disable-network-config.cfgStatik IP ve DNS
Netplan, /etc/netplan altındaki bütün .yaml dosyalarını alfabetik sırayla okuyup birleştiriyor ve aynı anahtar için sonra gelen kazanıyor. Yeni bir dosya yazıp eskisini yerinde bırakırsam iki ayar birbirine karışıyor. Bu yüzden eski dosyayı .yaml uzantısından çıkarıyorum, netplan onu artık okumuyor ama gerektiğinde hemen yanında duruyor:
sudo mv /etc/netplan/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml.yedekYeni dosya:
# /etc/netplan/01-ag.yaml
network:
version: 2
renderer: networkd
ethernets:
ens18:
dhcp4: false
dhcp6: false
addresses:
- 192.0.2.10/24
routes:
- to: default
via: 192.0.2.1
nameservers:
addresses: [192.0.2.53, 192.0.2.54]
search: [ornek.local]sudo chmod 600 /etc/netplan/01-ag.yaml
sudo netplan generatenetplan generate sadece YAML'ı okuyup backend ayarlarını üretiyor, ağa dokunmuyor. Sessiz kalıyorsa dosya geçerli. Hata varsa hangi satırda olduğunu söylüyor.
Şimdi try. Burada çoğu kişinin ilk seferde yaşadığı bir tuzak var: kendi bağlandığın arayüzün IP'sini değiştiriyorsan ayar uygulandığı anda SSH oturumun kopuyor ve try komutunun beklediği Enter tuşuna basamıyorsun. 120 saniye sonra eski ayar geri geliyor. Güvenli ama işe yaramıyor.
Benim çözümüm try komutunu tmux içinde çalıştırmak. Süreç sunucuda çalışmaya devam ediyor, ben yeni IP'ye bağlanıp aynı tmux oturumuna geri dönüyorum ve onayı oradan veriyorum:
tmux new -s ag
sudo netplan try --timeout 180Do you want to keep these settings?
Press ENTER before the timeout to accept the new configuration
Changes will revert in 178 secondsBaşka bir terminalden yeni adrese bağlan ve oturuma geri dön:
ssh deploy@192.0.2.10
tmux attach -t agEnter'a bas:
Configuration accepted.Yeni adrese bağlanamıyorsan hiçbir şey yapma. Süre dolunca eski ayar geri geliyor ve eski adresten yeniden bağlanabiliyorsun. IP değişmiyorsa (sadece DNS ya da route ekliyorsan) bağlantı kopmayacağı için tmux'a gerek yok, try doğrudan çalıştırılabilir.
try ayrı bir kaydetme adımı istemiyor, onay verdiğin ayar zaten dosyada duruyor. Onaydan sonra ayrıca netplan apply çalıştırmana gerek yok.
DNS tarafında /etc/resolv.conf dosyasını elle düzenleme. Ubuntu'da bu dosya systemd-resolved yerel çözücüsünü (127.0.0.53) gösteren bir bağlantı. Elle yazdığın şey ilk fırsatta eziliyor. Gerçek DNS sunucularını görmek için:
resolvectl status ens18Link 2 (ens18)
Current Scopes: DNS
Protocols: +DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 192.0.2.53
DNS Servers: 192.0.2.53 192.0.2.54
DNS Domain: ornek.localİç alan adın .local ile bitiyorsa (Active Directory ortamlarında hâlâ sık görülüyor) search satırına yazmak önemli. systemd-resolved .local ile biten adları varsayılan olarak mDNS ile çözmeye çalışıyor. Alan adı bağlantının DNS domain listesinde olunca sorgu normal DNS sunucusuna gidiyor.
resolvectl query srv01.ornek.localİkinci bacakta VLAN
Senaryo şu: ens19 bir trunk porta bağlı ve üzerinden VLAN 120 (örneğin yedekleme ağı) etiketli geliyor. Sunucunun bu ağda da bir adresi olsun istiyorum.
Sanal makinede bu, hipervizör tarafında da ayar istiyor. Sanal ağ kartının bağlı olduğu bridge ya da port group etiketli trafiği sanal makineye geçirmeli. Proxmox'ta VLAN-aware bridge, VMware'de VLAN ID'si 4095 olan bir port group bunu sağlıyor.
Aynı dosyaya ekliyorum:
# /etc/netplan/01-ag.yaml
network:
version: 2
renderer: networkd
ethernets:
ens18:
dhcp4: false
dhcp6: false
addresses:
- 192.0.2.10/24
routes:
- to: default
via: 192.0.2.1
nameservers:
addresses: [192.0.2.53, 192.0.2.54]
search: [ornek.local]
ens19:
dhcp4: false
dhcp6: false
vlans:
vlan120:
id: 120
link: ens19
addresses:
- 198.51.100.10/24
routes:
- to: 203.0.113.0/24
via: 198.51.100.1ens19 üzerinde adres yok ama ethernets altında tanımlı olması gerekiyor, link: ancak tanımlı bir arayüzü gösterebiliyor.
VLAN arayüzüne ikinci bir varsayılan route yazmadım. Bir sunucuda iki varsayılan gateway olunca giden trafik bir bacaktan çıkıp cevap öbüründen dönebiliyor ve aradaki güvenlik duvarı bu paketleri düşürüyor. Yedekleme ağı üzerinden ulaşılması gereken başka bir ağ varsa onu yukarıdaki gibi tek bir route ile ekliyorum.
Bu sefer IP'si değişen arayüz benim bağlandığım arayüz değil, try doğrudan çalışır:
sudo netplan try
ip -d link show vlan1205: vlan120@ens19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP ...
link/ether 52:54:00:12:34:02 brd ff:ff:ff:ff:ff:ff promiscuity 0 ...
vlan protocol 802.1Q id 120 <REORDER_HDR> ...Bond
Bond iki ya da daha fazla fiziksel kartı tek bir mantıksal arayüz gibi kullanmak için. Bu kısım daha çok fiziksel sunucularla ilgili. Sanal makinelerde yedeklilik ve bant genişliği işini genelde hipervizör üstleniyor, sanal makinenin içinde bond kurmanın pek anlamı olmuyor.
İki mod arasında seçim yapıyorum. 802.3ad (LACP) iki kartın bant genişliğini birlikte kullanıyor ama switch tarafında port-channel ayarı gerektiriyor. İki kart iki farklı switch'e gidiyorsa switch'lerin stack ya da MLAG yapısında olması lazım. active-backup ise switch tarafında hiçbir ayar istemiyor, bir kart çalışıyor, o giderse diğeri devralıyor. Ağ ekibiyle LACP ayarını konuşma imkânın yoksa ya da switch'leri bilmiyorsan bence active-backup ile başla. Yanlış yapılandırılmış bir LACP, hiç bond olmamasından daha çok sorun çıkarıyor.
LACP ile bond ve üzerinde bir VLAN:
# /etc/netplan/01-ag.yaml
network:
version: 2
renderer: networkd
ethernets:
eno1:
dhcp4: false
eno2:
dhcp4: false
bonds:
bond0:
interfaces: [eno1, eno2]
parameters:
mode: 802.3ad
lacp-rate: fast
mii-monitor-interval: 100
transmit-hash-policy: layer3+4
addresses:
- 192.0.2.20/24
routes:
- to: default
via: 192.0.2.1
nameservers:
addresses: [192.0.2.53, 192.0.2.54]
search: [ornek.local]
vlans:
bond0.120:
id: 120
link: bond0
addresses:
- 198.51.100.20/24transmit-hash-policy: layer3+4 trafiği IP ve port bilgisine göre dağıtıyor. Varsayılan layer2 sadece MAC adresine baktığı için çoğu trafik tek bir gateway MAC'ine gidiyor ve ikinci kart neredeyse boş kalıyor.
active-backup istersen parameters kısmı şöyle oluyor:
parameters:
mode: active-backup
primary: eno1
mii-monitor-interval: 100Bond değişikliklerinde netplan try her zaman güvenilir bir geri dönüş vermiyor. Bond ve bridge gibi sanal arayüzlerin parametrelerini geri alamadığı durumlar var. Bunu konsol erişimin varken, mümkünse bakım penceresinde yap.
sudo netplan apply
cat /proc/net/bonding/bond0Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer3+4 (1)
MII Status: up
MII Polling Interval (ms): 100
...
802.3ad info
LACP active: on
LACP rate: fast
...
Slave Interface: eno1
MII Status: up
Speed: 10000 Mbps
Aggregator ID: 1
...
Slave Interface: eno2
MII Status: up
Speed: 10000 Mbps
Aggregator ID: 1Burada en çok baktığım satır Aggregator ID. İki kartta aynı numara olmalı. Farklıysa switch tarafında port-channel yok ya da kartlar farklı port-channel'lara bağlı demek, bond tek kartla çalışıyor.
Bağlantıyı test etmek için kartlardan birinin kablosunu çekmek en gerçekçisi. Fiziksel erişim yoksa sudo ip link set eno2 down ile de deneyebilirsin, ama bunu bağlı olduğun bond üzerinde yaparken diğer kartın gerçekten ayakta olduğundan emin ol.
Sık hatalar
Girinti hatası
YAML'da sekme karakteri kullanılamıyor ve girinti tutarlı olmalı. netplan hatanın satır ve sütununu veriyor:
/etc/netplan/01-ag.yaml:12:7: Error in network definition: expected mapping (check indentation)gateway4 uyarısı
İnternetteki eski örneklerin çoğu gateway4: 192.0.2.1 kullanıyor. Hâlâ çalışıyor ama uyarı veriyor:
`gateway4` has been deprecated, use default routes instead.
See the 'Default routes' section of the documentation for more details.Yukarıdaki örneklerdeki routes: - to: default biçimi bunun yerine geçiyor.
Dosya izinleri
Netplan dosyaları Wi-Fi parolası gibi sırlar taşıyabildiği için başkalarının okuyabildiği dosyalar için uyarı veriyor:
** (generate:1834): WARNING **: ...: Permissions for /etc/netplan/01-ag.yaml are too open. Netplan configuration should NOT be accessible by others.sudo chmod 600 ile düzelt.
Açılış iki dakika bekliyor
Netplan'da tanımlı ama kablosu takılı olmayan bir arayüz varsa sistem açılışta systemd-networkd-wait-online yüzünden bekliyor. Konsolda şunu görürsün:
A start job is running for Wait for Network to be ConfiguredO arayüze optional: true eklersen açılış onu beklemiyor.
İki varsayılan route
İkinci kartta DHCP açıksa DHCP sunucusunun verdiği gateway de varsayılan route olarak ekleniyor. ip route çıktısında iki default satırı görüyorsan o arayüze şunu ekle:
dhcp4-overrides:
use-routes: falseDeğişiklik açılışta kayboluyor
Neredeyse her zaman cloud-init. Yukarıdaki 99-disable-network-config.cfg dosyasının yerinde olduğunu kontrol et.
Hepsinden sonra son durumu tek komutla görmek için yeni sürümlerdeki netplan status işe yarıyor, arayüzleri, adresleri, route'ları ve DNS'i bir arada gösteriyor.
Ağ ayarları bundan sonra tek bir YAML dosyasında, diğer ayar dosyaları gibi sürüm kontrolüne konabilecek halde duruyor.
Sıradaki yazı: LVM ile diski büyütmek ve snapshot almak