テスト目的でワイルドカードを 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=eth0
listen-address=192.168.0.1
bind-interfaces
または、設定ファイルで、 でインターフェース ブラックリストを指定しますexcept-interface=virtbr*
。
出典: