🙌

Dnsmasqで簡易DNS+dhcpサーバを構築する

2022/06/02に公開

初めに

小規模向けDNSサーバであるDnsmasqを使ってDNS, dhcpサーバを構築してみます。

Dnsmasqとは

Dnsmasqとは,小規模ネットワーク(クライアント1,000台以下を想定)向けのDNSサーバー,DHCPサーバの機能を持つソフトウェアです。
DNSサーバ用のソフトウェアとしてbindもよく使われていますが,bindと比較すると軽量で設定が簡単という特徴があり,小規模な環境での用途に向いています。
公式: https://thekelleys.org.uk/dnsmasq/doc.html

環境

CentOS Stream 8
Dnsmasq 2.79
Ubuntu 20.04 LTS

構成

図のような構成を作り,以下の検証を行います。

  1. 内部LANのubuntuからDnsmasqへの非再帰問い合わせが成功する
  2. インターネット上のDNSサーバに対して再帰問い合わせが成功する

インストール

Dnsmasqをインストールします。CentOSなのでdnfコマンドで入れられます。

dnf -y install dnsmasq

設定

設定ファイルは/etc/dnsmasq.confです。
DNS, dhcpサーバとして機能させるため最低限の設定を行います。

/etc/dnsmasq.conf
#DNS設定
# 10行目, TCP53番ポートを使用。デフォルトでも53。
port=53
# 19行目, ドメイン名や.のないクエリを上位サーバーに問い合わせない
domain-needed
# 21行目, プライベートIPアドレスの逆引き要求を上位サーバーに問い合わせない
bogus-priv
# 135行目, ドメイン名のないクエリに自動的にドメイン(144行目, domain=で記述)を付与する
expand-hosts
# 144行目, 内部ドメインとしてlocalを使用
domain=local

#DHCP設定
# DNS, dhcpを提供するNICを指定
interface=ens224
# dhcpを提供しないNICを指定。自宅LAN側にはすでにdhcpサーバがあるのでそちらにはdhcpを提供しない。
no-dhcp-interface=ens192 
# 163行目, dhcpでのアドレス割り当て範囲
dhcp-range=192.168.10.2,172.16.10.200,255.255.255.0,12h
# 334行目, デフォルトゲートウェイ
dhcp-option=option:router,192.168.10.1


dhcpによるipアドレスの割り当てが確認できました。
dhcp-option=optionでdnsのipアドレスを指定しなくても自動的に割り当てられるようです。

上位DNSの指定

上位DNSはデフォルトで/etc/resolve.confに記述します。今回の検証では自宅LAN上のルータを指定します。
/etc/dnsmasq.confの46行目,resolv-file=にファイル名を指定して,そのファイルに記述することもできます。

/etc/resolve.conf
nameserver 192.168.0.2

Aレコードの登録

Aレコードはデフォルトで/etc/hostsに記述します。今回の検証では,macにmac.localというFQDNを使用することにします。

/etc/hosts
192.168.0.1 mac.local

ポート開放, NATの構築

DNSとdhcpで使うポートをfirewall-cmdで開放しておきます。
内部LAN用のNIC(ens224)をinternalのzoneに割り当て,dhcpとDNSを使用可能にします。
またfirewall-cmdでNATを構築し内部LANから自宅LANへの通信を可能にします。

# DNS, dhcpポートの開放
firewall-cmd --zone=internal --change-interface=ens224 --permanent 
firewall-cmd --add-service=dhcp --zone=internal --permanent
firewall-cmd --add-service=dns --zone=internal --permanent

# NATの構築
firewall-cmd --zone=internal --add-masquerade –-permanent 
firewall-cmd –-permanent --direct --add-rule ipv4 nat POSTROUTING 0 -o eth192 -j MASQUERADE  
firewall-cmd –-permanent --direct --add-rule ipv4 filter FORWARD 0 -i eth224 -o eth192 -j ACCEPT  
firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i ens192 -o ens224 -m state --state RELATED,ESTABLISHED -j ACCEPT 

# 設定の反映
firewall-cmd --reload 

起動/再起動/リロードなど

systemctlコマンドで起動/再起動等をすることができます。
/etc/hostsの内容を編集した後は,それを反映させるためにforce-reloadをする必要があります。

# 起動
systemctl start dnsmasq
# 再起動
systemctl restart dnsmasq
# 停止
systemctl stop dnsmasq
# ステータス確認
systemctl status dnsmasq
# 更新反映
systemctl force-reload dnsmasq

検証

非再帰問い合わせ

まず,内部LANのubuntuからDnsmasqへの非再帰問い合わせを試します。
digコマンドでmac.localが名前解決できるか確認します。

dig mac.local @192.168.10.1


OKです。

再帰問い合わせ

次に再帰問い合わせを行います。
digコマンドでwww.google.comが名前解決できるか確認します。

dig www.google.com @192.168.10.1


無事成功しました!

おわりに

DnsmasqでDNS,dhcpサーバーを構築することができました。
簡単に構築できるため個人での検証用などでは非常に便利だと思います。

参考リンクまとめ

Dnsmasq公式: https://thekelleys.org.uk/dnsmasq/doc.html
DNSの用語解説: https://www.isoroot.jp/blog/2905/

Discussion