データセンターにOpenVPNサーバーをセットアップしていて、クライアントとしてtunnelblickを使用しています。接続したら、ルートをmy DC LAN 10.0.0.0/24ネットワークに追加し、プライマリDNSとして10.0.0.1、セカンダリDNSとして8.8.8.8を使用します。
10.0.0.1dc.example.comでサブドメインDNSエントリをホストします
問題は、VPNトンネルが確立されたときに、DNS解決が一貫して機能しないことです。
確認したところ、/ etc /resolve.confと「SystemPreference-Network-DNSServers」の両方で同じ結果が表示され、期待どおりに「10.0.0.1」と「8.8.8.8」が表示されます。
しかし、ターミナルでは、「Dig」と「ping」の結果が混在していました。 Digの場合、私は次のようにsthを取得できます
➜ ~ Dig ftp.dc.example.com
; <<>> Dig 9.8.3-P1 <<>> ftp.dc.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22990
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;ftp.dc.example.com. IN A
;; ANSWER SECTION:
ftp.dc.example.com. 3600 IN A 10.0.1.13
;; Query time: 84 msec
;; SERVER: 10.0.0.1#53(10.0.0.1)
;; WHEN: Thu Nov 24 15:39:21 2016
;; MSG SIZE rcvd: 55
しかし、pingのために私は得ました
➜ ~ ping ftp.dc.example.com
ping: cannot resolve ftp.dc.example.com: Unknown Host
そして、ブラウザのような他のアプリケーションでは、基本的に解決できない「ping」と同じ結果が得られました。
ご覧のとおり、ネットワークの問題やDNSサーバーの問題はありません。そうでない場合、「Dig」は機能しません。
しかし、「www.google.com」にクエリを実行すると、「ping」と「Dig」の両方が機能します。
したがって、VPN接続が確立されると、resolve.confはそれに応じて更新されるようですが、一部のアプリケーションはまだ古いDNSサーバーにクエリを実行している可能性があります。
ターミナルアプリケーションを再度開くか、iTermなどの別のターミナルを使用しようとすると、同じ結果になります。ただし、10〜15分待つと、pingとブラウザが機能します。
OS Xが複数のDNSサーバー(10.0.0.1や8.8.8.8など)で構成されている場合、システムリゾルバーはそれらをプライマリとセカンダリなどとして処理せず、すべてを使用します。したがって、ftp.dc.example.comにアクセスしようとすると、10.0.0.1サーバーでその名前を検索しようとする(そして成功する)か、8.8.8.8サーバーで試行する(そして失敗する)可能性があります。特定のルックアップにどちらを使用するかは、多かれ少なかれランダムです。
私が知っている唯一の解決策は、DNSサーバーを使用したくない場合を除いて、リストにDNSサーバーを含めないことです。この場合、それは8.8.8.8ではなく10.0.0.1 のみを使用することを意味します。
ところで、Dig
、Host
、およびnslookup
はシステムリゾルバーを通過しないため、同じように動作しません。これらはすべて、最初にリストされたDNSサーバーを使用します。具体的には、別のサーバーにクエリを実行するように指示します。
これは、OSXのDNSキャッシュの影響を受けているようです。 VPN接続のクライアント側の「アップ」スクリプトでキャッシュを手動でフラッシュすることが問題になる場合があります。この記事はあなたに役立つかもしれません http://osxdaily.com/2014/11/20/flush-dns-cache-mac-os-x/
少し遅れましたが、VPNと組み合わせてDNSの問題を探すときに、Googleは一貫してこの問題を指摘してくれました。 VPNセットアップに関する私にとっての問題は、OSXが/etc/resolv.confを使用せず、scutilを介してアクセス可能な情報を使用することでした。
scutil --dns
を介して現在のDNS構成を表示できます。私の場合、解決に使用されているVPNネットワークの内部DNSサーバーがいくつかリストされています。
DNS configuration
resolver #1
nameserver[0] : 80.84.224.26
nameserver[1] : 80.84.224.249
flags : Request A records
reach : 0x00000002 (Reachable)
...
これはVPNでのルックアップには機能しますが、他にアクセスすることはできませんでした。名前でこれらにアクセスすることに興味がないので、ここにリストされているDNSエントリをsc-utilを使用してパブリックエントリに置き換えました。
scutil
> open
> d.init
> get State:/Network/Service/FctVpnService/DNS
> d.add ServerAddresses * 8.8.8.8 9.9.9.9
> set State:/Network/Service/FctVpnService/DNS
> exit
scutil --dns
を再度使用すると、構成したばかりのサーバーアドレスが表示されます。
resolver #1
nameserver[0] : 8.8.8.8
nameserver[1] : 9.9.9.9
flags : Request A records
reach : 0x00000002 (Reachable)
私がFctVpnService
と書いているところでは、環境に固有のキーを検索しなければならない場合があることに注意してください。 sc-util
を開始した後、list
コマンドを呼び出すと、キーを見つけることができます。