Linux で DNS をフラッシュする方法

「resolvectl flush-caches」コマンドで、systemd ベースの Linux コンピュータで DNS キャッシュをフラッシュすることができます。dnsmasq を使用している場合は、代わりに「sudo killall -HUP dnsmasq」を使用して DNS をクリアできます。

Linux デバイスでのインターネット閲覧が遅くなったり、アクセスしている Web サイトが古かったり、まったく別の Web サイトだったりしませんか? Linux で DNS キャッシュをフラッシュする方法と、本当にフラッシュする必要があるかどうかを判断する方法について説明します。

DNS キャッシュとは?

ドメイン ネーム サービスとは、名前を数字に変換する魔法のようなものです。デバイスのネットワーク名と Web サイト名を取得し、その IP アドレスを検索します。ネットワークはその後、IP アドレスを使用して、これらのデバイスまたはサイトにトラフィックを正しくルーティングできます。

要求と呼ばれるこれらの検索は、瞬時に行われるわけではありません。わずかな期間がかかります。インターネット DNS 要求には、先行 DNS サーバー、ルート ネーム サーバー、トップレベル ドメイン サーバー、および権限 DNS サーバーへの問い合わせが必要な場合があります。DNS 要求は高速ですが、さらに高速にするために、最近の DNS 要求への応答は DNS 先行サーバーにキャッシュされます。

DNS 要求への応答が先行サーバーのキャッシュにある場合、他のサーバーに問い合わせる必要はありません。応答は先行サーバーのキャッシュから送信されます。同様に、ご家庭のブロードバンド ルーターでも小さなキャッシュが維持されています。ネットワーク デバイス名を使用してローカル ネットワーク デバイスを要求すると、ルーターが IP アドレスを提供します。外部 DNS サーバーから受信した応答をキャッシュする場合もあります。

通常、ネットワークと Linux コンピュータは、インターネット サービス プロバイダーまたは OpenDNS や Google DNS などの無料サービスによって提供される外部 DNS サービスを使用するように構成されています。一部の人が独自の DNS サーバーを実行する理由はありますが、ほとんどの人は実行していません。しかし、Linux コンピュータは DNS サーバーを実行していなくても、DNS 要求結果をキャッシュできます。

キャッシュされたデータを使用することの問題は、キャッシュされた詳細がキャッシュされて以来、何も変更されていないという前提に基づいていることです。詳細が変更された場合、受信する情報は古くなります。

キャッシュ エントリまたはキャッシュ全体が破損すると、せいぜい不安定なパフォーマンスになり、最悪の場合、セキュリティの脆弱性が発生します。その場合は、DNS キャッシュを「フラッシュ」またはクリアする必要があります。

コンピュータでローカル DNS キャッシュを使用していますか?

テスト コンピュータの中には、ローカル DNS キャッシュがオンになっているものもあれば、オフになっているものもありました。Manjaro 21 コンピュータではオフでしたが、Fedora 37 と Ubuntu 22.10 ではデフォルトでオンになっていました。

Linux コンピュータが DNS 要求をキャッシュしているかどうかを判断するには、systemctlコマンドのis-activeオプションを使用します。DNS キャッシュを管理するデーモンは、systemd-resolvedと呼ばれる systemd ネットワーク名解決マネージャーです。

systemctl is-active systemd-resolved

応答が「アクティブ」の場合、DNS キャッシュが行われています。応答が「非アクティブ」の場合、行われていません。この特定のコンピュータでは、アクティブです。resolvectlコマンドを統計オプションと一緒に使用して、キャッシュ内のレコード数を表示できます。

resolvectl statistics

このコンピュータの DNS キャッシュには 330 個のエントリがあることがわかります。

DNS キャッシュの確認

DNS キャッシュ エントリを確認することは、キャッシュをフラッシュするための前提条件ではなく、確認に興味がない場合は、この手順全体をスキップできます。ただし、情報を得られる場合もあります。破損を示すスクランブルされたエントリが表示されたり、ネットワーク上のデバイス アドレッシングの問題に関連するエラー メッセージが表示されたりすることがあります。

これらのエントリを表示するための簡単な方法はありません。できることはできますが、少し工夫が必要です。USR1、またはユーザー定義シグナル番号 1 は、killおよびkillallコマンドによって送信できるシグナルです。このシグナルには事前定義された意味はありません。アプリケーションはこのシグナルを無視したり、開発者が実装した方法で反応したりすることができます。

systemd-resolvedデーモンは、USR1によってキャッシュをシステム ログに書き込むことで反応します。その後、journalctlコマンドを使用して DNS エントリをフィルタリングできます。

USR1を指定してkillallコマンドを使用します。systemd-resolvedデーモンにシグナルを送信します。killallコマンドを使用していますが、systemd-resolvedデーモンは実行され続けていることに注意してください。これは、送信している終了シグナルではありません。

sudo killall -USR1 systemd-resolved

ここでjournalctlコマンドを-u(systemdユニットでフィルタリング) オプションと一緒に使用して、systemd-resolvedによって生成されたログ エントリを抽出します。その出力を「dns.txt」というテキスト ファイルにリダイレクトします。

sudo journalctl -u systemd-resolved > dns.txt

lessファイル ビューアを使用して、ファイルの内容を表示します。

less dns.txt

ドメイン名と IP アドレスの間のキャッシュされたマッピングは、テキストをスクロールして検索することで見つけることができます。

IP アドレスが 216.58.212.196 の Google のエントリを確認できます。Web ブラウザに IP アドレスを入力することで、確認できます。Google 検索のホームページが表示されるはずです。

Linux で DNS キャッシュをクリアする方法

キャッシュをフラッシュすると、すべてのエントリが削除され、収集プロセスがもう一度開始されます。エントリがある場合、これによりキャッシュから不正確で破損したエントリが強制的に削除されます。

コマンドは簡単です。resolvectlflush-cachesオプションと一緒に使用します。

resolvectl flush-caches

コマンド ラインに何も表示されません。何かが起こったことを確認するために、DNS キャッシュの統計をもう一度確認します。

resolvectl statistics

キャッシュ サイズがゼロに低下していることがわかります。新しいエントリが蓄積されるにつれて、時間の経過とともに増加します。

Linux で dnsmasq キャッシュをフラッシュする方法

dnsmasqアプリケーションは、DNS キャッシュと DHCP サーバーを提供します。独自の DNS サーバー、特に systemd 以外のインストールで実行したいユーザーに人気があります。

dnsmasqDNS キャッシュをフラッシュするのは簡単です。SIGHUPシグナルを送信する必要があります。これにより、dnsmasqデーモンは実質的に再初期化されます。これにより、DNS キャッシュがクリアされます。シグナルを送信するには、killallコマンドを-HUPフラグとアプリケーションの名前と一緒に使用します。

sudo killall -HUP dnsmasq

フラッシュが正常に完了

もちろん、コンピュータがまったくキャッシュしていない場合は、チェックする必要はありません。

DNS 要求をキャッシュしているが、すべてが正常に機能している場合は、無視することもできます。しかし、Web を閲覧しているときに Web ページの更新が遅くなったり、断続的になったり、まったく別の Web ページが表示されたりしている場合は、DNS キャッシュをクリアする良いタイミングです。