Debian10でDNSControlを使用してDNSを展開および管理する方法
序章
DNSControlはinfrastructure-as-codeツールであり、バージョン管理、テスト、自動展開などの標準的なソフトウェア開発原則を使用してDNSゾーンを展開および管理できます。 DNSControlはStackExchangeによって作成され、Goで記述されています。
DNSControlを使用すると、ゾーンファイルがプログラム可能な形式で保存されるため、手動のDNS管理の落とし穴の多くが解消されます。 これにより、ゾーンを複数のDNSプロバイダーに同時に展開し、構文エラーを識別し、DNS構成を自動的にプッシュして、人的エラーのリスクを減らすことができます。 DNSControlのもう1つの一般的な使用法は、DNSを別のプロバイダーにすばやく移行することです。 たとえば、DDoS攻撃やシステム停止が発生した場合です。
このチュートリアルでは、DNSControlをインストールして構成し、基本的なDNS構成を作成して、ライブプロバイダーへのDNSレコードの展開を開始します。 このチュートリアルの一部として、DNSプロバイダーの例としてDigitalOceanを使用します。 別のプロバイダーを使用する場合、セットアップは非常に似ています。 終了すると、安全なオフライン環境でDNS構成を管理およびテストし、それを本番環境に自動的に展開できるようになります。
前提条件
このガイドを開始する前に、次のものが必要です。
- Debian 10を使用した初期サーバーセットアップに従ってセットアップされた1台のDebian10サーバー。これには、sudo非rootユーザーと、ファイアウォールが非必須ポートをブロックできるようになっています。
your-server-ipv4-address
WebサイトまたはドメインをホストしているサーバーのIPアドレスを指します。your-server-ipv6-address
WebサイトまたはドメインをホストしているサーバーのIPv6アドレスを指します。 - がサポートするプロバイダーによってホストされているDNSに完全に登録されたドメイン名。 このチュートリアルでは、
your_domain
全体とサービスプロバイダーとしてのDigitalOcean。 - 読み取りおよび書き込み権限を持つDigitalOceanAPIキー(パーソナルアクセストークン)。 作成するには、パーソナルアクセストークンの作成方法にアクセスしてください。
これらの準備ができたら、root以外のユーザーとしてサーバーにログインして開始します。
ステップ1—DNSControlをインストールする
DNSControlはGoで記述されているため、サーバーにGoをインストールし、 GOPATH
.
GoはDebianのデフォルトのソフトウェアリポジトリ内で利用可能であり、従来のパッケージ管理ツールを使用してインストールすることができます。
また、Gitをインストールする必要があります。これは、GoがGitHubのリポジトリからDNSControlソフトウェアをダウンロードしてインストールできるようにするために必要です。
ローカルパッケージインデックスを更新して、新しいアップストリームの変更を反映することから始めます。
- sudo apt update
次に、をインストールします golang-go
と git
パッケージ:
- sudo apt install golang-go git
インストールを確認した後、 apt
GoとGit、およびそれらに必要なすべての依存関係をダウンロードしてインストールします。
次に、Goに必要なパス環境変数を構成します。 これについて詳しく知りたい場合は、GOPATHの理解でこのチュートリアルを読むことができます。 編集することから始めます ~/.profile
ファイル:
- nano ~/.profile
ファイルの最後に次の行を追加します。
...
export GOPATH="$HOME/go"
export PATH="$PATH:$GOPATH/bin"
これらの行をファイルの最後に追加したら、保存して閉じます。 次に、ログアウトして再度ログインするか、ファイルを再度ソースして、プロファイルをリロードします。
- source ~/.profile
Goをインストールして構成したので、DNSControlをインストールできます。
The go get
コマンドを使用して、コードのコピーをフェッチし、自動的にコンパイルして、Goディレクトリにインストールできます。
- go get github.com/StackExchange/dnscontrol
これが完了したら、インストールされているバージョンをチェックして、すべてが機能していることを確認できます。
- dnscontrol version
出力は次のようになります。
Outputdnscontrol 2.9-dev
あなたが見たら dnscontrol: command not found
エラーが発生した場合は、Goパスの設定を再確認してください。
DNSControlをインストールしたので、構成ディレクトリを作成し、DNSControlをDNSプロバイダーに接続して、DNSレコードを変更できるようにすることができます。
ステップ2—DNSControlの構成
このステップでは、DNSControlに必要な構成ディレクトリを作成し、DNSプロバイダーに接続して、DNSレコードにライブ変更を加え始めることができるようにします。
まず、DNSControl構成を保存できる新しいディレクトリを作成してから、そのディレクトリに移動します。
- mkdir ~/dnscontrol
- cd ~/dnscontrol
注:このチュートリアルでは、DNSControlの初期設定に焦点を当てます。 ただし、本番環境で使用する場合は、DNSControl構成を Git などのバージョン管理システム(VCS)に保存することをお勧めします。 これの利点には、完全なバージョン管理、テストのためのCI / CDとの統合、シームレスなロールバック展開などが含まれます。
DNSControlを使用してBINDゾーンファイルを作成する場合は、 zones
ディレクトリ:
- mkdir ~/dnscontrol/zones
BINDゾーンファイルは、DNSゾーン/レコードをプレーンテキスト形式で保存するための生の標準化された方法です。 もともとはBINDDNSサーバーソフトウェアに使用されていましたが、現在ではDNSゾーンを保存するための標準的な方法として広く採用されています。 DNSControlによって生成されたBINDゾーンファイルは、カスタムまたはセルフホストのDNSサーバーにインポートする場合、または監査目的で役立ちます。
ただし、DNSControlを使用してDNSの変更を管理対象プロバイダーにプッシュするだけの場合は、 zones
ディレクトリは必要ありません。
次に、を構成する必要があります creds.json
ファイル。これにより、DNSControlがDNSプロバイダーに対して認証を行い、変更を加えることができます。 のフォーマット creds.json
使用しているDNSプロバイダーによって若干異なります。 独自のプロバイダーの構成を見つけるには、公式DNSControlドキュメントのサービスプロバイダーリストを参照してください。
ファイルを作成する creds.json
の中に ~/dnscontrol
ディレクトリ:
- cd ~/dnscontrol
- nano creds.json
サンプルを追加します creds.json
ファイルへのDNSプロバイダーの構成。 DNSプロバイダーとしてDigitalOceanを使用している場合は、次を使用できます。
{
"digitalocean": {
"token": "your-digitalocean-oauth-token"
}
}
このファイルは、DNSControlに接続するDNSプロバイダーを通知します。
DNSプロバイダーに何らかの形式の認証を提供する必要があります。 これは通常、APIキーまたはOAuthトークンですが、公式のDNSControlドキュメントのサービスプロバイダーリストに記載されているように、一部のプロバイダーは追加情報を必要とします。
警告:このトークンはDNSプロバイダーアカウントへのアクセスを許可するため、パスワードと同じように保護する必要があります。 また、バージョン管理システムを使用している場合は、トークンを含むファイルが除外されていることを確認してください(例: を使用して .gitignore
)、または何らかの方法で安全に暗号化されています。
DNSプロバイダーとしてDigitalOceanを使用している場合は、前提条件の一部として生成したDigitalOceanアカウント設定で必要なOAuthトークンを使用できます。
複数の異なるDNSプロバイダーがある場合(たとえば、複数のドメイン名や委任されたDNSゾーンの場合)、これらすべてを同じもので定義できます。 creds.json
ファイル。
DNSControlの初期構成ディレクトリを設定し、構成しました creds.json
DNSControlがDNSプロバイダーに対して認証し、変更を加えることができるようにします。 次に、DNSゾーンの構成を作成します。
ステップ3—DNS構成ファイルを作成する
このステップでは、ドメイン名または委任されたDNSゾーンのDNSレコードを含む初期DNS構成ファイルを作成します。
dnsconfig.js
DNSControlのメインDNS構成ファイルです。 このファイルでは、DNSゾーンとそれに対応するレコードがJavaScript構文を使用して定義されています。 これはDSLまたはドメイン固有言語として知られています。 DNSControlの公式ドキュメントのJavaScriptDSL ページに、詳細が記載されています。
まず、DNS構成ファイルを ~/dnscontrol
ディレクトリ:
- cd ~/dnscontrol
- nano dnsconfig.js
次に、次のサンプル構成をファイルに追加します。
// Providers:
var REG_NONE = NewRegistrar('none', 'NONE');
var DNS_DIGITALOCEAN = NewDnsProvider('digitalocean', 'DIGITALOCEAN');
// Domains:
D('your_domain', REG_NONE, DnsProvider(DNS_DIGITALOCEAN),
A('@', 'your-server-ipv4-address')
);
このサンプルファイルは、特定のプロバイダーのドメイン名またはDNSゾーンを定義します。この場合は次のようになります。 your_domain
DigitalOceanによってホストされています。 例 A
レコードはゾーンルートにも定義されます(@
)、ドメイン/ウェブサイトをホストしているサーバーのIPv4アドレスを指します。
基本的なDNSControl構成ファイルを構成する3つの主要な機能があります。
-
NewRegistrar(name, type, metadata)
:ドメイン名のドメインレジストラを定義します。 DNSControlはこれを使用して、権限のあるネームサーバーの変更など、必要な変更を加えることができます。 DNSControlを使用してDNSゾーンを管理するだけの場合は、通常、このままにしておくことができます。NONE
. -
NewDnsProvider(name, type, metadata)
:ドメイン名または委任ゾーンのDNSサービスプロバイダーを定義します。 これは、DNSControlがユーザーが行ったDNS変更をプッシュする場所です。 -
D(name, registrar, modifiers)
:DNSControlが管理するドメイン名または委任されたDNSゾーン、およびゾーンに存在するDNSレコードを定義します。
構成する必要があります NewRegistrar()
, NewDnsProvider()
、 と D()
したがって、DNSControlの公式ドキュメントにあるサービスプロバイダーリストを使用してください。
DNSプロバイダーとしてDigitalOceanを使用していて、(権威のあるネームサーバーではなく)DNSを変更するだけでよい場合は、前のコードブロックのサンプルはすでに正しいです。
完了したら、ファイルを保存して閉じます。
この手順では、関連するプロバイダーを定義して、DNSControlのDNS構成ファイルを設定します。 次に、いくつかの有用なDNSレコードをファイルに入力します。
ステップ4—DNS構成ファイルにデータを入力する
次に、DNSControl構文を使用して、DNS構成ファイルにWebサイトまたはサービスに役立つDNSレコードを入力できます。
DNSレコードが生の行ごとの形式で書き込まれる従来のBINDゾーンファイルとは異なり、DNSControl内のDNSレコードは、 D()
手順3で簡単に示すように、関数。
ドメイン修飾子は、次のような標準のDNSレコードタイプごとに存在します。 A
, AAAA
, MX
, TXT
, NS
, CAA
、 等々。 使用可能なレコードタイプの完全なリストは、DNSControlドキュメントの DomainModifiersセクションにあります。
個々のレコードの修飾子も使用できます(レコード修飾子)。 現在、これらは主に個々のレコードのTTL(存続時間)を設定するために使用されます。 使用可能なレコード修飾子の完全なリストは、DNSControlドキュメントのレコード修飾子セクションにあります。 レコード修飾子はオプションであり、ほとんどの基本的なユースケースでは省略できます。
DNSレコードを設定するための構文は、レコードタイプごとにわずかに異なります。 以下は、最も一般的なレコードタイプの例です。
-
A
記録:- 目的:IPv4アドレスを指すこと。
- 構文:
A('name', 'address', optional record modifiers)
- 例:
A('@', 'your-server-ipv4-address', TTL(30))
-
AAAA
記録:- 目的:IPv6アドレスを指すこと。
- 構文:
AAAA('name', 'address', optional record modifiers)
- 例:
AAAA('@', 'your-server-ipv6-address')
(レコード修飾子が省略されているため、デフォルトのTTLが使用されます)
-
CNAME
記録:- 目的:ドメイン/サブドメインを別のエイリアスにすること。
- 構文:
CNAME('name', 'target', optional record modifiers)
- 例:
CNAME('subdomain1', 'example.org.')
(末尾に注意してください.
値にドットがある場合は、 を含める必要があります)
-
MX
記録:- 目的:特定のサーバー/アドレスに電子メールを送信します。
- 構文:
MX('name', 'priority', 'target', optional record modifiers)
- 例:
MX('@', 10, 'mail.example.net')
(末尾に注意してください.
値にドットがある場合は、 を含める必要があります)
-
TXT
記録:- 目的:任意のプレーンテキストを追加します。多くの場合、専用のレコードタイプのない構成に使用されます。
- 構文:
TXT('name', 'content', optional record modifiers)
- 例:
TXT('@', 'This is a TXT record.')
-
CAA
記録:- 目的:ドメイン/サブドメインのTLS証明書を発行できる認証局(CA)を制限し、報告します。
- 構文:
CAA('name', 'tag', 'value', optional record modifiers)
- 例:
CAA('@', 'issue', 'letsencrypt.org')
ドメインまたは委任されたDNSゾーンのDNSレコードの追加を開始するには、DNS構成ファイルを編集します。
- nano dnsconfig.js
次に、既存のパラメータの入力を開始できます D()
前のリストで説明されている構文と、DNSControlの公式ドキュメントの DomainModifiersセクションを使用して機能します。 カンマ(,
)各レコードの間に使用する必要があります。
参考までに、ここのコードブロックには、基本的な初期DNSセットアップの完全なサンプル構成が含まれています。
...
D('your_domain', REG_NONE, DnsProvider(DNS_DIGITALOCEAN),
A('@', 'your-server-ipv4-address'),
A('www', 'your-server-ipv4-address'),
A('mail', 'your-server-ipv4-address'),
AAAA('@', 'your-server-ipv6-address'),
AAAA('www', 'your-server-ipv6-address'),
AAAA('mail', 'your-server-ipv6-address'),
MX('@', 10, 'mail.your_domain.'),
TXT('@', 'v=spf1 -all'),
TXT('_dmarc', 'v=DMARC1; p=reject; rua=mailto:abuse@your_domain; aspf=s; adkim=s;')
);
DNSの初期構成が完了したら、ファイルを保存して閉じます。
この手順では、DNSレコードを含む初期DNS構成ファイルを設定します。 次に、構成をテストしてデプロイします。
ステップ5—DNS構成のテストと展開
このステップでは、DNS構成に対してローカル構文チェックを実行してから、変更をライブDNSサーバー/プロバイダーに展開します。
まず、あなたの中に移動します dnscontrol
ディレクトリ:
- cd ~/dnscontrol
次に、 preview
DNSControlの機能を使用して、ファイルの構文をチェックし、ファイルが行う変更を(実際に変更せずに)出力します。
- dnscontrol preview
DNS構成ファイルの構文が正しい場合、DNSControlはそれが行う変更の概要を出力します。 これは次のようになります。
Output******************** Domain: your_domain
----- Getting nameservers from: digitalocean
----- DNS Provider: digitalocean...8 corrections
#1: CREATE A your_domain your-server-ipv4-address ttl=300
#2: CREATE A www.your_domain your-server-ipv4-address ttl=300
#3: CREATE A mail.your_domain your-server-ipv4-address ttl=300
#4: CREATE AAAA your_domain your-server-ipv6-address ttl=300
#5: CREATE TXT _dmarc.your_domain "v=DMARC1; p=reject; rua=mailto:abuse@your_domain; aspf=s; adkim=s;" ttl=300
#6: CREATE AAAA www.your_domain your-server-ipv6-address ttl=300
#7: CREATE AAAA mail.your_domain your-server-ipv6-address ttl=300
#8: CREATE MX your_domain 10 mail.your_domain. ttl=300
----- Registrar: none...0 corrections
Done. 8 corrections.
出力にエラー警告が表示された場合、DNSControlは、ファイル内のエラーの場所と場所に関する詳細を提供します。
警告:次のコマンドは、DNSレコードおよび場合によっては他の設定にライブ変更を加えます。 既存のDNS構成のバックアップを取ることを含め、これに備えていることを確認してください。また、必要に応じてロールバックする手段があることを確認してください。
最後に、ライブDNSプロバイダーに変更をプッシュできます。
- dnscontrol push
次のような出力が表示されます。
Output******************** Domain: your_domain
----- Getting nameservers from: digitalocean
----- DNS Provider: digitalocean...8 corrections
#1: CREATE TXT _dmarc.your_domain "v=DMARC1; p=reject; rua=mailto:abuse@your_domain; aspf=s; adkim=s;" ttl=300
SUCCESS!
#2: CREATE A your_domain your-server-ipv4-address ttl=300
SUCCESS!
#3: CREATE AAAA your_domain your-server-ipv6-address ttl=300
SUCCESS!
#4: CREATE AAAA www.your_domain your-server-ipv6-address ttl=300
SUCCESS!
#5: CREATE AAAA mail.your_domain your-server-ipv6-address ttl=300
SUCCESS!
#6: CREATE A www.your_domain your-server-ipv4-address ttl=300
SUCCESS!
#7: CREATE A mail.your_domain your-server-ipv4-address ttl=300
SUCCESS!
#8: CREATE MX your_domain 10 mail.your_domain. ttl=300
SUCCESS!
----- Registrar: none...0 corrections
Done. 8 corrections.
ここで、DigitalOceanコントロールパネルでドメインのDNS設定を確認すると、変更が表示されます。
ドメイン/委任ゾーンに対してDNSクエリを実行して、レコードの作成を確認することもできます。 dig
.
お持ちでない場合 dig
インストールされている場合は、をインストールする必要があります dnsutils
パッケージ:
- sudo apt install dnsutils
インストールしたら dig
、これを使用して、ドメインのDNSルックアップを作成できます。 レコードがそれに応じて更新されていることがわかります。
- dig +short your_domain
DNSControlを使用してデプロイされたゾーンからのIPアドレスと関連するDNSレコードを示す出力が表示されます。 DNSレコードの伝播には時間がかかる場合があるため、このコマンドを待ってから再度実行する必要がある場合があります。
この最後のステップでは、DNS構成ファイルのローカル構文チェックを実行し、それをライブDNSプロバイダーに展開して、変更が正常に行われたことをテストしました。
結論
この記事では、DNSControlをセットアップし、DNS構成をライブプロバイダーに展開しました。 これで、DNS構成の変更を安全なオフライン環境で管理およびテストしてから、本番環境に展開できます。
このテーマをさらに詳しく調べたい場合は、DNSControlがCI / CDパイプラインに統合されるように設計されているため、詳細なテストを実行して、本番環境への展開をより詳細に制御できます。 また、DNSControlをインフラストラクチャの構築/展開プロセスに統合して、サーバーを展開し、それらをDNSに完全に自動的に追加できるようにすることも検討できます。
DNSControlをさらに進めたい場合は、次のDigitalOceanの記事で、DNSControlを変更管理およびインフラストラクチャ展開ワークフローに統合するのに役立ついくつかの興味深い次のステップを提供します。