🦔
dnsmasqで特定ドメインへのアクセスを遮断する際のiOS対策
ローカルネットワークに立てたdnsmasqで、視界に入れたくないサイトのドメインをブロックしているのだが、いつ頃からかiPhoneやiPadといったiOSデバイスでは効かなくなっていた。
存在しないドメインに対する設定、例えば example.mylocaldomain 192.168.0.100
みたいな設定は効くのだが、存在するドメイン togetter.com 192.168.0.100
みたいな設定を書いてブロックしようとしても、なぜか普通にアクセスできてしまうのである。WindowsやLinuxでは問題ないので、明らかにiOSがおかしい。
原因を調べるのが面倒でずっと放置していたのだが、いい加減ストレスなので真剣に調査した。
原因は二つあった。
- 最近のiOSはDNS正引きでAやAAAAレコードではなく真っ先にHTTPSレコード(TYPE65)を引くため、dnsmasqが認識できずに自動でupstream serverに転送してしまう
- 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