内部DNSをTermuxのDNSMASQで動かす!

じゃんくはっく
じゃんくはっく

内部ネットワークから参照するDNSを作ったよ!

それって、どんなDNSなの?

ぴー
ぴー
じゃんくはっく
じゃんくはっく

例えば、example.jpだと192.168.1.1にアクセスできるようにするとかできるよ

UターンNAT対策?

ぴー
ぴー

そうなんですよねー。UターンNAT対策で内部DNSが欲しかったんです。

内部DNSを低消費電力サーバのスマホtermuxで動かしたいなと思って、いろいろ格闘していました。先日はOpenWrtというルータ上で動かしていましたが、今回は、root化したスマホ上のtermuxで動かしてみました。53ポートで動かすのでroot化が必要ですが、termuxのrootパッケージの1つ、dnsmasqを使って内部DNSを作ろうと思います。

dnsmasqとは?

公式:Dnsmasq

http://www.thekelleys.org.uk/dnsmasq/doc.html

比較的、軽量でDHCP、BOOTPやPXEにも対応しているDNSサーバでOpenWrtにも使われていたります。自ドメイン以外は指定のDNSに転送して応答してくれます。内部ネットワーク向けの簡易なDNSとしては十分な機能をもっていますね。

今回は、IPv4で自ドメインの応答とそれ以外は8.8.8.8のDNSにフォワードして応答してもらうだけのシンプル設定です。DHCPなどそれ以外の機能はつかいません。

Termuxのdnsmasqは?

ポート53で動かすので、root化したスマホにtermuxを動かしている必要があります。1024番ポート以下はrootじゃないとバインドできません。パッチ内容は以下から参照できます。

termux-root-packages:dnsmasq

URL

やってみましょうか!

ステップ1 インストール

インストール自体は簡単です。root-repoパッケージを入れてから、dnsmasqを入れるだけです。

$ pkg install root-repo -y
$ pkg install dnsmasq -y

本体とmanなどが入ります。サイズは264Kと小さいですね。

$ ll /data/data/com.termux/files/usr/bin/dnsmasq
-rwx------ 1 u0_a143 u0_a143 264K Aug 17 02:40 /data/data/com.termux/files/usr/bin/dnsmasq*

ステップ2 設定

Termuxのdnsmasqだと、設定ファイルはデフォルトで無いので作ります。

$ cd $PREFIX/etc
$ vi dnsmasq.conf 

内容は以下です。ほどよく読み替えてください。

ホスト設定:$PREFIX/etc/hosts-dnsmasq
ログ:$PREFIX/var/log/dnsmasq.log
このホストIP:192.168.1.38
Termuxユーザ:u0_a143
ドメイン:gpl.jp
フォワードするDNS:8.8.8.8

listen-address=127.0.0.1,192.168.1.38
port=53
bind-interfaces
user=u0_a143
group=u0_a143
no-poll
# プライベートIPアドレスの逆引きを上位DNSサーバに転送しない
bogus-priv
# ドメインの無いホスト名のみ問い合わせの場合、上位DNSサーバに転送しない
domain-needed
# ローカルエリア内のドメインを指定
local=/gpl.jp/
# ホスト名で問合せされた時、下記のdomain=で指定されたドメイン名を補完
expand-hosts
# 補完するドメイン名
domain=gpl.jp

# LocalDNS
addn-hosts=/data/data/com.termux/files/usr/etc/hosts-dnsmasq
server=/gpl.jp/192.168.1.38
server=/1.168.192.in-addr.arpa/192.168.1.38
log-queries
log-facility=/data/data/com.termux/files/usr/var/log/dnsmasq.log

server=/localnet/192.168.1.38 # change ip for your ip-server
server=8.8.8.8
no-resolv 

ホスト設定:$PREFIX/etc/hosts-dnsmasq は以下となります。

192.168.1.38    f2
192.168.1.47    p3
192.168.1.47    hack
192.168.1.47    junkhack

resolvファイルは自サーバを参照するよう以下にしておきます。

$ cat resolv.conf 
#nameserver 8.8.8.8
nameserver 192.168.1.38

ステップ3 起動

53ポートでバインドさせるので、rootで起動します。

$sudo dnsmasq -C $PREFIX/etc/dnsmasq.conf

ステップ4 確認

確認です。明示的に dig @hostip domain と@でdnsを指定するとより良いです。

$ dig f2 +short
192.168.1.38

$ dig -x 192.168.1.38 +short
f2.gpl.jp.

$ dig hack.gpl.jp +short
192.168.1.47

$ dig yahoo.co.jp +short
182.22.59.229
183.79.135.206

ホスト名のみでも大丈夫ですね。FQDN自ドメインも引けますし、逆引きもできます。管理外はフォワードして応答してきました。

例えばまったく違うドメインを指定

$ cat hosts-dnsmasq
192.168.1.38    f2
192.168.1.47    p3
192.168.1.47    hack
192.168.1.47    junkhack
192.168.1.111   test.example.jp

このように、違うドメイン名をFQDNで記載したら参照できるのでしょうか?

設定変更・再起動

$ sudo killall dnsmasq
$ sudo dnsmasq -C $PREFIX/etc/dnsmasq.conf

参照できるか引いてみます。

$ dig test.example.jp +short
192.168.1.111

$ dig -x 192.168.1.111 +short
test.example.jp.

参照できますね。これって設定ファイルのserver行でドメイン指定しなくてもいいんですかね? 設定項目はもっとシンプルにできるのかもしれませんが、追求するのはヤメにしておきます。

まとめ

同じ設定を、UmidigiF2では動きましたが、Pixel3ではフォワーダーが動かなかったです。

・UmidigiF2では動作し、Pixel3ではフォワーダーが動かない原因は不明
・機会があれば、BOOTPやPXEも試してみたい
・FQDNで記載すれば違うドメイン名でもOK
・MXやテキストレコードなどはどうやって指定するのだろう?

あとがき

今の所不具合はなさそうです。もう1週間ほど動かして問題なさそうであれば今のWordPressサーバを統合しようかなと思います。メインPCからもこのDNSを参照していますが速度的にも特に問題はない感じです。

著者にメッセージ

間違いのご指摘など、コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。