Lokalne DNS i Proxy
Lokalne DNS i proxy - jak zapanować nad lokalnymi usługami?

Wprowadzenie
Przychodzi taki moment, w którym Twój domowy HomeLab ma już tyle maszyn wirtualnych, usług i kontenerów, że sam zaczynasz się w tym gubić. Przez pewien czas jeszcze jakoś dajesz radę - w końcu to Ty stawiałeś te usługi i (jeszcze) pamiętasz, co gdzie jest. Jednak domownicy już dawno przestali ogarniać, pod jakim adresem znajdą domową listę zakupów, Home Assistant czy Nextcloud z rodzinnymi plikami. Męczysz się tak przez jakiś czas, aż w pewnym momencie mówisz "dość". Jak to wszystko ogarnąć? Jak przywrócić w tym chaosie porządek? To jest właśnie idealny moment na wprowadzenie lokalnej domeny wraz z własnym serwerem DNS i reverse proxy.
Komu to potrzebne?
No dobrze, mówiąc już zupełnie poważnie: kiedy nadchodzi właściwy moment na zmiany? Jeśli czujesz, że poniższe punkty opisują Twoją sytuację, to znak, że wybiła Twoja godzina zero.
- Masz kilka maszyn wirtualnych z różnymi systemami i usługami.
- Używasz jednego lub kilku hostów Dockera, a Twoje aplikacje działają na wielu różnych portach.
- Zaczynasz zapominać, pod jakim adresem IP i portem kryje się konkretna usługa.
- Chcesz w końcu wpisywać w przeglądarce ładne, czytelne adresy URL zamiast ciągu cyfr.
Jak to wyglądało u mnie?
Zaczynałem od hostowania zaledwie kilku usług na zwykłej "malince". Nie było to rozwiązanie idealne, ale na tamte czasy w zupełności wystarczało. Z biegiem czasu zainwestowałem w lepszy router, przebudowałem sieć i postawiłem Proxmoxa jako główny serwer dla maszyn wirtualnych. Czas mijał i nagle okazało się, że mam do ogarnięcia ponad 20 aplikacji webowych, kilkanaście kontenerów i maszyn wirtualnych oraz kilka urządzeń smart home. Zacząłem szukać odpowiedniego rozwiązania, wdrażać je, eksperymentować i, rzecz jasna, potykać się po drodze. W tym wpisie postaram się pokazać Ci, jak prawidłowo wszystko skonfigurować, abyś mógł uczyć się na moich błędach, zamiast je powielać.
Wiedza, która się przyda
Zanim przejdziemy do samego "mięska", upewnij się, że kojarzysz poniższe zagadnienia. Nie będziemy tutaj robić akademickiego wykładu i nie potrzebujesz wiedzy na poziomie profesora z trzema fakultetami, ale warto znać absolutne podstawy. Co zatem powinieneś wiedzieć?
- Docker i Docker Compose - przynajmniej tyle, by wiedzieć, jak uruchomić kontener.
- Działanie protokołu DNS - czym są rekordy A czy CNAME i jak komputer tłumaczy nazwy na adresy IP.
- Obsługa domowego routera - musisz wiedzieć, jak zalogować się do swojego sprzętu i gdzie szukać ustawień sieciowych.
- Poruszanie się po Linuksie - wystarczą bazowe komendy w terminalu (SSH, edycja plików).
Zaczynamy
Na start kilka ustaleń technicznych. W naszym projekcie użyjemy kontenerów opartych na oprogramowaniu Technitium DNS Server oraz Nginx Proxy Manager. Oba te rozwiązania są otwartoźródłowe (open-source) i z powodzeniem od dłuższego czasu testuję je we własnej sieci.
Jeśli chodzi o konfigurację domowego routera - osobiście pracuję na urządzeniu marki MikroTik. Ponieważ Twój domowy sprzęt prawdopodobnie wygląda i działa inaczej, w tym poradniku pokażę jedynie poglądowo, jakich opcji i gdzie powinieneś szukać w swoim panelu zarządzania. No to co? Gotowy?
Przygotowanie maszyny wirtualnej
Zakładam, że masz już przygotowaną maszynę wirtualną, dlatego pominiemy tutaj sam proces instalacji systemu. Upewnij się jedynie, że Twoja VM-ka ma włączony autostart, a system jest w pełni zaktualizowany. W moim przypadku jest to maszyna postawiona na Proxmoxie, z zainstalowanym Ubuntu Server 24.04 LTS.
Instalacja Docker i Docker Compose
Wykonaj podane komendy, aby zainstalować Docker:
Aktualizacja systemu i instalacja zależności
sudo apt update
sudo apt install -y ca-certificates curl gnupgDodanie oficjalnego klucza GPG od Dockera
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.ascDodanie repozytorium Dockera
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullInstalacja Docker Engine + Docker Compose plugin
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginDodanie użytkownika do grupy Docker
sudo usermod -aG docker $USER
newgrp dockerPo dodaniu użytkownika warto wylogować się i zalogować ponownie, albo zrestartować maszynę.
Weryfikacja instalacji
docker --version
docker compose versionObie komendy powinny zwrócić wersję Docker i pluginu Docker Compose.
Przygotowanie miejsca na kontenery
No dobra, mamy już maszynę z Dockerem, teraz czas wybrać miejsce, gdzie będziemy trzymać pliki kontenerów. Ja osobiście proponuję utworzyć katalog /srv/docker/, a w nim osobne katalogi dla każdej usługi. W naszym przypadku będzie to zatem:
sudo mkdir -p /srv/docker/technitium-dns
sudo mkdir -p /srv/docker/npmPodane komendy utworzą nam dwa katalogi, jeden dla serwera DNS, a drugi dla NPM (Proxy).
Następnie musimy jeszcze przypisać naszego użytkownika jako właściciela utworzonych katalogów:
sudo chown -R $USER:$USER /srv/docker/technitium-dns
sudo chown -R $USER:$USER /srv/docker/npmInstalacja Technitium DNS Server
Przygotowanie plików
W katalogu /srv/docker/technitium-dns dodaj plik docker-compose.yml z podaną treścią:
services:
dns-server:
container_name: dns-server
image: technitium/dns-server:latest
restart: unless-stopped
ports:
- "5380:5380/tcp"
- "53:53/udp"
- "53:53/tcp"
environment:
- DNS_SERVER_DOMAIN=dns.twojadomena.internal
- DNS_SERVER_ADMIN_PASSWORD=zmien_to_haslo
- DNS_SERVER_FORWARDERS=1.1.1.1,8.8.8.8
volumes:
- ./config:/etc/dns
sysctls:
- net.ipv4.ip_local_port_range=1024 65535Krótkie wytłumaczenie:
- DNS_SERVER_DOMAIN - Ustaw zgodnie z Twoją domeną, którą chcesz dodać (np. dns.twojadomena.internal)
- DNS_SERVER_ADMIN_PASSWORD - Ustaw hasło administratora
- DNS_SERVER_FORWARDERS - Bez tego, jeśli serwer nie będzie potrafił rozwiązać nazwy domeny, zwróci NX_DOMAIN. Dla przykładu, jeśli nie chcesz ręcznie podawać adresu dla google.com (a nie chcesz), to serwer DNS zamiast zwrócić NX_DOMAIN, najpierw odpyta globalne serwery DNS, czy one przypadkiem nie wiedzą, jak rozwiązać tę domenę na IP.
Mała uwaga, w domowym DNS używaj domeny kończącej się na .internal, a nie na .local. W przypadku użycia domeny .local możesz mieć problemy z mDNS.
Uruchomienie kontenera
W katalogu, w którym znajduje się plik docker-compose.yml, wykonaj:
docker compose up -dKomenda powinna automatycznie pobrać najnowszy obraz oraz uruchomić kontener.
Problem z uruchomieniem kontenera, port 53 zajęty
Jeśli podczas uruchamiania kontenera dostaniesz błąd, który kończy się mniej więcej tak:
port 0.0.0.0:53/tcp: address already in useTo znaczy, że najprawdopodobniej usługa systemd-resolved zajmuje port 53.
Możesz to potwierdzić komendą:
sudo ss -tulpn | grep :53Jeśli w wyniku zobaczysz systemd-resolved, wykonaj kroki poniżej:
Edytuj plik konfiguracyjny:
sudo nano /etc/systemd/resolved.confZnajdź linię z wartością DNSStubListener= i upewnij się, że wartość to no.
Następnie zrestartuj usługę:
sudo systemctl restart systemd-resolvedPo wykonaniu tych komend port powinien zostać zwolniony i możesz ponownie spróbować uruchomić kontener.
Instalacja Nginx Proxy Manager
Przygotowanie plików
W katalogu /srv/docker/npm dodaj plik docker-compose.yml z podaną treścią:
services:
app:
container_name: npm-proxy
image: jc21/nginx-proxy-manager:latest
restart: unless-stopped
ports:
- "80:80"
- "81:81"
- "443:443"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencryptUruchomienie kontenera
W katalogu, w którym znajduje się plik docker-compose.yml, wykonaj:
docker compose up -dKomenda powinna automatycznie pobrać najnowszy obraz oraz uruchomić kontener.
Szybkie podsumowanie tego, co już mamy
A zatem uruchomiłeś już kontenery z serwerem DNS oraz Proxy. Teraz zacznie się zabawa, ale najpierw upewnij się, że możesz się zalogować do obu serwisów.
| Serwis | Adres | Login / Hasło |
|---|---|---|
| DNS | http://ip_maszyny:5380 | admin / ustawione_w_pliku |
| Proxy | http://ip_maszyny:81 | admin@example.com / changeme |
Dodawanie pierwszego wpisu do DNS
Dobra, to teraz, jak dodać pierwszy rekord DNS? Dla przykładu dodamy OwnCloud dla naszej domowej domeny.
Dodaj strefę
Przejdź do zakładki "Zones" i kliknij w przycisk dodawania nowej strefy: 
Dodaj nową strefę zgodną z Twoją domeną: 
Zostaniesz teraz automatycznie przeniesiony do zakładki z utworzoną właśnie. Wszystkie rekordy DNS będziemy dodawać w tym miejscu.
Dodajmy wspomniany rekord dla OwnCloud: 

Przy okazji, warto skorzystać z pola "Comments" i krótko opisać każdy dodawany rekord - po kilkunastu usługach naprawdę ułatwia to późniejszą orientację w strefie.
Gotowe, rekord został dodany, ale jeszcze nie będziesz mógł z niego skorzystać - a to dlatego, że w moim przypadku OwnCloud tak naprawdę nasłuchuje na porcie 3000, a nie 80. W dalszej części wpisu, przeznaczonej dla usług działających na niestandardowych portach, zajmiemy się tym tematem.
Proxy, po co mi to?
Na dobrą sprawę mogę Ci teraz powiedzieć - mamy koniec, ale nie do końca. Pomyślmy o przypadku, gdzie usługa, którą masz w domu, nie działa na porcie 80 (http) lub 443 (https), tylko dla przykładu na 3000. Weźmy na tapet mój przypadek. OwnCloud działa na hoście 192.168.88.20 i porcie 3000. We wcześniejszym kroku dodaliśmy już rekord DNS dla OwnCloud, który pozwoli nam na przetłumaczenie adresu owncloud.twojadomena.internal na adres, na którym znajduje się usługa. Niestety, po wpisaniu w przeglądarce http://owncloud.twojadomena.internal dostajemy smutną szarą stronę z błędem. Wszystko dlatego, że na początku masz napisane http lub https, co przeglądarka rozumie jako adres:80 lub adres:443. Zatem wpisując w przeglądarkę adresy będziesz dobijał się do usług działających na domyślnych portach http. No to teraz, jak to zmienić?
Sprawdź na jakim porcie działa Twoja usługa
W moim przypadku, jak już wspomniałem, posłużymy się przykładem usługi OwnCloud działającej na porcie 3000. W zależności od tego, jakiej usługi używasz i jak ją skonfigurowałeś, musisz wiedzieć, jaki ma port i adres.
Dodajemy przekierowanie na Proxy
W panelu NPM przejdź do zakładki "Proxy Hosts" i dodaj pierwszy host:

Teraz dodamy właściwe przekierowanie: 
Co tu mamy?
- "Domain Names" - tutaj wpisz nazwę, jaką nadałeś swojej usłudze. W moim przypadku będzie to
owncloud.twojadomena.internal. - "Scheme" - w zależności od tego, czy Twoja usługa działa po http, czy po https z SSL, wybierz właściwą opcję.
- "Forward Hostname / IP" - W tym miejscu podaj adres, na jakim działa usługa.
- "Forward Port" - Port usługi, w moim przypadku wspomniany 3000.
Reszta ustawień jak na zdjęciu. Po wypełnieniu wszystkich wartości możesz kliknąć przycisk "Save". 
Co dalej?
Mamy przekierowanie na prawidłowy host i port usługi OwnCloud, ale rekord DNS, który dodaliśmy, omija proxy. Teraz mamy tak:
- Przeglądarka pyta serwer DNS o nazwę
owncloud.twojadomena.internali w odpowiedzi dostaje adres maszyny z usługą. - Przeglądarka kieruje się na ten adres i otrzymuje błąd (np. ERR_CONNECTION_REFUSED), bo usługa nasłuchuje na porcie 3000, a nie na domyślnym 80/443.
A teraz między to wszystko chcemy dodać proxy:
- Przeglądarka pyta serwer DNS o nazwę
owncloud.twojadomena.internali w odpowiedzi dostaje adres serwera proxy NPM. - Przeglądarka kieruje się na serwer proxy, podając w nagłówkach zapytania, że chodzi jej konkretnie o
owncloud.twojadomena.internal. - Proxy, zgodnie z wpisem, "tuneluje" ruch na podany adres i port w konfiguracji NPM.
- Użytkownik widzi w przeglądarce prawidłowo załadowany OwnCloud.
Zatem co musimy zmienić? Wystarczy, że cofniesz się do poprzedniego kroku, gdzie konfigurowaliśmy rekordy DNS. Edytuj lub dodaj rekord tak, aby nazwa Twojej usługi, zamiast prowadzić wprost do niej, szła przez Proxy. Najprościej mówiąc, zamiast podawać adres IP maszyny z OwnCloud, podaj adres maszyny z Proxy.
Wszystko skonfigurowane, ale u mnie nie działa :(
No tak, bo został nam jeszcze ostatni krok. Teraz (zakładając, że nigdy nie zmieniałeś nic w ustawieniach DNS swojej sieci), z dużą dozą prawdopodobieństwa Twój komputer wysyła zapytanie o rozwiązanie adresu Twojej usługi do publicznego serwera DNS. W większości przypadków będzie to 1.1.1.1 i 8.8.8.8. Te serwery oczywiście nie mają zielonego pojęcia o Twojej lokalnej domenie.
Jak to zmienić?
Najlepiej ustawić serwer DNS dla sieci lokalnej w ustawieniach Twojego routera. W moim przypadku wygląda to mniej więcej tak:
To są ustawienia w moim MikroTiku, ale w zależności od routera i producenta każdy umieszcza taką opcję w innym miejscu panelu. No więc jako zadanie domowe, ostatnie, co masz do zrobienia, to poszukać w internecie dokumentacji i sprawdzić, gdzie ustawić serwer DNS dla sieci lokalnej.
Mała uwaga
Zanim zaczniesz modyfikować ustawienia routera, zacznij od ustawienia serwera DNS ręcznie na swoim laptopie. Lepiej sprawdzić, czy wszystko działa na jednym sprzęcie, niż iść na całość.
Podsumowanie
Udało nam się skonfigurować rekord DNS dla pierwszej usługi, a następnie wprowadzić proxy, aby ułatwić sobie życie z portami. Dla klarowności, jeśli Twoja usługa korzysta z domyślnych portów http, to możesz śmiało pominąć proxy - nie ma sensu dokładać sobie roboty.
Na koniec
Zrób sobie listę wszystkich usług, jakie masz w domu. Sprawdź, które z nich potrzebują proxy, a dla których starczy jeden rekord DNS. Systematycznie dodawaj usługi do swojej domeny i każdorazowo sprawdzaj, czy wszystko działa.
Ode mnie to tyle, powodzenia!