GNU/Linux >> Znalost Linux >  >> Debian

Jak nasadit dynamický DNS server s Dockerem na Debianu 10

Dynamické DNS je síťová služba pro mapování doménových jmen na dynamické (dočasné, často se měnící) IP adresy. Používá se pro přístup k počítačům, které nemají statickou IP adresu, jako jsou ty v sítích SOHO (Small Office/Home Office), a často se používá v kombinaci s přesměrováním portů pro přístup k systémům, které jsou za firewally NAT. Tento článek vás provede kompletním nastavením serveru Dynamic DNS v kontejneru Docker v systému Debian 10, včetně nastavení požadovaných záznamů DNS, umístění rozhraní API pro správu za reverzní proxy Nginx HTTPS a automatizace DNS na straně klienta. aktualizace záznamu.

Požadavky

  • Jeden server Debian 10, volitelně s připojením IPv6. (192.0.2.2 a 2001:0db8::0db9 budou použity jako zástupné symboly pro IPv4 a IPv6 serveru.)
  • Přístup k uživateli root nebo uživateli s právy sudo.
  • Na hostiteli musí být dostupné porty tcp/53 a udp/53.
  • Registrovaný název domény a přístup k jejím jmenným serverům/zónovému souboru. Vytvořte záznamy DNS pro tuto doménu, jak je uvedeno v další části.
  • $EDITOR musí být nastavena proměnná prostředí.
  • Volitelně libovolný klientský systém Linux/Unix pro nastavení automatických aktualizací záznamů DNS.

Vytváření záznamů DNS.

Aby váš dynamický DNS server fungoval, budete muset vytvořit alespoň 2 DNS záznamy. Nejprve vyberte subdoménu, například ns1.your_domain, která bude ukazovat na adresu IPv4 vašeho serveru. Zadruhé vyberte subdoménu, například ddns.your_domain, která bude delegována na ns1.your_domain.

Váš dynamický DNS server bude zpracovávat všechny záznamy pod ddns.vaše_doména. Třetí záznam typu AAAA je volitelný. Odpovídající záznamy vypadají takto:

ns1.your_domain A 192.0.2.2
ddns.your_domain NS ns1.your_domain
ns1.your_domain AAAA 2001:0db8::0db9 (optional)
 

Tyto záznamy byste měli vytvořit v ovládacím panelu vašeho registrátora domény. Vezměte prosím na vědomí, že může trvat až 24 hodin, než se tyto záznamy dobře rozšíří, ale obvykle to trvá minuty.

Instalace

Pokud nepoužíváte uživatele root, doporučujeme spustit dočasné prostředí root, protože většina příkazů uvedených v této příručce vyžadovala zvýšená oprávnění. Chcete-li spustit root shell, použijte jeden z následujících příkazů:

sudo su - root
sudo -s

Krok 1:Aktualizace a instalace závislostí.

Vždy je dobrou praxí nejprve aktualizovat systém:

apt update
apt upgrade -y
reboot

Po restartu nainstalujte softwarové balíčky potřebné pro toto nastavení:

  • certbot budou použity k získání certifikátů SSL/TLS.
  • vyrobit je vyžadován k vytvoření obrazu dockeru, ve kterém poběží server DDNS.
  • apt-transport-https , certifikáty ca , vlnit , gnupg2 a software-properties-common jsou potřebné k instalaci úložiště Docker a jeho odpovídajícího klíče GPG.
  • dnsutils poskytuje dig , který bude použit pro testování.
apt install -y certbot make apt-transport-https curl ca-certificates software-properties-common gnupg2 dnsutils

Krok 2:Nainstalujte Docker CE.

Přidat klíč GPG Docker:

curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -

Nainstalujte úložiště docker:

add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian buster stable"

Aktualizujte mezipaměť úložiště Debianu a poté nainstalujte docker a jeho závislosti:

apt update
apt install -y docker-ce docker-ce-cli containerd.io

Po dokončení instalace se ujistěte, že je služba docker povolena a spuštěna následovně:

systemctl enable --now docker.service

Krok 3:Stažení a vytvoření docker-ddns

Náš dynamický server DNS bude poháněn kontejnerem dockeru, který používá Bind jako server DNS a rozhraní API pro správu napsané v Go. Nejprve naklonujte úložiště Github a vytvořte bitovou kopii kontejneru pomocí následujících příkazů:

git clone https://github.com/dprandzioch/docker-ddns.git
cd docker-ddns
make image

Počkejte na dokončení procesu, což může chvíli trvat, a poté otevřete soubor envfile pomocí textového editoru:

$EDITOR envfile

A zadejte následující:

SHARED_SECRET=your_secret 
ZONE=ddns.your_domain
RECORD_TTL=60

Sdílený tajný klíč je heslo, které bude použito k ověření pomocí rozhraní API pro správu. ZONE označuje, za kterou zónu DNS bude váš server zodpovědný, a záznam TTL určuje, jak dlouho lze záznamy DNS ukládat do mezipaměti. Pro často se měnící dynamické IP adresy se doporučuje TTL 60 sekund.

V případě potřeby můžete vygenerovat náhodný řetězec 40 znaků pro tajný klíč pomocí následujícího příkazu:

cat /dev/urandom | tr -dc "a-zA-Z0-9" | fold -w 40 | head -1

Nyní můžeme vytvořit kontejner:

docker create -it -p 127.0.0.1:8080:8080 -p 53:53 -p 53:53/udp --env-file envfile -v /mnt/ddns-data:/var/cache/bind --name ddns-server davd/docker-ddns

Tento příkaz vytvoří kontejner s názvem ddns-server z obrazu, který jsme vytvořili dříve, a namapuje porty 8080/tcp, 53/tcp a 53/udp z hostitele na kontejner. Také připojí adresář /mnt/ddns-data z hostitele na /var/cache/bind v souborovém systému kontejneru. To se používá pro uchování dat DNS napříč kontejnery.

Ověřte, že byl kontejner vytvořen pomocí příkazu:

docker container ls -a

Výstupem by měl být jeden záznam s názvem ddns-server.

Krok 4:Služba Systemd (volitelné)

Tento krok je pro jednodušší správu, ale není striktně vyžadován. Pokud se rozhodnete službu systemd nepoužívat, budete muset kontejner spravovat ručně nebo použít jiné řešení správy. Upozorňujeme, že pro větší a složitější nasazení kontejnerů se doporučuje řešení orchestrace, jako je Kubernetes nebo Docker Swarm. V tomto případě se služba systemd dokonale hodí, protože provozujeme pouze jeden kontejner.

Abychom mohli tento kontejner spravovat jako systémovou službu, zabalíme jej do systémové jednotky. Pomocí textového editoru vytvořte soubor /etc/systemd/system/ddns-server-ct.service:

$EDITOR /etc/systemd/system/ddns-server-ct.service

A přidejte následující :

[Unit]
Description=DDNS Server Docker Container
After=docker.service
Requires=docker.service
Requires=network.target
[Service]
Type=oneshot
TimeoutStartSec=240
Restart=no
RemainAfterExit=yes
ExecStart=/usr/bin/docker start ddns-server
ExecStop=/usr/bin/docker stop ddns-server
[Install]
WantedBy=multi-user.target

Uložte a ukončete, poté nastavte správná oprávnění pro tento soubor jednotky:

chmod 664 /etc/systemd/system/ddns-server-ct.service

Načtěte nový soubor služby pomocí následujícího příkazu:

systemctl daemon-reload

Nyní byste měli být schopni spustit a zastavit tento kontejner pomocí systemctl jako kteroukoli jinou systémovou službu.

Pokud chcete, aby se server DDNS spouštěl automaticky při spouštění systému, proveďte následující:

systemctl enable ddns-server-ct.service

Krok 5:Testování serveru

Než budeme pokračovat v nastavení, lokálně otestujeme rozhraní API pro správu. Spusťte kontejner:

systemctl start ddns-server-ct.service

Odešlete požadavek GET do rozhraní API k vytvoření nového záznamu:

POZNÁMKA: Rozhraní API je aktuálně dostupné pouze lokálně (tj. z localhost).

curl "http://127.0.0.1:8080/update?secret=your_secret&domain=test1&addr=1.1.1.1"

Curl by měl vrátit následující odpověď:

{"Success":true,"Message":"Updated A record for test1 to IP address 1.1.1.1","Domain":"test1","Domains":["test1"],"Address":"1.1.1.1","AddrType":"A"}

POZNÁMKA: Doména test1 odkazuje na test1.ddns.vaše_doména. protože server zpracovává ddns.vaše_doména. zóny.

Proveďte vyhledávání DNS, abyste ověřili, že byl záznam skutečně vytvořen, a otestujte překlad DNS:

dig +short -t A test1.ddns.your_domain @127.0.0.1

Výstup by měl být 1.1.1.1.

Krok 6:Reverzní proxy

Vzhledem k tomu, že rozhraní API funguje přes HTTP, může být váš ověřovací tajemství potenciálně vyčmuchán, kdykoli odešlete požadavek přes síť. Útočník by pak mohl manipulovat s vašimi záznamy DNS pomocí vašeho tajemství. Nastavíme reverzní proxy pomocí Nginx a zabezpečíme jej pomocí HTTPS. Nejprve získejte certifikát SSL od společnosti Let's Encrypt using certbot:

certbot certonly --standalone --agree-tos -m [email protected] -d ns1.your_domain

Vlastnictví vaší domény bude ověřeno a bude vystaven certifikát. Dále nainstalujte Nginx a ujistěte se, že je povolen a spuštěn:

apt install -y nginx systemctl enable --now nginx.service

Poté deaktivujte výchozí soubor blokování serveru, protože není potřeba:

unlink /etc/nginx/sites-enabled/default

Nyní vytvoříme nový konfigurační soubor pro reverzní proxy, například:

$EDITOR /etc/nginx/sites-available/ddns-api-proxy.conf

A vložte následující a ujistěte se, že jste nahradili IP adresy a názvy domén svými vlastními:

server {
listen 192.0.2.2:8080;
server_name ns1.your_domain;
ssl on;
ssl_certificate /etc/letsencrypt/live/ns1.your_domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ns1.your_domain/privkey.pem;

location /update {
proxy_pass http://127.0.0.1:8080;
}
location / {
return 404;
}
access_log /var/log/nginx/ddns-api-access.log;
error_log /var/log/nginx/ddns-api-error.log;
}

Volitelné: Pokud chcete, aby bylo rozhraní API přístupné přes IPv6, přidejte za existující direktivu naslouchání následující řádek:

listen [2001:0db8::0db9]:8080;

Povolte tuto konfiguraci a použijte změny znovu načtením Nginx:

ln -s /etc/nginx/sites-available/ddns-api-proxy.conf /etc/nginx/sites-enabled/
systemctl reload nginx.service

Rozhraní API by nyní mělo být dostupné přes internet a bude přijímat pouze připojení HTTPS. Chcete-li to otestovat, zadejte příkaz:

curl "https://ns1.your_domain:8080/update?secret=your_secret&domain=test2&addr=1.1.1.2"

Mělo by vrátit následující:

{"Success":true,"Message":"Updated A record for test2 to IP address 1.1.1.2","Domain":"test2","Domains":["test2"],"Address":"1.1.1.2","AddrType":"A"}

Krok 7:Konfigurace klienta

Automatické aktualizace záznamů můžete nastavit na libovolném routeru, který podporuje vlastní dynamické poskytovatele DNS, jako je Pfsense. Můžete je také nastavit na většině ostatních zařízení ve vaší kancelářské nebo domácí síti. Chcete-li aktualizovat nebo vytvořit záznam, měl by být požadavek GET odeslán do následujícího koncového bodu:

https://ns1.your_domain:8080/update?secret=your_secret&domain=your_subdomain&addr=your_ip_address

Můžete také aktualizovat záznamy více subdomén pomocí jednoho požadavku. Chcete-li například vytvořit/aktualizovat záznamy pro sub1.ddns.your_domain a sub2.ddns.your_domain s IP adresou 198.51.100.100, odešlete požadavek GET na tuto adresu URL:

https://ns1.your_domain:8080/update?secret=your_secret&domain=sub1,sub2&addr=198.51.100.100

Parametr addr může také obsahovat adresu IPv6 pro vytvoření/aktualizaci AAAA DNS záznamů, například:

https://ns1.your_domain:8080/update?secret=your_secret&domain=cheese&addr=2001:0db8:aaaa::

Chcete-li automatizovat tyto aktualizace na klientovi Linuxu, uložte následující bash skript jako /opt/ddns-update.sh:

#!/bin/bash

while [ -z $CURRENTIP ] do
CURRENTIP=`dig -r +short myip.opendns.com @resolver1.opendns.com 2>/dev/null`
sleep 1
done
curl -s "https://ns1.your_domain:8080/update?secret=your_secret&domain=your_subdomain&addr=${CURRENTIP}"

Tento skript využívá smyčku while zabalenou kolem příkazu dig, který získá veřejnou IP adresu klienta a uloží ji do proměnné. Smyčka zajišťuje, že veřejná IP je správně načtena. Poté se cURL použije k odeslání požadavku API na aktualizaci DNS záznamu s touto nově získanou IP. Ujistěte se, že jste nahradili hodnoty pro your_secret a your_subdomain.

Dále udělejte tento skript spustitelným:

chmod +x /opt/ddns-update.sh

Poté spusťte editor crontab:

crontab -e

Přidejte následující řádek na konec crontab:

*/2 * * * * /opt/ddns-update.sh

Uložit a odejít. Skript se nyní bude spouštět každé dvě minuty a váš dynamický záznam DNS bude udržovat aktuální s nejnovější veřejnou IP adresou klienta.

Další čtení

  • Článek na Wikipedii o dynamickém DNS
  • docker-ddns na Github

Debian
  1. Jak nainstalovat HTTP Git Server s Nginx na Debian 11

  2. Jak nasadit mikroslužby s Dockerem

  3. Jak nakonfigurovat bránu firewall s CSF na Debianu 9

  1. Jak nastavit FTP server s VSFTPD na Debianu 9

  2. Jak nainstalovat dokumentový server ONLYOFFICE s Nginx na Debian 10

  3. Jak nasadit aplikace s Rancherem

  1. Jak nastavit poštovní server pomocí PostfixAdmin na Debianu 11

  2. Jak nainstalovat Docker na Debian 11

  3. Jak nainstalovat Supabase s Dockerem na Debian 11