仮想マシンのレジューム時に名前解決に失敗する問題への対処

目次

概要

VMware Workstationで仮想マシンのサスペンドを行ったとに、レジュームを行うとネットワーク通信がうまくいかないということがありました。

この問題を解決した方法を紹介します。

環境

  • VMware Workstation 16.2.4
  • Windows 11 22H2
  • Ubuntu 22.04.1

問題について

VMwareの仮想化ソフトを私は利用しています。その仮想化ソフトで、仮想マシンを作成して様々なことをしているのですが、Ubuntu 22.04でサスペンドやレジュームをしていると、ネットワークが正常に機能しないという問題に遭遇しました。

どのような症状が出たのかというと、ブラウザやターミナルなどでインターネット上のサーバーに接続するときに、正常に接続できないというサーバーが時々見つかるというものです。例えば、ターミナル上から、aptコマンドでアップデートを行うときに、aptのリポジトリサーバーにアクセスできないということがありました。また、ブラウザからGoogleやYahooなどの大手のサイトにアクセスする際に、サーバーに接続できないということもありました。

エラーメッセージなどを確認するとサーバーのドメインの名前解決に失敗しているようでした。

おそらくですが、同じ仮想化ソフトとして、VMware Workstation PlayerやVirtualboxなどの他の仮想化ソフトでも同じような問題に遭遇する可能性があります。

また、私の環境では、仮想マシンのネットワーク接続としてNATを利用しています。もしかするとNAT以外を利用しているのであれば、今回の問題に遭遇しない可能性もあります。

設定の修正

この問題を解決する方法として、一度ネットワークを停止(リンクダウン)して、起動(リンクアップ)することで解決するのですが、毎回そのようなことをするのはとても面倒です。

そこで、今回は大本の設定を見直すこととしました。

今回の問題の原因は、Ubuntuが利用しているsystemd-resolvedというものに起因するようです。そのため、Ubuntuに限らずsystemd-resolvedを利用しているLinuxディストリビューションで同じような問題に遭遇する可能性があります。

systemd-resolvedは、DNSの名前解決を行います。実際に名前解決のためのDNSサーバーを指定する/etc/resolv.confを確認してみると、次のように記述されていました。

# This is /run/systemd/resolve/stub-resolv.conf managed by man:systemd-resolved(8).
# Do not edit.
#
# This file might be symlinked as /etc/resolv.conf. If you're looking at
# /etc/resolv.conf and seeing this text, you have followed the symlink.
#
# This is a dynamic resolv.conf file for connecting local clients to the
# internal DNS stub resolver of systemd-resolved. This file lists all
# configured search domains.
#
# Run "resolvectl status" to see details about the uplink DNS servers
# currently in use.
#
# Third party programs should typically not access this file directly, but only
# through the symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a
# different way, replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.

nameserver 127.0.0.53
options edns0 trust-ad
search localdomain

127.0.0.53というIPアドレスがDNSサーバーとして登録されていますが、これはsystemd-resolvedが名前解決を受け付けるIPアドレスのようです。

このsystemd-resolvedが正常に動作せず、レジューム時の名前解決が正常に動作しないということのようです。

この問題への解決方法として、systemd-resolvedの設定を修正します。

設定ファイルは、/etc/systemd/resolved.confにあります。このファイルを開くと、次のようなコメントが書かれています。

# Some examples of DNS servers which may be used for DNS= and FallbackDNS=:
# Cloudflare: 1.1.1.1#cloudflare-dns.com 1.0.0.1#cloudflare-dns.com 2606:4700:4700::1111#cloudflare-dns.com 2606:4700:4700::1001#cloudflare-dns.com
# Google:     8.8.8.8#dns.google 8.8.4.4#dns.google 2001:4860:4860::8888#dns.google 2001:4860:4860::8844#dns.google
# Quad9:      9.9.9.9#dns.quad9.net 149.112.112.112#dns.quad9.net 2620:fe::fe#dns.quad9.net 2620:fe::9#dns.quad9.net

設定ファイルのDNSやFallbackDNSにDNSサーバーを直接指定することで、DNSサーバーを固定することができるようです。主要なCloudflareやGoogle、Quad9のIPアドレスは既に書かれています。私はひとまずCloudflareを利用することにしました。みなさんの環境に合わせて修正していただければと思います。

CloudflareのDNSサーバーを記述するということで、次のように記述を追加しました。複数のDNSサーバーを記述する場合はIPアドレスの間に空白を入れて記述します。

DNS=1.1.1.1 1.0.0.1 2606:4700:4700::1111 2606:4700:4700::1001

その後、設定を反映させるためにsystemd-resolvedの再起動を行います。

sudo systemctl restart systemd-resolved.service

これで、設定は終わりです。

私の環境では、この後同じ問題に遭遇することはありませんでした。

さいごに

今回はsystemd-resolvedの設定を変更することで問題を解決しました。他にもsystemd-resolvedを使わずに、従来のNetworkManagerを利用する方法などもあります。