特定のドメインにデフォルト以外のDNSリゾルバーを使用したかったのですが、最初のアイデアは、単にローカルのdnsmasqを使用することでした。 MacOSのバージョンを探しているときに、/etc/resolver/example.com
にドメイン名を含むファイルを作成するだけで同じことができることがわかりました。
nameserver 8.8.8.8
すべて良好で、期待どおりに機能し、解決策は機能し、scutil --dns
は次のことを確認します。
resolver #8
domain : example.com
nameserver[0] : 8.8.8.8
flags : Request A records
reach : Reachable
次に、私はこれを友人と共有したいと思いました。彼の端末で実行できるシンプルなワンライナーを作成することです。
Sudo mkdir -p /etc/resolver/ && echo "nameserver 8.8.8.9" | Sudo tee /etc/resolver/example.net
繰り返しますが、scutil --dns
は次のことを確認します。
resolver #10
domain : example.net
nameserver[0] : 8.8.8.9
flags : Request A records
reach : Reachable
その後、タイプミスに気付いたので、アドレスを8.8.8.8に修正して、もう一度行を実行しました。
Sudo mkdir -p /etc/resolver/ && echo "nameserver 8.8.8.8" | Sudo tee /etc/resolver/example.net
しかし、それは何の効果もないようでした:
resolver #10
domain : example.net
nameserver[0] : 8.8.8.9
flags : Request A records
reach : Reachable
ファイルの内容を確認したところ、すべて問題ないように見えました。
$ cat /etc/resolver/example.net
nameserver 8.8.8.8
次に、vim
でファイルを開き、8.8.4.4
に変更しました。
resolver #10
domain : example.net
nameserver[0] : 8.8.4.4
flags : Request A records
reach : Reachable
何度か確認しましたが、アドレスをファイルにエコーしても変更は効果がありませんが、vim
で開くだけで十分で、何も変更せず(終了するだけ)、以前はエコーされた変更が適用されます。この背後にあるメカニズムは何ですか?
[それ]は
vim
で開くだけで十分で、何も変更せず(単に終了するだけ)、以前にエコーされた変更が適用されます。
Sudo vim
が機能します。通常のユーザーで実行しても効果はありません。私の理論は、何を見ても/etc/resolver
はディレクトリへの変更を監視し、ディレクトリ内のファイルへの変更は監視しません。ディレクトリへの変更を検出すると、はディレクトリ内のすべてを再ロードします。 Vimは、デフォルトでは編集中のファイルと同じディレクトリにスワップファイルを作成します。これはディレクトリへの変更であり、ウォッチャーによってピックアップされます。だから、私がしたとき:
Sudo vim -n /etc/resolver/example.net
どこ -n
スワップファイルの作成を無効にします。ファイルへの変更はピックアップされなくなりました。
/etc/resolver
内の既存のファイルへの変更は通知されず、そのフォルダでファイルが作成または削除されたときにのみ通知されます。
このフォルダを監視するのは、IPMonitor
のconfigd
プラグインです。
ソースコードから:
status = notify_monitor_file(notify_token, resolver_directory_path, 0);
そして、この関数は、パスのinode
にモニターを設定します。そのため、/etc/resolver
のinode
が変更された場合にのみ通知が送信され、そのディレクトリ内のファイルのinode
が変更された場合は送信されません。
UNIXでは、ディレクトリは、その内容がディレクトリの内容をリストするテーブルであるファイルのようなものです。したがって、ファイルを追加または削除すると、このテーブルが更新されるため、inode
も更新され、通知がトリガーされます。ディレクトリ内のファイルを編集する場合、ディレクトリのinode
は一切変更されません。
ただし、macOSでは/etc/resolver
を使用しないでください。下位互換性のためにのみ残されています。代わりに、scutil
ツールを使用してアクセスできるダイナミックストアにDNSエントリを作成する必要があります。ぜひチェックしてください このトピックに関する私の返信 。
コンピューターを再起動するか、ネットワークデバイスのDNS設定を強制的に更新するまで、次のようにscutil --dns
で期待どおりのDNSエントリを返すことができませんでした。
networksetup -setdnsservers Wi-fi 8.8.8.8
この修正/ハックの詳細をここに書き留めます: https://josephharding.github.io/tutorials/2018/06/28/mac-resolver-refresh.html