ダイナミックDNSは、ドメイン名を動的な(一時的で頻繁に変更される)IPアドレスにマッピングするためのネットワークサービスです。 SOHO(Small Office / Home Office)ネットワークなど、静的IPアドレスを持たないコンピューターにアクセスするために使用され、NATファイアウォールの背後にあるシステムにアクセスするためのポート転送と組み合わせて使用されることがよくあります。この記事では、必要なDNSレコードの設定、Nginx HTTPSリバースプロキシの背後への管理APIの配置、クライアント側DNSの自動化など、Debian10システムのDockerコンテナでのダイナミックDNSサーバーの完全な設定について説明します。更新を記録します。
- 単一のDebian10サーバー、オプションでIPv6接続。 (192.0.2.2および2001:0db8 ::0db9は、それぞれサーバーのIPv4およびIPv6のプレースホルダーとして使用されます。)
- rootユーザーまたはsudo権限を持つユーザーへのアクセス。
- ポートtcp/53およびudp/53がホストで使用可能である必要があります。
- 登録されたドメイン名とそのネームサーバー/ゾーンファイルへのアクセス。次のセクションに示すように、このドメインのDNSレコードを作成します。
- $ EDITOR 環境変数を設定する必要があります。
- オプションで、自動DNSレコード更新をセットアップする任意のLinux/Unixクライアントシステム。
ダイナミックDNSサーバーが機能するには、少なくとも2つのDNSレコードを作成する必要があります。まず、サーバーのIPv4アドレスを指すns1.your_domainなどのサブドメインを選択します。次に、ns1.your_domainに委任されるddns.your_domainなどのサブドメインを選択します。
ダイナミックDNSサーバーは、ddns.your_domainの下のすべてのレコードを処理します。タイプAAAAの3番目のレコードはオプションです。対応するレコードは次のようになります。
ns1.your_domain A 192.0.2.2
ddns.your_domain NS ns1.your_domain
ns1.your_domain AAAA 2001:0db8::0db9 (optional)
これらのレコードは、ドメインレジストラのコントロールパネルで作成する必要があります。これらのレコードが適切に伝播されるまでに最大24時間かかる場合がありますが、通常は数分かかることに注意してください。
rootユーザーを使用していない場合は、このガイドに示されているほとんどのコマンドに昇格された特権が必要なため、一時的なrootシェルを開始することをお勧めします。ルートシェルを起動するには、次のいずれかのコマンドを使用します。
sudo su - root
sudo -s
ステップ1:依存関係の更新とインストール。
最初にシステムを更新することをお勧めします:
apt update
apt upgrade -y
reboot
再起動後、このセットアップに必要なソフトウェアパッケージをインストールします。
- certbot SSL/TLS証明書を取得するために使用されます。
- 作成 DDNSサーバーが実行されるDockerイメージを構築するために必要です。
- apt-transport-https 、ca-証明書 、カール 、 gnupg2 およびsoftware-properties-common Dockerリポジトリとそれに対応するGPGキーをインストールするには必要です。
- dnsutils digを提供します 、テストに使用されます。
apt install -y certbot make apt-transport-https curl ca-certificates software-properties-common gnupg2 dnsutils
ステップ2:DockerCEをインストールします。
DockerのGPGキーを追加します:
curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
Dockerリポジトリをインストールします:
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian buster stable"
Debianのリポジトリキャッシュを更新してから、dockerとその依存関係をインストールします:
apt update
apt install -y docker-ce docker-ce-cli containerd.io
インストールが完了したら、次のようにDockerサービスが有効になって実行されていることを確認します。
systemctl enable --now docker.service
ステップ3:docker-ddnsをダウンロードしてビルドする
ダイナミックDNSサーバーは、DNSサーバーとしてBindを使用するDockerコンテナーと、Goで記述された管理APIを利用します。まず、Githubリポジトリのクローンを作成し、次のコマンドを使用してコンテナイメージをビルドします。
git clone https://github.com/dprandzioch/docker-ddns.git
cd docker-ddns
make image
プロセスが終了するのを待ちます。これにはしばらく時間がかかる場合があります。その後、テキストエディタでファイルenvfileを開きます。
$EDITOR envfile
そして、次のように入力します:
SHARED_SECRET=your_secret
ZONE=ddns.your_domain
RECORD_TTL=60
共有シークレットは、管理APIでの認証に使用されるパスワードです。 ZONEは、サーバーが担当するDNSゾーンを示し、レコードTTLは、DNSレコードをキャッシュできる期間を指定します。動的IPを頻繁に変更する場合は、60秒のTTLをお勧めします。
必要に応じて、次のコマンドを使用して、シークレットのランダムな40文字の文字列を生成できます。
cat /dev/urandom | tr -dc "a-zA-Z0-9" | fold -w 40 | head -1
これでコンテナを作成できます:
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
このコマンドは、前に作成したイメージからddns-serverという名前のコンテナーを作成し、ホストからのポート8080 / tcp、53 / tcp、および53/udpをコンテナーにマップします。また、コンテナのファイルシステムの/ var / cache/bindにあるホストからディレクトリ/mnt/ddns-dataをマウントします。これは、コンテナのレクリエーション全体でDNSデータを永続化するために使用されます。
次のコマンドでコンテナが作成されたことを確認します:
docker container ls -a
ddns-serverという名前の単一のエントリを出力する必要があります。
ステップ4:Systemdサービス(オプション)
この手順は管理を簡単にするためのものですが、厳密には必須ではありません。 systemdサービスを使用しない場合は、コンテナーを手動で管理するか、別の管理ソリューションを使用する必要があります。より大規模で複雑なコンテナのデプロイには、KubernetesやDockerSwarmなどのオーケストレーションソリューションが推奨されることに注意してください。この場合、単一のコンテナーのみを実行しているため、systemdサービスは完全に適合しています。
このコンテナをシステムサービスとして管理できるように、systemdユニットでラップします。テキストエディタでファイル/etc/systemd/system/ddns-server-ct.serviceを作成します:
$EDITOR /etc/systemd/system/ddns-server-ct.service
そして、以下を追加します:
[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
保存して終了し、このユニットファイルに正しい権限を設定します:
chmod 664 /etc/systemd/system/ddns-server-ct.service
次のコマンドを使用して、新しいサービスファイルをロードします。
systemctl daemon-reload
これで、他のシステムサービスと同様にsystemctlを使用してこのコンテナを開始および停止できるようになります。
システムの起動時にDDNSサーバーを自動的に起動する場合は、次のコマンドを実行します。
systemctl enable ddns-server-ct.service
ステップ5:サーバーのテスト
セットアップを進める前に、管理APIをローカルでテストします。コンテナを起動します:
systemctl start ddns-server-ct.service
GETリクエストをAPIに送信して、新しいレコードを作成します。
注: APIは現在、ローカルでのみアクセスできます(つまり、ローカルホストから)。
curl "http://127.0.0.1:8080/update?secret=your_secret&domain=test1&addr=1.1.1.1"
Curlは次の応答を返す必要があります:
{"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"}
注: ドメインtest1はtest1.ddns.your_domainを参照します。サーバーがddns.your_domainを処理しているためです。ゾーン。
DNSルックアップを実行して、レコードが実際に作成されたことを確認し、DNS解決をテストします。
dig +short -t A test1.ddns.your_domain @127.0.0.1
出力は1.1.1.1である必要があります。
ステップ6:リバースプロキシ
APIはHTTPを介して機能するため、ネットワークを介してリクエストを送信するたびに、認証シークレットが盗聴される可能性があります。攻撃者は、シークレットを使用してDNSレコードを操作する可能性があります。 Nginxを使用してリバースプロキシを設定し、HTTPSを使用して保護します。まず、certbotを使用してLet'sEncryptからSSL証明書を取得します。
certbot certonly --standalone --agree-tos -m [email protected] -d ns1.your_domain
ドメインの所有権が確認され、証明書が発行されます。次に、Nginxをインストールし、有効で実行されていることを確認します。
apt install -y nginx systemctl enable --now nginx.service
次に、デフォルトのサーバーブロックファイルは必要ないため、無効にします。
unlink /etc/nginx/sites-enabled/default
次に、リバースプロキシ用の新しい構成ファイルを作成します。例:
$EDITOR /etc/nginx/sites-available/ddns-api-proxy.conf
そして、以下を貼り付けて、IPアドレスとドメイン名を自分のものに置き換えてください:
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;
}
オプション: IPv6を介してAPIにアクセスできるようにする場合は、既存のlistenディレクティブの後に次の行を追加します。
listen [2001:0db8::0db9]:8080;
この構成を有効にし、Nginxをリロードして変更を適用します:
ln -s /etc/nginx/sites-available/ddns-api-proxy.conf /etc/nginx/sites-enabled/
systemctl reload nginx.service
これで、APIはインターネット経由でアクセス可能になり、HTTPS接続のみを受け入れます。テストするには、次のコマンドを発行します:
curl "https://ns1.your_domain:8080/update?secret=your_secret&domain=test2&addr=1.1.1.2"
次を返す必要があります:
{"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"}
ステップ7:クライアント構成
PfsenseなどのカスタムダイナミックDNSプロバイダーをサポートするルーターで自動レコード更新を設定できます。また、オフィスやホームネットワーク内の他のほとんどのデバイスにセットアップすることもできます。レコードを更新または作成するには、GETリクエストを次のエンドポイントに送信する必要があります。
https://ns1.your_domain:8080/update?secret=your_secret&domain=your_subdomain&addr=your_ip_address
1回のリクエストで複数のサブドメインのレコードを更新することもできます。たとえば、IPアドレスが198.51.100.100のsub1.ddns.your_domainおよびsub2.ddns.your_domainのレコードを作成/更新するには、次のURLにGETリクエストを送信します。
https://ns1.your_domain:8080/update?secret=your_secret&domain=sub1,sub2&addr=198.51.100.100
addrパラメーターは、IPv6アドレスを保持して、AAAADNSレコードを作成/更新することもできます。例:
https://ns1.your_domain:8080/update?secret=your_secret&domain=cheese&addr=2001:0db8:aaaa::
Linuxクライアントでこれらの更新を自動化するには、次のbashスクリプトを/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}"
このスクリプトは、クライアントのパブリックIPアドレスを取得して変数に格納するdigコマンドをラップしたwhileループを採用しています。ループは、パブリックIPが正しくフェッチされることを保証します。次に、cURLを使用してAPIリクエストを送信し、この新しくフェッチされたIPでDNSレコードを更新します。 your_secretとyour_subdomainの値を必ず置き換えてください。
次に、このスクリプトを実行可能にします:
chmod +x /opt/ddns-update.sh
次に、crontabエディターを起動します:
crontab -e
crontabの最後に次の行を追加します。
*/2 * * * * /opt/ddns-update.sh
保存して終了。スクリプトは2分ごとに実行され、動的DNSレコードをクライアントの最新のパブリックIPアドレスで最新の状態に保ちます。
- ダイナミックDNSウィキペディアの記事
- Githubのdocker-ddns