こちらの記事では、BINDの基礎概念に関して解説します。もし手を動かしながらBINDに関しての理解を深めたいという方は、以下の記事でBINDを使用したDNSサーバーの構築方法を紹介していますのでご参照ください。
https://envader.plus/article/213
BINDとは
BIND(Berkeley Internet Name Domain)は、DNSサーバーのためのソフトウェアです。DNSの情報を管理することができ、クライアントからの名前解決のリクエストに応じて対応するIPアドレスを返すことができます。また、BINDは非常に人気があり、多くのUNIX系システムで利用されています。オープンソースで開発されており、機能が豊富でカスタマイズも可能という特徴があります。
なぜBINDを学ぶのか?
現在はAWSやGCPといったクラウドプラットフォームが提供するサービスで、GUIを使用して比較的簡単にDNSサーバーを構築することが可能です。また、セキュリティやスケーラビリティの面での管理の大部分をクラウドプラットフォームが管理してくれます。
クラウドプラットフォームが提供するサービスを利用する際にDNSの基本的な仕組みを深く理解していない場合、「DNSサーバーの設定ミス」、「トラブルシューティングの困難」、「セキュリティリスクの増加」、「コストの増加」などの弊害が生じる可能性があります。
BINDを学ぶことでDNSの基本的な仕組みなどについて深く理解することができ、上記の弊害に対しても未然に対策を講じることが可能です。
つまり、BINDを学ぶことは「DNSの仕組みや設定方法を深く理解すること」です。そして、クラウドプラットフォームのDNSに関してのサービスをより効果的、安全、経済的に利用することにも役立ちます。
BINDのメリット・デメリット
BINDには数多くのメリットがありますが、デメリットも存在します。BINDを使いこなすためにはBINDのメリット・デメリットを把握・理解することが重要です。
以下にBINDのメリット・デメリットを紹介します。
メリット
- 普及率の高さ
BINDは非常に広く利用されているため、サポートと情報が豊富にあります。例えば、オンラインでのトラブルシューティング、書籍、コミュニティサポートなどのリソースが豊富にあります。
- オープンソースであること
ほとんどのプラットフォームで利用でき、無料でカスタマイズすることが可能です。
- 成熟度の高さ
BINDは30年以上の歴史があり、多くのバージョンアップとアップデートを重ねています。そのため、多岐にわたるユースケースでの使用に耐えうる安定性と機能が提供されています。
- セキュリティを向上させる機能
BINDにはDNSSEC(Domain Name System Security Extensions)や、TSIG(Transaction SIGnature)などの先進的なセキュリティメカニズムのサポートが提供されており、DNSの認証と安全性を強化することができます。
- 柔軟性の高さ
BINDはあらゆるサイズのネットワークに対応できるように設計されており、小規模なネットワークから大規模なISP(Internet Service Provider)レベルのサービスまで対応することができます。
デメリット
- 複雑さ
BINDは非常に詳細に設定することが可能です。つまり、正確かつ安全に設定を行うためには深い理解が必要とされることがあります。そのため、初心者にとってはハードルが高いと言えます。
- パフォーマンスの課題
メリットで挙げましたが、BINDは非常に柔軟で強力なソフトウェアであるため、多岐にわたる機能を持っています。その反面、特定のケース(特定のユースケースや環境に焦点を絞って設計されたケース)においてより軽量で特化したDNSサーバーに比べて若干遅くなることがあります。
- セキュリティの課題
BINDのように広く採用されているソフトウェアは攻撃者にとって魅力的なターゲットの対象になります。つまり、適切に設定がなされていないサーバーのセキュリティリスクが高まるということです。
- メンテナンスの必要性
BINDに複雑な設定やカスタマイズがある場合、日常的なメンテナンスと監視が必要になることがあります。特に大規模なシステムではメンテナンスに割くリソースが必要になることがあります。
BINDの構成を理解する
BINDの基本ファイルは5つで、サービスのルートは/etc/bind/
です。
ubuntuのBIND設定は複数のファイルに分割されており、それぞれのファイルが特定の設定を担当することで設定の管理がしやすくなっています。これにより、変更を加える際には関連するファイルのみを編集することで設定の見通しを良く保つことができます。(以降ubuntuにおけるBINDの構成ファイルの役割を解説します。)
named.conf(BIND設定ファイル)
named.confは、他の設定ファイルをインクルードする(取り込む)ためのエントリポイントとして機能します。以下のようにインクルードのみを記述します。
//
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the
// structure of BIND configuration files in Debian, *BEFORE* you customize
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";
named.conf.options(BIND設定オプションファイル)
named.conf.optionsは、BINDの一般的なオプションを設定するファイルです。ここで設定できる主要なオプションを以下の表で示します。以下の表以外にも多くの設定オプションがあり、詳細な設定や特定のニーズに応じた設定が可能です。
オプション名 | 説明 |
---|---|
directory | BINDの作業ディレクトリのパスを指定します。通常、ゾーンファイルなどがこのディレクトリに格納されます。 |
listen-on | BINDがリッスンするIPアドレスを指定します。 |
listen-on-v6 | BINDがリッスンするIPv6アドレスを指定します。 |
forwarders | クエリの転送先となるDNSサーバーのIPアドレスを指定します。 |
allow-query | DNSクエリを許可するクライアントのアドレス範囲を指定します。 |
allow-transfer | ゾーン転送を許可するクライアントのアドレス範囲を指定します。 |
recursion | 再帰クエリを許可するかどうかを指定します。通常、yesまたはnoで設定します。 |
dnssec-enable | DNSSECの機能を有効にするかどうかを指定します。 |
dnssec-validation | DNSSECの検証を行うかどうかを指定します。 |
auth-nxdomain | NXDOMAINの応答が権威的であるかどうかを指定します。 |
rate-limit | クエリのレート制限を設定します。これにより、DDoS攻撃などからサーバーを保護することができます。 |
max-cache-size | DNSキャッシュの最大サイズを指定します。 |
max-cache-ttl | キャッシュされたレコードの最大TTL (Time To Live) を指定します。 |
version | BINDのバージョン情報を非表示にするための設定です。攻撃者に対する情報開示リスクを低減するために使用されます。 |
named.conf.xxx-zones(BINDゾーン情報ファイル)
named.conf.xxx-zonesは、ゾーン設定を含むファイルです。xxx-zonesはdefault-zones、external-zones、internal-zonesなどDNSの設計によって使い分けられます。
named.conf.default-zonesでは、再起問い合わせ用のルートヒントファイルや、localhostなどに関するzoneステートメントを設定します。
external-zones、internal-zonesは必要に応じて設定します。external-zonesは公開されている外部のクライアント(インターネット 上のユーザーや他のサーバー)がアクセスするためのDNSゾーンを設定します。internal-zonesには企業や組織の内部ネットワーク内のクライアントやサーバーのみがアクセスするためのDNSゾーンを設定します。
多くの組織ではセキュリティ上の理由から外部(external-zones)と内部(internal-zones)のDNSゾーンを分離して運用しています。これにより外部の攻撃者が内部のリソースの情報を取得することを防ぐことができます。
正引きゾーンファイル
- 正引きゾーンファイルの特徴
正引きゾーンファイルに関して、以下の表にまとめました。
正引き (Forward Lookup) | |
---|---|
目的 | ドメイン名からIPアドレスを取得する。 |
ファイル | 通常のゾーンファイル |
ファイル名 | 任意のファイル名 |
例 | www.example.com → 192.0.2.1 |
特殊ドメイン | なし |
- 正引きゾーンファイルの特徴・注意点
正引きゾーンファイルの特徴・注意点を、以下の図にまとめました。
- リソースレコード
リソースレコードとは、ドメイン名とそれに関する情報(IPアドレス)を結びつける役割を持っています。上記のSOA
、NS
、A
といったものがリソースレコードに該当します。
リソースレコードの主要なタイプを以下の表にまとめました。
レコードタイプ | 説明 |
---|---|
SOA | ゾーンの基本情報を提供するレコード。ゾーンの権威サーバー、連絡先、シリアル番号などの情報を含みます。 |
NS | ドメインのネームサーバーを指定します。 |
A | ドメイン名をIPv4アドレスにマッピングします。 |
AAAA | ドメイン名をIPv6アドレスにマッピングします。 |
CNAME | あるドメイン名を別のドメイン名にエイリアス(別名)としてマッピングします。 |
MX | ドメインのメール交換サーバーを指定します。 |
PTR | IPアドレスをドメイン名にマッピングします(主に逆引きで使用される)。 |
TXT | 任意のテキスト情報をドメインに関連付けるために使用されます。SPFやDKIMなどのメール認証メカニズムでよく使用されます。 |
- SOAレコード
SOAレコードは、ゾーンデータを作成したホスト名・管理者のメールアドレスを指定します。
まずは以下の記述を解説します。
@ IN SOA ns.dns.com. root.dns.com.
ドメイン名は@で省略することができます。そのため、それ以外の文字に@を使用することはできません。管理者メールアドレスに当たるroot.dns.com.は、@を.に置き換えています。
それぞれの値に関して、以下の表にまとめました。
値 | 説明 | 備考 |
---|---|---|
@ | 通常、$ORIGINディレクティブで定義されたドメイン名を参照する。例えば、$ORIGIN example.com.がゾーンファイルの先頭にある場合、@はexample.com.を意味する。 | $ORIGINを明示的に記載しない場合、@はゾーンファイルが対象としているゾーンの名前を参照する。例えば、BINDゾーン情報ファイル(named.conf.xxx-zones)でzone “example.com”{}とゾーン定義した場合、このゾーンファイル内で@を使用すると、@はexample.comを意味する。 |
IN(InterNet) | 現代のインターネットで最も一般的に使用されるクラス。 | |
SOA(Start Of Authority) | DNSゾーンの基本的な情報を提供する。 | ゾーンの権威サーバ、連絡先、シリアル番号などの情報を含むことができる。 |
ns.dns.com. | プライマリ(権威)DNSサーバを示す。他のDNSサーバがこのゾーンの情報を更新する必要がある場合、このサーバに問い合わせを行う。 | 自身でドメイン名を設定することができる。 |
root.dns.com. | 管理者のメールアドレス。ドメインやDNSに関する問題が発見された場合などに使用される。 | SOAレコードの連絡先として有効なメールアドレスの設定が推奨される。 |
次に、以下の記述を解説します。
2023070301 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Negative cache TTL
SOAレコードで指定したパラメータの詳細を以下にまとめました。
値 | 値の名前 | 意味 | 備考 |
---|---|---|---|
2023070301 | シリアルナンバー | ゾーンファイルのバージョンを示す番号。「西暦+2桁の番号」が使用されることが多い。 | ファイル変更時に値を増やすことが推奨される。 |
3600(秒単位) | リフレッシュタイム | セカンダリDNSサーバがプライマリDNSサーバに問い合わせてゾーンデータを更新する間隔。 | この時間が経過すると、セカンダリサーバはプライマリサーバに接触してゾーンの変更をチェックする。 |
1800(秒単位) | リトライタイム | セカンダリDNSサーバがプライマリDNSサーバに接触しようとして失敗した場合の、次に再試行するまでの間隔。 | |
604800(秒単位) | 有効期限 | セカンダリDNSサーバがプライマリDNSサーバとの接触を失ってから、ゾーンデータを無効とみなすまでの時間。 | この時間が経過すると、セカンダリサーバはそのゾーンの情報を提供しなくなる、 |
86400(秒単位) | ネガティブキャッシュTTL | DNSクエリの結果が存在しない(NXDOMAIN)という応答の場合の、その応答をキャッシュするまでの時間。 | この設定により、存在しないレコードに対するクエリが頻繁に行われる場合のオーバーヘッドを減少させることができる。 |
- NSレコード
NS(Name Server)レコードにはドメインのネームサーバを指定します。ネームサーバの最後にピリオドが必要です。
@ IN NS ns.dns.com. ;プライマリ
@ IN NS **.***.com. ;セカンダリ
dns.comのドメイン情報を持っているネームサーバを上記のように指定します。複数定義した場合、上からプライマリ、セカンダリと指定します。
- Aレコード
Aレコードは、ホスト名とIPアドレスの対応を設定します。
bind IN A 10.255.240.74
上記のように記載すると、bind.dns.comというドメインがIPv4アドレス10.255.240.74に対応するようにできます。(dns.com.の設定をORIGINディレクティブ、またはゾーン設定する必要があります)
逆引きゾーンファイル
逆引きゾーンファイルに関して、以下の表にまとめました
逆引き (Reverse Lookup) | |
---|---|
目的 | IPアドレスからドメイン名を取得する。 |
ファイル | 逆引きゾーンファイル |
ファイル名 | 任意のファイル名 |
例 | 192.0.2.1 → www.example.com |
特殊ドメイン | .in-addr.arpa (IPv4), .ip6.arpa (IPv6) |
- 逆引きゾーンファイルの特徴・注意点
逆引きゾーンファイルの特徴・注意点を、以下の図にまとめました。
- 逆引きゾーンファイル名
逆引きゾーンファイル名は、IPアドレスの第1オクテット~第3オクテット(もしくは第4オクテット)までを逆順に記述したものに拡張子を付けることが慣例的に行われます。主な命名規則を以下の表にまとめました。
逆引きゾーンファイル名 | 拡張子の意味 | 備考 |
---|---|---|
240.255.10.in-addr.arpa | IPv4の逆引きを示す | in-addr.arpaドメインは、IANA(Internet Assigned Numbers Authority) によって予約されている |
8.b.d.0.1.0.0.2.ip6.arpa | IPv6の逆引きを示す | 2001:0db8::/32を逆順に記述 |
240.255.10.rev | 逆引きを示す | |
240.255.10.db | データベースを示す |
最終的には、ゾーンファイルの命名はBINDの設定ファイル内で正確に指定されていれば、どのような名前でも機能的には問題ありません。命名規則の選択は、管理のしやすさや組織のポリシーに基づいて決定されることが多いです。
- PTRレコード
PTR(PoinTeR)レコードは、IPアドレスからホストの名前を検索するためのデータを設定します。以下のように設定すると、240.255.10.in-addr.arpa
とゾーン定義、または$ORIGIN 240.255.10.in-addr.arpa
と指定したネットワーク内の第4オクテットが74のホスト(具体的には10.255.240.74のホスト)にns.dns.com
というドメインを設定することができます。
IN NS ns.dns.com.
74 IN PTR ns.dns.com.
注意点として、基準名のドメインの部分(dns.com)は省略できません。また、ドメイン名の最後にピリオドが必要です。
BINDのサービスに関して
システムのサービス管理ツールであるsystemd
を通じて、BINDのサービスの操作を行うことができます。
- BINDの稼働状態の確認
以下のコマンドでBINDのサービスの現在の稼働状態や関連情報が表示されます。
$ sudo systemctl status named
主な稼働状態について以下の表にまとめました。
稼働状態 | 説明 |
---|---|
active(running) | サービスが正常に動作している |
inactive(dead) | サービスが停止している |
failed | サービスの起動や実行中に何らかのエラーが発生し、動作が停止した |
activating | サービスが起動中 |
deactivating | サービスが停止中 |
reloading | サービスが設定の再読み込みを行っている |
- BINDの再起動
BINDの設定ファイルを変更した後、以下のコマンドでBINDを再起動し、新しい設定を適用することができます。
$ sudo systemctl restart named
- BINDのログの確認
BINDのログは、デフォルトの設定では/var/log/syslog
に出力されます。以下のコマンドでBINDのログを確認できます。
# BINDのログの最後の50行を表示する
$ tail -n 50 /var/log/syslog
# BINDのログの末尾の内容をリアルタイムで表示する
$ tail -f /var/log/syslog
BINDのログは、named.conf.options
や関連する設定ファイルにてlogging
セクションを使用してログに関する設定をカスタマイズすることができます。これにより、特定のログファイルにログを出力したり、ログレベルなどの詳細設定を行うことができます。
DNSサーバの変更
ubuntuが使用するDNSサーバの初期設定情報は、以下のファイルで確認できます。
$ cat /etc/resolv.conf
# This file is managed by man:systemd-resolved(8). Do not edit.
#
# This is a dynamic resolv.conf file for connecting local clients to the
# internal DNS stub resolver of systemd-resolved. This file lists all
# configured search domains.
#
# Run "resolvectl status" to see details about the uplink DNS servers
# currently in use.
#
# Third party programs must not access this file directly, but only through the
# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
# replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.
nameserver 127.0.0.53
options edns0 trust-ad
search ap-northeast-1.compute.internal
/etc/resolv.conf
は/run/systemd/resolve/stub-resolv.conf
のシンボリックリンクです。このファイルは、system-resolved(DNS解決を行うサービス)によって管理される設定ファイルで、システムのDNSクエリを処理するための設定を持っています。
初期の設定は、AWS EC2インスタンスの東京リージョン(各自が利用するリージョン)におけるデフォルトの内部DNS設定情報を示しています。そのため、名前解決を行うサーバをBINDを設定したEC2を指定するために初期の設定を変更する必要があります。
名前解決を行うDNSサーバを変更するアプローチは幾つかありますが、今回はnetplanを利用して変更する方法を紹介します。netplanはubuntu18.04以降に利用することができ、YAMLファイルを編集してDNS設定を変更することができます。
netplanの仕様と新しい設定の適用方法
- netplanの仕様
まず、netplanの公式ドキュメントから仕様を確認します。
All
/{lib,etc,run}/netplan/*.yaml
are considered. Lexicographically later files (regardless of in which directory they are) amend (new mapping keys) or override (same mapping keys) previous ones.
簡単に要約すると、「/etc/netplan/*.yaml
の全てのファイルがnetplanの設定に適用され、ファイルは辞書順(数字は昇順)で読み込まれ、後のファイルで前のファイルの設定が上書きされる」と記載されています。
また、netplanの初期設定ファイル(/etc/netplan/50-cloud-init.yaml
)に記述されたコメントを確認します。
$ cat /etc/netplan/50-cloud-init.yaml
# This file is generated from information provided by
# the datasource. Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
重要なのは、This file is generated from information provided by the datasource.
(このファイルはデータソースから自動生成されます。)という部分です。
- netplanの新しい設定の適用方法
つまり、netplanにおける新しい設定の適用方法は「初期設定ファイルを直接編集せず、新しくYAMLファイルを作成する」ことがベストプラクティスとなります。新しく作成するファイル名は、初期設定ファイルである50-cloud-init.yaml
よりもアルファベットを後ろに、もしくは数字を大きくする必要があります。このようにすることで新しく作成したファイルで初期設定ファイルを上書きすることができます。
netplanの基本項目
netplanで使用するYAMLファイルに記載する基本的な項目を以下の表にまとめました。使用するネットワークの要件や複雑さに応じて、さらに詳細なオプションやセクションを持つことがあります。
項目 | 説明 | 備考 | 確認コマンド |
---|---|---|---|
network | YAMLファイルの開始を示す。このセクションの下にネットワークの詳細設定が続く。 | 必須項目 | |
version | netplan 設定のバージョンを示す。(現在は 2 が一般的) | 必須項目 | |
renderer | 使用するネットワーク管理ツールを示す。networkd(デフォルト)またはNetworkManagerが選べる。 | networkdはサーバー向け、NetworkManagerはデスクトップ向けとされることが多い。 | networkctl, nmcli |
ethernets | 有線のEthernetインターフェースに関する設定セクション。 | インターフェースごとの固有の設定を記述する場所。 | ip addr |
[インターフェース名] | 特定のインターフェースの設定を記述するセクション。(例: eth0) | インターフェース名はシステムによって異なる場合がある (例: ens33, enp0s3 など)。 | ip addr |
dhcp4 | DHCPを使用してIPv4アドレスを取得するかどうかを示す。yesまたはno。 | noを指定した場合は手動で設定を行う | |
addresses | 静的に割り当てるIPアドレスのリスト。 | 指定するCIDRはインターフェースが所属するCIDR範囲を指定する。 | ip addr |
gateway4 | IPv4ゲートウェイのアドレス。 | 通常、サブネット内のデフォルトゲートウェイアドレスを指定。 | ip route |
nameservers | DNSサーバーに関する設定セクション。 | ローカルまたは外部のDNSサーバーを指定できる。 | systemd-resolve --status |
addresses (DNS内) | 使用するDNSサーバーのIPアドレスのリスト。 | 一般的には公開DNSまたはプライベートDNSのアドレスをリスト化して指定。 | systemd-resolve --status |
search | DNS検索ドメインのリスト。 | ホスト名の解決時に使用されるドメインのリスト。例: "http://example.com/" を指定すると、"host" を "http://host.example.com/" として解決しようとする。 | systemd-resolve --status |
まとめ
こちらの記事では、BINDの基礎的な部分に焦点を当てて解説しました。BINDは非常に奥が深い技術で、まだ学ぶべき多くの内容が存在します。
また、BINDは高いカスタマイズ性を持っており、その全てを網羅するのは難しいです。特定の要件に合わせたBINDのカスタマイズを適切に行えるようになるためにも、基礎的な概念をしっかりと理解しましょう。
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2022.12.10
スケーリングとは?垂直スケーリング・水平スケーリングを使い分ける
こちらの記事では、性能のためのスケーリングについて解説します。
- インフラエンジニア
2023.03.20
クラウドエンジニアってどんな職業?年収や将来性は
今回は、クラウドエンジニアが「きつい」「やめとけ」と言われる理由の他、年収や将来性について解説します。
- インフラエンジニア
- キャリア・学習法
2024.02.07
AWSでLogstashの環境構築と使い方を学ぶ
Logstashという強力なツールを用いて、効果的なログ収集、加工、および可視化の方法を学びます。AWS上でのLogstashの設定から、基本的な使い方まで、実践的な知識を提供することを目指しています。
- インフラエンジニア
- AWS