virbr0 (libvirt) およびネットワーク マネージャー上の dnsmasq

virbr0 (libvirt) およびネットワーク マネージャー上の dnsmasq

テスト目的でワイルドカードを 127.0.0.1 に解決するように構成するために、ローカル マシンで dnsmasq を実行したいと考えています。

しかし、systemd で dnsmasq を起動しようとすると、次のエラー メッセージが表示されました。

[root@dhcppc4 ~]# systemctl status dnsmasq -l
● dnsmasq.service - DNS caching server.
   Loaded: loaded (/usr/lib/systemd/system/dnsmasq.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Fri 2015-10-09 21:49:58 BST; 14s ago
  Process: 2652 ExecStart=/usr/sbin/dnsmasq -k (code=exited, status=2)
 Main PID: 2652 (code=exited, status=2)

Oct 09 21:49:58 dhcppc4 systemd[1]: Started DNS caching server..
Oct 09 21:49:58 dhcppc4 systemd[1]: Starting DNS caching server....
Oct 09 21:49:58 dhcppc4 dnsmasq[2652]: dnsmasq: failed to create listening socket for port 53: Address already in use
Oct 09 21:49:58 dhcppc4 systemd[1]: dnsmasq.service: main process exited, code=exited, status=2/INVALIDARGUMENT
Oct 09 21:49:58 dhcppc4 systemd[1]: Unit dnsmasq.service entered failed state.
Oct 09 21:49:58 dhcppc4 systemd[1]: dnsmasq.service failed.

現在 DNS サーバーが実行されていないのにポート 53 が取得される理由がわからず ( で確認済みdig @127.0.0.1)、 を実行してnetstat -ln、アドレス のポート 53 をリッスンしているプロセスを発見しました192.168.122.1

tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN
udp        0      0 192.168.122.1:53        0.0.0.0:* 

ifconfig では、それが192.168.122.1仮想インターフェイス virbr0 であることがわかります。

グーグルとウィキでちょっと調べてみると、libvirtは物理インターフェースを抽象化するためにホストに仮想ネットワークを提供することがわかりました。libvirtはすべてのトラフィックがルーティングされる仮想ネットワークスイッチを使用します。[1]デフォルトの仮想ネットワーク スイッチ virbr0 は、デーモンが最初に起動したときに作成されます。

次に、このインターフェースで DIG 経由で dnsmasq にクエリを送信できることを確認できます。

[grobinson@dhcppc4 ~]$ dig @192.168.122.1 +short
a.root-servers.net.
j.root-servers.net.
m.root-servers.net.
b.root-servers.net.
i.root-servers.net.
k.root-servers.net.
l.root-servers.net.
d.root-servers.net.
g.root-servers.net.
c.root-servers.net.
h.root-servers.net.
e.root-servers.net.
f.root-servers.net.

質問1: dnsmasq がこの仮想インターフェースで listen する理由がわかりません。/etc/resolv.conf を見ると、DHCP サーバーで構成された DNS サーバーがマシンにクエリを Google DNS サーバーに転送するように指示していることがわかります。これは何に使用されますか?

# Generated by NetworkManager
nameserver 8.8.8.8
nameserver 8.8.4.4

/etc/NetworkManager/NetworkManager.conf行を編集して追加し、systemd でネットワーク マネージャーを再起動できることがわかりましたdns=dnsmasq。ここから、ネットワーク マネージャーはループバック アドレスの dnsmasq にクエリを送信するように構成され、dig を呼び出すだけで確認できます。

[grobinson@dhcppc4 ~]$ dig @127.0.0.1 +short
l.root-servers.net.
g.root-servers.net.
i.root-servers.net.
...

出力netstat -lnには、ポート 53 でバインドされ、リッスンしている 2 つのソケットが表示されます。

tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN     
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN 

質問2: ネットワーク マネージャーは 127.0.0.1 で dnsmasq を起動できるのに、systemctl では起動できないのはなぜですか? これは、デフォルト構成がすべてのインターフェイスで listen しようとしているため、virbr0 では失敗するからでしょうか? 必要なインターフェイスを指定するだけでよいのでしょうか?

質問3/etc/dnsmasq.conf: dnsmasq には 2 つの設定オプションと、設定ファイルを書き込むことができるフォルダーがあるようです/etc/NetworkManager/dnsmasq.d/。後者は、dns=dnsmasqが設定されていて、dnsmasq が 127.0.0.1 でリッスンしている場合のようです。編集しても/etc/dnsmasq.conf@127.0.0.1 へのクエリには影響しません。前者は libvirt の dnsmasq 用でしょうか?

答え1

デフォルトでは、libvirt は各仮想インターフェース ブリッジに対して dnsmasq インスタンスを起動します。これは、仮想ネットワークで実行されている VM に DHCP サービスを提供するために行われます。

http://wiki.libvirt.org/page/VirtualNetworking

基本的に、virbr ブリッジは、デフォルト設定を使用して VM を起動するたびに libvirt によって作成されます。これを防ぐには、VM を起動する前に自分でブリッジを作成し、カスタム ブリッジを引数として指定して「ブリッジ」モードで起動する必要があります。これを非常にわかりやすく説明しているマニュアル ページがこちらにあります。--network オプションを参照してください。

https://www-01.ibm.com/support/knowledgecenter/linuxonibm/liaat/liaatvirtinstalloptions.htm

libvirt で「仮想ネットワーク」を作成するたびに、そのための dnsmasq のインスタンスも起動されます。したがって、ここでも、libvrt の仮想ネットワークの使用をやめて手動で行う必要があります。

答え2

ローカルの /etc/hosts の変更を同じインターフェースを使用して VM に伝播させたい場合は、ローカルの libvirt プロセスに SIGHUP を実行するだけです。

答え3

dnsmasq インスタンスを、リッスンするインターフェースの明示的なリストに設定してください。

では、インターフェース名またはインターフェース IP の/etc/dnsmasq.confいずれかを使用できます。この設定でも、dnsmasq はすべてのインターフェースにバインドするため、構成ファイルに追加してこれを無効にします。interface=eth0listen-address=192.168.0.1bind-interfaces

または、設定ファイルで、 でインターフェース ブラックリストを指定しますexcept-interface=virtbr*

出典:

関連情報