7 posts 31 tags 7 domains

mDNS alias w sieci lokalnej przez Avahi

Jak wystawić dowolną domenę *.local w sieci LAN bez DNS-a, routera ani /etc/hosts. Jeden plik systemd i nazwa działa na wszystkich urządzeniach.

Problem

Masz serwer (Raspberry Pi, VPS lokalny, stara maszyna) i chcesz żeby mojaprojekt.local działało na wszystkich urządzeniach w sieci domowej — bez grzebania w routerze, bez stawiania DNS-a, bez dodawania wpisów w /etc/hosts na każdym komputerze osobno.

Rozwiązanie: Avahi + avahi-publish-address + systemd service.

1. Sprawdź czy Avahi jest zainstalowany

bash
$systemctl status avahi-daemon
● avahi-daemon.service - Avahi mDNS/DNS-SD Stack
Active: active (running)

Jeśli nie:

bash
$sudo apt install avahi-daemon

2. Znajdź adres IP serwera

bash
$hostname -I
192.168.2.203

Zanotuj adres — będzie potrzebny w serwisie.

3. Stwórz plik systemd

Utwórz /etc/systemd/system/avahi-NAZWA.service — zamień NAZWA i adres IP na swoje:

bash
$sudo nano /etc/systemd/system/avahi-mojaprojekt.service
ini
[Unit]
Description=mDNS alias mojaprojekt.local
After=avahi-daemon.service
Requires=avahi-daemon.service

[Service]
ExecStart=/usr/bin/avahi-publish-address -R mojaprojekt.local 192.168.2.203
Restart=on-failure
RestartSec=3

[Install]
WantedBy=multi-user.target

4. Włącz i uruchom

bash
$sudo systemctl daemon-reload
$sudo systemctl enable --now avahi-mojaprojekt.service
$sudo systemctl status avahi-mojaprojekt.service
● avahi-mojaprojekt.service - mDNS alias mojaprojekt.local
Active: active (running)

5. Weryfikacja

Z dowolnego urządzenia w sieci lokalnej:

bash
$ping mojaprojekt.local
PING mojaprojekt.local (192.168.2.203): 56 data bytes
64 bytes from 192.168.2.203: icmp_seq=0 ttl=64 time=1.2 ms

Na macOS możesz też użyć:

bash
$dns-sd -G v4 mojaprojekt.local

Kilka aliasów naraz

Każda domena = osobny plik serwisu. Skopiuj i podmień nazwę:

bash
$sudo cp /etc/systemd/system/avahi-mojaprojekt.service \
/etc/systemd/system/avahi-innyprojekt.service
$sudo sed -i 's/mojaprojekt/innyprojekt/g' \
/etc/systemd/system/avahi-innyprojekt.service
$sudo systemctl daemon-reload
$sudo systemctl enable --now avahi-innyprojekt.service

Połączenie z Apache / nginx

Avahi ogłasza tylko nazwę DNS — żeby serwer webowy wiedział który vhost obsłużyć, musisz dodać VirtualHost (Apache) lub server_name (nginx).

Przykład dla Apache:

bash
$sudo nano /etc/apache2/sites-available/mojaprojekt.conf
nginx
<VirtualHost *:80>
    ServerName mojaprojekt.local
    DocumentRoot /var/www/mojaprojekt/public

    <Directory /var/www/mojaprojekt/public>
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
bash
$sudo a2ensite mojaprojekt.conf
$sudo systemctl reload apache2

Co się dzieje pod spodem

avahi-publish-address wysyła do sieci pakiet mDNS ogłaszający że mojaprojekt.local192.168.2.203. Każde urządzenie z obsługą mDNS słyszy to rozgłoszenie i zapamiętuje mapowanie bez żadnego centralnego DNS-a. Rekord ma krótki TTL (kilka sekund) — dlatego po restarcie serwisu wszystko wraca do normy samoczynnie.