docker内でdnsmasqをDHCP、DNSサバーとして動作させる

docker image をダウンロード jpillora/dnsmasq を使わせていただきました。

sudo docker pull jpillora/dnsmasq

docker 用のフォルダに dnsmasq フォルダを作り、その中に以下のファイルを作成
- dnsmasq_resolv.conf # 親DNSサバーの設定ファイル 書式は/etc/resolv.confと同じ
- dnsmasq-DNS.log # dnsmasqのログが書き込まれるファイル
- dnsmasq.conf # dnsmasqの設定ファイル
- dnsmasq.leases # dnsmasqのDHCPサーバーのリースデータベース - hosts_dnsmasq # LAN内用のホスト名→IPアドレスの設定ファイル 書式は/etc/hostsと同じ

dnsmasq.confに設定を書く

#dnsmasq config, for a complete example, see:
#  http://oss.segetech.com/intra/srv/dnsmasq.conf

#### DNS キャッシュの設定
# 参考ページ
# Linux Dnsmasqで簡単にDNSサーバを構築する手順:dekiruengineer.com/engineer/dnsmasq_install_for_linux/
# Dnsmasq インストールと設定:www.server-world.info/query?os=Ubuntu_16.04&p=dnsmasq
port=53
cache-size=2000
bogus-priv
domain-needed

no-hosts
addn-hosts=/etc/hosts_dnsmasq

#strict-order  #resolv.conf ファイルに書かれた順番でDNSサバーにアクセスする。使われるのは上から2つだけ
# コメントアウトされている時は最初の query で resolv.conf に書かれたすべてのDNSサバーにアクセスして使うサーバーを自動的に選択する
# ログ
log-queries
log-facility=/var/log/dnsmasq/dnsmasq-DNS.log


#### DHCP の設定
# 参考ページ
# Linux環境設定/dnsmasqをDHCPサーバとして使う場合の最小限の設定例 : linux.just4fun.biz/?Linux環境設定/dnsmasqをDHCPサーバとして使う場合の最小限の設定例
#
# dhcp-range=リースする最初のアドレス,リースする最後のアドレス,リース期間
# dhcp-range=192.168.111.150,192.168.111.250,12h
# dhcp-host=MACアドレス,固定したいIPアドレス 複数可 
## ネットワーク機器 1~10
# 192.168.111.1 # ルーター
# dhcp-host=SA:MP:LE:AD:DR:ES,192.168.111.2 # Sample
## 家電等 20~30

dhcp-option=option:ntp-server,210.173.160.27,210.173.160.57,210.173.160.87
dhcp-option=option:netmask,255.255.255.0
dhcp-option=option:router,192.168.111.1     # ルーター
dhcp-option=option:dns-server,${動作させるパソコンのローカルIPアドレスとか} # DNSサバー
dhcp-leasefile=/var/lib/misc/dnsmasq.leases # DHCPのリースデータベース(クライアント一覧)
#log-dhcp   # DHCP の詳細log を出力

dnsmasq_resolv.conf にnameserver 8.8.8.8 など設定を書き込む

# google
nameserver 8.8.8.8 
nameserver 8.8.4.4

dnsmasq起動用のshを作り、PCの起動時に読み込まれるように設定する

#!/bin/sh
##rootユーザー以外ならsudoを使う
if [ `whoami` = 'root' ]; then
    SUDO=""
else
    SUDO=sudo
fi

## 設定
_soft_name="dnsmasq"
home_dir="${docker用のフォルダの場所}/${_soft_name}"

docker_start(){

    ${SUDO} docker run --rm \
    -v /etc/localtime:/etc/localtime:ro \
    --name=${_soft_name} \
    --net host --privileged \
    -v ${home_dir}/dnsmasq.conf:/etc/dnsmasq.conf \
    -v ${home_dir}/dnsmasq.leases:/var/lib/misc/dnsmasq.leases \
    -v ${home_dir}/dnsmasq-DNS.log:/var/log/dnsmasq/dnsmasq-DNS.log \
    -v ${home_dir}/dnsmasq_resolv.conf:/etc/resolv.conf \
    -v ${home_dir}/hosts_dnsmasq:/etc/hosts_dnsmasq \
    --log-opt "max-size=10m" \
    -e "HTTP_USER=foo" \
    -e "HTTP_PASS=bar" \
    -e "PORT=5380" \
    jpillora/dnsmasq
}

## 設定ここまで

docker_stop(){
    ${SUDO} docker stop ${_soft_name}
}

docker_restart(){
    docker_stop
    docker_start
}

case $* in
    start ) docker_start ;;
    stop  ) docker_stop ;;
    restart ) docker_restart ;;
    * ) echo "err $*
    start or stop or restart"
esac

--net hostオプションがないとdnsmasq-dhcp: no address range available for DHCP request via eth0とエラーが出てIPの振り分けができませんでした
--privilegedオプションがないとdnsmasq-dhcp: ARP-cache injection failed: Operation not permittedとエラーが出てIPの振り分けができませんでした
dhcpサーバーはブロードキャストを受け取る必要があるので--net host --privilegedでないと動作しないようです

参考
archwiki dnsmasq : wiki.archlinux.jp/index.php/Dnsmasq
docker hub jpillora/dnsmasq : hub.docker.com/r/jpillora/dnsmasq
Linux環境設定/dnsmasqをDHCPサーバとして使う場合の最小限の設定例 : linux.just4fun.biz/?Linux環境設定/dnsmasqをDHCPサーバとして使う場合の最小限の設定例
Linux Dnsmasqで簡単にDNSサーバを構築する手順 : dekiruengineer.com/engineer/dnsmasq_install_for_linux/
dnsmasq.confのテンプレート : oss.segetech.com/intra/srv/dnsmasq.conf
Docker + Linuxでいい感じに自宅・小規模オフィス用ルータを作る : qiita.com/m_mizutani/items/d41b9c97b37535b2708c
【図解】初心者にも分かるDHCPの仕組み (シーケンス、UDPを使う理由、実装例、設定例) : milestone-of-se.nesuke.com/nw-basic/grasp-nw/dhcp/
Raspberry Pi 3 Model B をネットワークブートで起動させる : leavatail.hatenablog.com/entry/2020/03/15/190000
github jpillora/webproc : github.com/jpillora/webproc/