2026年4月19日日曜日

DNSサーバーを立てて外出先と家の中で同じホスト名を使いたい

自宅サーバーを立てているが、家の中だと192.168.*、外出先だとtailscaleを使ってtailscaleのIPになる。immichのアプリだとssidで判定して切り替えてくれるが、ssidは一つしか登録できないので、2.5GHzと5GHzでssid変わると機能しない。他にもsshとかブラウザのブックマークは全部2通り登録して切り替えないといけないのでめんどくさい。なんとかならないかと思って試行錯誤。

とりあえず家の中のwifiに繋がっている間は自宅サーバーのDNSを見に行って、その他は5Gかtailscale dnsを見に行ってくれればいいので、ルーターが配信するDNSを自宅サーバーで動かすDNSに切り替えてみることにした。

やったこと 

自宅サーバーであるraspberrypiにdnsmasqを入れる

apt install dnsmasq 
systemctl start dnsmasq 

systemd/resolvdとやらがdnsを使っているのでエラーになる。いらないのでdns機能を停止。 

vi /etc/systemd/resolvd.conf.d/98-disabledns.conf
[Resolve]
DNSStubListener=no

vi /etc/dnsmasq.d/dns.conf
no-resolv
# サーバのホスト名とローカルIPを設定
address=/tailscaleと同じホスト名/192.168.11.50
# ルータのIP (親DNSになる)
server=192.168.11.1
# 念の為のgoogledns
server=8.8.8.8

動かしてみる

systemctl start dnsmasq
systemctl enable dnsmasq

digとかnslookupで確認し、ルータのDHCP設定のDNSをこのサーバのIPにする

結果 

PCではこれでうまく行った。自宅内ならtailscaleに繋いでても繋いでなくても192.168.11.50に行く。
スマホで5Gにしてtailscaleに繋げばtailscale dnsでつながる。
ただし、PCではうまく行くのにスマホ(android)の場合だけ自宅内のdnsがうまく行かなかった。どうやらプライベートDNSとやらのせいのようだ。

androidの場合、wifiに繋いでdnsを使う際にプライベートDNSを有効にしてあるとルータから指定されたDNSではなく勝手に独自のDNSを見に行くようになっているようだ。このせいでせっかく立てたDNSサーバーが意味をなさなくなる。

プライベートDNSとして DNS over TLSが使えなかったら普通のDNSになるという話を見てtcp853をブロックしたりしてみたが、どうも思った動きをしていない。アプリによってはやっぱり自宅内DNSを見に行かないようだ。プライベートDNSを無効にすると思った通りの動作となる。

ブロックされたらOS?としてのプライベートDNSは無効になるけど、webviewとかはプライベートDNS有効の設定が生きていて DNS over SSLとかで引いてきてしまうとかかもしれないが、SSLは流石にブロックできない。どうにもこうにもうまく行かないので諦めた。プライベートDNSを無効にすれば思った通り動作するが、偽サイトに誘導されそうでやっぱりちょっと怖い。全部2通りのアドレスをブックマークするかしかないのか。

というか特定のwifiではプライベートDNS無効にするとかできてもいいと思うんだけど。ネットを漁った感じでは5年以上進歩しないようなので期待薄な感じ。 

0 件のコメント:

コメントを投稿