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/