「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 キャッシュをクリアする方法
キャッシュをフラッシュすると、すべてのエントリが削除され、収集プロセスがもう一度開始されます。エントリがある場合、これによりキャッシュから不正確で破損したエントリが強制的に削除されます。
コマンドは簡単です。resolvectl
をflush-caches
オプションと一緒に使用します。
resolvectl flush-caches
コマンド ラインに何も表示されません。何かが起こったことを確認するために、DNS キャッシュの統計をもう一度確認します。
resolvectl statistics
キャッシュ サイズがゼロに低下していることがわかります。新しいエントリが蓄積されるにつれて、時間の経過とともに増加します。
Linux で dnsmasq キャッシュをフラッシュする方法
dnsmasq
アプリケーションは、DNS キャッシュと DHCP サーバーを提供します。独自の DNS サーバー、特に systemd 以外のインストールで実行したいユーザーに人気があります。
dnsmasq
DNS キャッシュをフラッシュするのは簡単です。SIGHUP
シグナルを送信する必要があります。これにより、dnsmasq
デーモンは実質的に再初期化されます。これにより、DNS キャッシュがクリアされます。シグナルを送信するには、killall
コマンドを-HUP
フラグとアプリケーションの名前と一緒に使用します。
sudo killall -HUP dnsmasq
フラッシュが正常に完了
もちろん、コンピュータがまったくキャッシュしていない場合は、チェックする必要はありません。
DNS 要求をキャッシュしているが、すべてが正常に機能している場合は、無視することもできます。しかし、Web を閲覧しているときに Web ページの更新が遅くなったり、断続的になったり、まったく別の Web ページが表示されたりしている場合は、DNS キャッシュをクリアする良いタイミングです。
コメントする