mDNS ve Zeroconf Ağ Keşfi: avahi-browse ve avahi-resolve Komutları ile Yerel Ağda Servis Bulma

Ofis ağında yeni bir yazıcı kuruldu, sen de IP’sini bulmak için sırayla tüm makinelere soruyorsun. Ya da geliştirme ortamında bir servis ayağa kalktı ama hangi adreste dinlediğini bilmiyorsun. Bu senaryoları muhtemelen tanıyorsundur. İşte tam burada mDNS ve Zeroconf devreye giriyor ve hayatı ciddi ölçüde kolaylaştırıyor.

mDNS ve Zeroconf Nedir, Neden Önemlidir

Klasik DNS altyapısında bir isim çözümleme işlemi için merkezi bir DNS sunucusuna ihtiyaç duyarsın. Küçük ofis ağlarında, ev ağlarında veya geçici test ortamlarında bu sunucuyu kurmak ve yönetmek gereksiz bir yük oluşturur. Zeroconf (Zero Configuration Networking) tam olarak bu sorunu çözmek için geliştirilmiş bir teknikler bütünüdür.

mDNS (Multicast DNS), RFC 6762 ile standartlaşmış bir protokoldür. Yerel ağdaki cihazlar, DNS sorguları için bir sunucuya gitmek yerine 224.0.0.251 (IPv4) veya ff02::fb (IPv6) multicast adreslerine sorgu gönderir. Ağdaki ilgili cihaz bu sorguyu duyar ve kendi kendine cevap verir. Bu yapı sayesinde merkezi bir sunucu olmadan .local alan adı çözümlemesi mümkün hale gelir.

DNS-SD (DNS Service Discovery), RFC 6763 ile tanımlanmıştır ve mDNS üzerine inşa edilmiştir. Bir servisin ağda kendini duyurmasını ve başka cihazların bu servisi keşfetmesini sağlar. Apple’ın Bonjour protokolü de aslında bu standartların Apple tarafından implemente edilmiş halidir.

Linux dünyasında bu protokollerin referans implementasyonu Avahi‘dir. Neredeyse tüm büyük dağıtımlarda varsayılan olarak gelir veya kolayca kurulabilir.

Avahi Kurulumu ve Temel Yapılandırma

Debian/Ubuntu tabanlı sistemlerde kurulum şu şekilde yapılır:

sudo apt update
sudo apt install avahi-daemon avahi-utils libnss-mdns

RHEL/CentOS/AlmaLinux tabanlı sistemlerde:

sudo dnf install avahi avahi-tools nss-mdns

Kurulumdan sonra servisi başlatıp enable etmek gerekir:

sudo systemctl enable --now avahi-daemon
sudo systemctl status avahi-daemon

/etc/avahi/avahi-daemon.conf dosyası temel yapılandırmayı barındırır. Çok arayüzlü bir sunucuda hangi interface’lerin kullanılacağını belirlemek için bu dosyayı düzenlemek gerekebilir:

# /etc/avahi/avahi-daemon.conf içindeki ilgili kısım
[server]
host-name=sunucu01
domain-name=local
use-ipv4=yes
use-ipv6=yes
allow-interfaces=eth0,eth1
deny-interfaces=docker0,virbr0

Docker veya libvirt gibi araçların oluşturduğu sanal ağ arayüzlerini deny-interfaces ile dışlamak önemlidir. Aksi takdirde Avahi bu arayüzlere de multicast paket gönderir ve gereksiz trafik oluşur.

/etc/nsswitch.conf dosyasında mdns4_minimal veya mdns4 değerinin hosts satırında bulunduğundan emin olmalısın:

grep hosts /etc/nsswitch.conf
# Şu çıktıyı görmelisin:
# hosts: files mdns4_minimal [NOTFOUND=return] dns

Bu yapılandırma olmadan .local adreslerini ping ile çözemezsin.

avahi-browse: Ağdaki Servisleri Keşfetmek

avahi-browse komutu, yerel ağda duyurulan DNS-SD servislerini listelemek için kullanılır. En temel kullanımı şu şekildedir:

avahi-browse -a

Bu komut tüm servisleri listeler ancak sürekli çalışmaya devam eder ve yeni servisler göründükçe ya da kaybolunca güncelleme yapar. Listeyi alıp çıkmak istiyorsan -t (terminate) parametresini eklemen gerekir:

avahi-browse -at

Çıktı şöyle görünür:

+   eth0 IPv4 HP LaserJet Pro M404n              _pdl-datastream._tcp local
+   eth0 IPv4 MacBook-Pro                        _ssh._tcp            local
+   eth0 IPv4 nas-server                         _smb._tcp            local
+   eth0 IPv6 nas-server                         _smb._tcp            local

Her satırda sırasıyla: durum (+ eklenme, - kaldırılma), ağ arayüzü, protokol versiyonu, servis adı, servis tipi ve domain bilgisi bulunur.

Belirli bir servis tipini aramak için:

avahi-browse _http._tcp

Bu komut sadece HTTP servislerini listeler. Ağda hangi sunucuların web servisi duyurduğunu hızlıca görmek için ideal bir kullanım senaryosudur.

Daha fazla detay almak için -r (resolve) parametresini kullanabilirsin. Bu parametre her servisin IP adresini ve portunu da çözer:

avahi-browse -art

Bu komutun çıktısı çok daha zengindir:

+   eth0 IPv4 web-dev-01                        _http._tcp           local
=   eth0 IPv4 web-dev-01                        _http._tcp           local
   hostname = [web-dev-01.local]
   address = [192.168.1.105]
   port = [8080]
   txt = ["path=/" "version=1.2"]

= işareti servisin başarıyla çözümlendiğini gösterir. txt alanı servis hakkında ekstra metadata içerir; bu alan uygulama tarafından serbestçe doldurulabilir.

Tüm ağ arayüzlerindeki servisleri görmek için:

avahi-browse -a --no-fail -t

--no-fail parametresi, Avahi daemon’ı henüz başlamamışsa komutun hata vermek yerine beklemesini sağlar. Script içinde kullanırken işe yarar.

avahi-resolve: İsim ve IP Çözümleme

avahi-resolve komutu, .local domain adlarını IP adresine veya tersine çevirmek için kullanılır.

Hostname’den IP’ye çözümleme:

avahi-resolve -n nas-server.local

Çıktı:

nas-server.local    192.168.1.200

IP adresinden hostname’e ters çözümleme:

avahi-resolve -a 192.168.1.200

Çıktı:

192.168.1.200   nas-server.local

IPv6 adresi çözümlemek için -6 parametresini kullanabilirsin:

avahi-resolve -n6 nas-server.local

Birden fazla hostname’i tek seferde çözümlemek de mümkün:

avahi-resolve -n printer.local nas-server.local dev-box.local

Bu kullanım özellikle script yazarken oldukça pratiktir.

Gerçek Dünya Senaryoları

Senaryo 1: Geliştirme Ortamında Servis Envanteri

Birden fazla geliştirici makinesinin bulunduğu bir ofis ağı hayal et. Her makine farklı servisler çalıştırıyor: kimi PostgreSQL, kimi Redis, kimi de özel bir REST API. Tüm bu servislerin envanterini tutmak için merkezi bir yapı kurmak yerine mDNS kullanabilirsin.

Önce ağdaki tüm HTTP servislerini bulalım:

avahi-browse -art | grep -A5 "_http._tcp"

Sonra bu çıktıdan IP ve port bilgilerini parse ederek basit bir envanter oluşturabiliriz:

#!/bin/bash
echo "=== HTTP Servisleri ==="
avahi-browse -rpt _http._tcp 2>/dev/null | while IFS=';' read -r status iface proto name type domain hostname address port txt; do
    if [ "$status" = "=" ]; then
        echo "Servis: $name | Adres: $address | Port: $port"
    fi
done

-p parametresi çıktıyı programlanabilir (parseable) formata getirir, bu sayede ; ile ayrılmış alanları kolayca işleyebilirsin.

Senaryo 2: Ağ Sorun Giderme

Bir servis .local adıyla ulaşılamamaya başladı. avahi-browse ile önce servisin ağda duyurulup duyurulmadığını kontrol edebilirsin:

avahi-browse -rpt _ssh._tcp | grep "sunucu-adi"

Servis listede görünüyorsa ama bağlantı kurulamıyorsa sorun uygulama katmanındadır. Görünmüyorsa ya servis çökmüştür ya da Avahi yapılandırmasında sorun vardır.

Aynı zamanda avahi-resolve ile isme karşılık gelen IP’yi doğrulayabilirsin:

avahi-resolve -n sorunlu-sunucu.local
# Ardından bu IP'ye klasik araçlarla bağlanmayı dene
ping -c 3 $(avahi-resolve -n sorunlu-sunucu.local | awk '{print $2}')

Senaryo 3: IoT Cihaz Keşfi

Akıllı ofis ekipmanları, IoT sensörleri veya Raspberry Pi tabanlı cihazlar çoğunlukla mDNS kullanır. Ağa yeni eklenen bir cihazı bulmak için:

# Tüm servisleri izlemeye al, yeni gelen cihazları yakala
avahi-browse -a | grep "+"

Özellikle _googlecast._tcp servisi Chromecast cihazlarını, _airplay._tcp Apple TV ve benzeri cihazları, _ipp._tcp de ağ yazıcılarını bulmanı sağlar:

avahi-browse -art | grep -E "_googlecast|_airplay|_ipp"

Servisleri Avahi ile Duyurmak

Sadece keşfetmekle kalmayıp kendi servislerini de ağda duyurabilirsin. Bunun için /etc/avahi/services/ dizinine XML formatında tanım dosyaları oluşturman yeterlidir.

Örneğin 8080 portunda çalışan bir web uygulamasını duyurmak için:

sudo tee /etc/avahi/services/webapp.service << 'EOF'
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
  <name replace-wildcards="yes">Web App - %h</name>
  <service>
    <type>_http._tcp</type>
    <port>8080</port>
    <txt-record>path=/api</txt-record>
    <txt-record>version=2.0</txt-record>
  </service>
</service-group>
EOF

Bu dosyayı oluşturduktan sonra Avahi daemon’ı yeniden başlatmaya gerek yoktur; dosyayı otomatik olarak algılar ve servisi anında duyurmaya başlar. Kontrol etmek için başka bir makineden:

avahi-browse -art _http._tcp

avahi-publish komutuyla geçici olarak (daemon restart edilene kadar) da servis duyurabilirsin:

# Tek seferlik, geçici servis duyurusu
avahi-publish -s "Test Servisi" _http._tcp 9090 "path=/test"

Bu yöntem özellikle geliştirme sırasında hızlı test için kullanışlıdır.

avahi-browse Parametrelerinin Özeti

En çok kullanılan parametreler:

  • -a: Tüm servis tiplerini listele
  • -r: Bulunan servisleri otomatik olarak resolve et
  • -t: Tüm servisler alındıktan sonra çık (terminate)
  • -p: Makine tarafından okunabilir (parseable) format kullan
  • -v: Verbose mod, daha fazla bilgi göster
  • -l: Sadece yerel (loopback değil) servisleri göster
  • -d: Belirli bir domain belirle (varsayılan: local)
  • –no-fail: Daemon hazır değilse bekle, hata verme
  • -k: Cachellenmiş girdileri de göster

avahi-resolve Parametrelerinin Özeti

  • -n: Hostname’den adrese çözümleme (normal resolution)
  • -a: Adresten hostname’e çözümleme (reverse resolution)
  • -4: Sadece IPv4 adresi döndür
  • -6: Sadece IPv6 adresi döndür
  • -v: Verbose mod
  • –no-fail: Daemon hazır değilse bekle

Güvenlik Notları

mDNS kullanırken göz önünde bulundurman gereken birkaç nokta var. mDNS trafiği varsayılan olarak link-local’dır, yani router’lar bu trafiği yönlendirmez. Bu hem bir güvenlik özelliği hem de bir kısıtlamadır.

Ancak şirket ağlarında bile bazı riskler mevcuttur. Bir saldırgan ağa erişim sağladıktan sonra avahi-browse -at ile tüm iç servislerin haritasını çıkarabilir. Bu yüzden üretim ortamlarında hassas servisleri mDNS ile duyurmaktan kaçınmak ve Avahi’yi yalnızca geliştirme/test ortamlarında etkin bırakmak yerinde olur.

avahi-daemon.conf içinde publish-workstation=no ve publish-hinfo=no ayarlarını yapmak, gereksiz sistem bilgilerinin ağda yayınlanmasını önler:

# /etc/avahi/avahi-daemon.conf
[publish]
publish-hinfo=no
publish-workstation=no

Sonuç

mDNS ve Zeroconf, özellikle geliştirme ortamları, küçük ofis ağları ve IoT projeleri için DNS altyapısı kurmadan servis keşfini mümkün kılan güçlü araçlardır. avahi-browse ile ağdaki servislerin anlık envanterini çıkarabilir, yeni eklenen cihazları tespit edebilir ve sorun giderme süreçlerini hızlandırabilirsin. avahi-resolve ise .local domain’lerini script’lere entegre ederken vazgeçilmez bir araç haline gelir.

Bu araçlar sistem yöneticisi olarak araç kutunda kesinlikle bulunması gereken komutlar arasında yer alıyor. Özellikle container ortamlarının yaygınlaştığı ve servis sayısının sürekli arttığı günümüzde, lightweight bir servis keşif mekanizması olarak Avahi’nin değerini küçümsememek gerekiyor. Consul veya etcd gibi ağır alternatiflere geçmeden önce Avahi’nin senin kullanım senaryonu karşılayıp karşılamadığını değerlendirmek mantıklı bir başlangıç noktası olacaktır.

Bir yanıt yazın

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