こんにちは!
DNSについて書籍を読んだり、Linux環境で触ったりしたのでここでアウトプットしていきます!
DNSとは
インターネットが発展する前、コンピュータ同士はIPアドレス(例:192.168.1.1)を使って通信していました。しかし、IPアドレスは覚えにくく、ネットワークが拡大すると管理が大変になりました。そこで、「人間が覚えやすい名前(ドメイン名)」と「コンピュータが理解できるIPアドレス」を対応させる仕組であるDNSが誕生したのです。
DNSは、「www.example.com」➡「192.0.2.1」 のように、ドメイン名をIPアドレスに変換する役割を持っています。これにより、人間は覚えやすいドメイン名を使いながら、コンピュータは正しいIPアドレスに接続できます。
ドメイン名の構造
ドメイン名は、階層構造(ツリー構造)を持ち、ピリオド(.)で区切られています。
例えば、「www.example.com」は以下のような階層になっています。
階層 | ドメイン名 | 説明 |
---|---|---|
ルートドメイン | . | 最上位のドメイン(ルートドメイン) |
トップレベルドメイン (TLD) | com | ドメイン名の最上位部分 |
セカンドレベルドメイン (2LD) | example | ドメイン名の中間部分 |
サードレベルドメイン (3LD) | www | サブドメイン(ホスト名) |
名前解決の仕組み
名前解決は、ドメイン名をIPアドレスに変換する仕組みのことです。
例えば、www.example.comにアクセスする際、DNSがドメイン名に対応するIPアドレス(例: 192.0.2.1)を探し、正しいサーバーへ接続できるようにします。
流れは下記のようになります。
手順 | 処理内容 |
---|---|
1 | ユーザー端末(PCやスマホ)がwww.example.comの問い合わせを開始し、持っているスタブリゾルバにキャッシュ検索を行う。 |
2 | ISP(インターネットサービスプロバイダ)や社内ネットワークで提供されるリカーシブ(再帰)DNSサーバーがキャッシュ検索を行う。 ※もしキャッシュがあれば即応答し、なければ次の手順へ |
3 | 全てのTLDを管理しているルートDNSサーバーが検索を行う。 |
4 | 対象のTLD DNSサーバーが検索を行う。 |
5 | ドメインの正式な情報(IPアドレスやサブドメインの管理情報)を持つ権威DNS(オーソリティブDNS)が最終的な応答を行う。 |
6 | リカーシブ(再帰)DNSサーバーがキャッシュを登録し、以後の問い合わせに備える。 |
リソースレコード
DNSのデータは リソースレコード(RR) という形式で保存されています。リソースレコードには、ドメインに関するさまざまな情報(IPアドレス、メールサーバー、DNSサーバーの情報など) が含まれます。
レコードタイプ | 説明 | 例 |
---|---|---|
A レコード | IPv4アドレスを指定する | example.com → 192.0.2.1 |
AAAA レコード | IPv6アドレスを指定する | example.com → 2001:db8::1 |
CNAME レコード | 別のドメイン名にエイリアスを設定 | www.example.com → example.com |
MX レコード | メールサーバーの情報を指定する | example.com → mail.example.com |
NS レコード | 権威DNSサーバーを指定する | example.com → ns1.example.com |
TXT レコード | 任意のテキストデータ(SPF, DKIM, etc.) | example.com → "v=spf1 include:_spf.google.com ~all" |
SRV レコード | 特定のサービス用のDNS情報(VoIP, SIP, etc.) | _sip._tcp.example.com 10 60 5060 sip.example.com |
PTR レコード | 逆引きDNS(IPからドメインを取得) | 192.0.2.1 → example.com |
SOA レコード | ゾーン(ドメイン)の管理情報 | example.com → 管理者情報、シリアル番号 |
実際にLinuxに試してみる
では、DNSを実際にローカル環境で試していきたいと思います。
前提条件
- Ubuntuサーバーが動作している
- Apache(Webサーバー)がインストールされている
-
192.168.~.~
をUbuntuサーバーのIPとする
1. BIND(DNSサーバー)のインストール
まず、DNSサーバーのインストールを行います
下記コマンドを実行していきます
sudo apt update
sudo apt install -y bind9
sudo systemctl enable --now bind9
2. ゾーンファイルの設定
BINDにkeita.server
のゾーン情報を登録します。
sudo nano /etc/bind/named.conf.local
のファイルに以下を追記します。
zone "keita.server" {
type master;
file "/etc/bind/db.keita.server";
};
3. ゾーンデータの作成
sudo cp /etc/bind/db.empty /etc/bind/db.keita.server
sudo nano /etc/bind/db.keita.server
以下の内容に編集をします。
$TTL 604800
@ IN SOA keita.server. root.keita.server. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS keita.server.
@ IN A 192.168.~.~
www IN A 192.168.~.~
設定後にBINDを再起動します。
sudo systemctl restart bind9
4. クライアント側のDNS設定
クライアントPCのDNS設定をBINDに向けます。
sudo nano /etc/resolv.conf
のファイルに以下を追記します。
nameserver 192.168.~.~
設定後に動作確認をします。
nslookup keita.server
期待される出力:
Server: 192.168.~.~
Address: 192.168.~.~#53
Name: keita.server
Address: 192.168.~.~
5. Apacheのバーチャルホスト設定
sudo nano /etc/apache2/sites-available/keita.server.conf
のファイルに以下を記載します。
<VirtualHost *:80>
ServerName keita.server
ServerAlias www.keita.server
DocumentRoot /var/www/html
<Directory /var/www/html>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/keita_error.log
CustomLog ${APACHE_LOG_DIR}/keita_access.log combined
</VirtualHost>
設定反映:
sudo a2ensite keita.server.conf
sudo systemctl restart apache2
動作確認:
curl http://keita.server
期待される出力:
<html>
<body>
<h1>Apache Test Page</h1>
</body>
</html>
6. 他のPCからアクセスする方法
クライアントPC(Windows)のhosts
ファイルを編集する必要があります。
C:\Windows\System32\drivers\etc\hosts
以下を追加:
192.168.~.~ keita.server
ブラウザで http://keita.server
にアクセスし、ページが開けば成功です。
まとめ
今回詳細した方法は ローカル環境限定 で有効な設定です。セキュリティ的対策はしていないので、ローカル開発環境のテストとして活用してください!