🦔

dnsmasqで特定ドメインへのアクセスを遮断する際のiOS対策

2024/08/17に公開

ローカルネットワークに立てたdnsmasqで、視界に入れたくないサイトのドメインをブロックしているのだが、いつ頃からかiPhoneやiPadといったiOSデバイスでは効かなくなっていた。

存在しないドメインに対する設定、例えば example.mylocaldomain 192.168.0.100 みたいな設定は効くのだが、存在するドメイン togetter.com 192.168.0.100 みたいな設定を書いてブロックしようとしても、なぜか普通にアクセスできてしまうのである。WindowsやLinuxでは問題ないので、明らかにiOSがおかしい。

原因を調べるのが面倒でずっと放置していたのだが、いい加減ストレスなので真剣に調査した。

原因は二つあった。

  1. 最近のiOSはDNS正引きでAやAAAAレコードではなく真っ先にHTTPSレコード(TYPE65)を引くため、dnsmasqが認識できずに自動でupstream serverに転送してしまう
  2. SafariのプライベートモードではiCloudプライベートリレーのDNSサーバが勝手に使用される(有料のiCloudに契約していなくても!)

これらに対処するため、dnsmasqの設定に次の内容を追加した

# ブロックしたいドメインはaddressではなくlocalに列挙する
local=/togetter.com/anond.hatelabo.jp/

# Private Relay関連のDNSアクセスをブロックする
local=/mask.icloud.com/mask-h2.icloud.com/

原因1に対処するだけなら、dnsmasq v2.90から加わった filter-rr=HTTPS という設定を使う方法もあるらしい。しかし単純にブロックしたいなら local を使う方が確実なようだ。

あとicloud.comのDNSをブロックするのは乱暴に思えるかもしれないが、公式に紹介されているベストな方法である。

参考ページ

Discussion