📌

【Ubuntu】自宅用のローカルDNSを構築する

2024/04/07に公開

はじめに

管理する端末数が増えてきて、ssh等で接続するときにどのipがどの端末か覚えるのが面倒になってきた
そこで、前からやってみたかったDNSをLAN環境に構築する
DNSサーバー用のPCは特に用途のなかったLaptopを流用した

IPアドレスの固定

IPもDHCP割り当てにしてたので、これを機によく使うものは静的IPを割り当てることにした
Ubuntuであれば、ネットワーク設定は/etc/netplan/内のxxx.yamlファイルで定義されている
このyaml形式のファイルは(数値)_xxx.yamlのようになっているが、
冒頭の数値が大きいものを参照するらしい
デフォルトのyamlファイルの名前は環境によってまちまちな印象がある
特に名前はなんでもよさそう

本題となるdhcpによる割り当てを停止して、静的IPを割り当てるには下記のように設定するとよい

# #でコメントアウト可能
# <>は適宜書き換えること.<>は不要
# なおwifiの場合は、接続名やパスワード等の情報も入れる必要がある
network:
  ethernets:
    <NETWORK-NAME>:
      dhcp4: false
      addresses: [<設定したいIPアドレス>/<サブネットマスク>]
      routes:
        - to: default
          via: <デフォルトゲートウェイIP>
      nameservers:
        addresses: [<DNSのIP>]
  version: 2

#今回は下記のように設定した
network:
  ethernets:
    enp5s0:
      dhcp4: false
      addresses: [192.168.0.2/24]
      routes:
        - to: default
          via: 192.168.0.1
      nameservers:
        addresses: [192.168.0.2]
  version: 2

設定が終わったらnetplan applyで反映させる
ssh等で端末操作している場合は、接続が切れるので注意する
設定したIPアドレスで接続しなおせば問題ない

# generateはapplyに含まれるらしいのでapplyのみでも変更反映される
sudo netplan generate
sudo netplan apply

bind9でDNS設定

DNSは情報の多かったbind9を使って構築することにした
はじめにbind9をaptからインストールする

sudo apt-get update
sudo apt-get install bind9 bind9utils bind9-doc

bind9関連の設定ファイルは基本的に/etc/bind/にデフォルトで作成される
いくつかデフォルトファイルがあるので、それをコピペして自分の設定ファイルのベースにするとよい
はじめに/etc/bind/named.confを確認すると下記のようにファイルをincludeしていることがわかる
このincludeファイルにゾーン設定を行っていく
今回は下記のうち/etc/bind/named.conf.default-zonesに設定を追記した

cat /etc/bind/named.conf

# name.confの中身
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";

/etc/bind/named.conf.default-zonesにゾーン設定を追加する
今回は下記のように設定した
なお、上側がフォワードルックアップの設定で下側がリバースルックアップの設定になる
また、それぞれのゾーンの設定がさらにfileの後の部分のファイルに追記することになる

zone "home.local" {
        type master;
        file "/etc/bind/db.home.local";
};

zone "0.168.192.in-addr.arpa" {
        type master;
        file "/etc/bind/db.0.168.192";
};

つづいて、/etc/bind/db.home.localを編集する
このファイルはデフォルトでは作成されないので、適当なdb.~ファイルをコピペして作るとよい
実際に書き換えた内容は下記

$TTL    604800
@       IN      SOA     home.local. root.localhost. (
                              5         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      localhost.
gw      IN      A       192.168.0.1
dns     IN      A       192.168.0.2
serverr IN      A       192.168.0.3
serverb IN      A       192.168.0.4
pi-u20s IN      A       192.168.0.10
pi-u22s IN      A       192.168.0.11

さらに、/etc/bind/db..0.168.192を編集する
こちらも、適当なdb.~ファイルをコピペして作ること
実際に書き換えた内容は下記

$TTL    604800
@       IN      SOA     home.local. root.localhost. (
                              4         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      localhost.
1       IN      PTR     gw.home.local
2       IN      PTR     dns.home.local
3       IN      PTR     serverr.home.local
4       IN      PTR     serverb.home.local
10      IN      PTR     pi-u20s.home.local
11      IN      PTR     pi-u22s.home.local

書き換えが終わったら下記のコマンドで設定が適切かチェックする

sudo named-checkconf
sudo named-checkzone home.local /etc/bind/db.home.local
sudo named-checkzone 0.168.192.in-addr.arpa /etc/bind/db.0.168.192

問題なければ、bind9をリスタートする

sudo systemctl restart bind9

設定が通っているか確認するにはnslookupを使う

#下記で名前解決するか確認する
#nslookup "検索アドレス or PC名" "DNSサーバーアドレス"
nslookup 192.168.0.1 192.168.0.2
nslookup gw.home.local 192.168.0.2

さらに、dns設定がnetplanで正しく出来ていればdnsの指定がなくとも名前解決できる

#下記で名前解決するか確認する
nslookup 192.168.0.1 
nslookup gw.home.local 

Discussion