(無償) logo
世界中で使われるISO標準オフィスソフト(MSオフィス互換)

★LibreOfficeの導入事例★
詳細について

投げ銭

★投げ銭をしてくださるなら、下記のPayPal専用リンクからできます。m(_ _)m ★

2017年10月12日木曜日

【Linux CentOS 7】キャッシュ機能のあるdnsmasqをローカルでリゾルバとして利用する

dnsmasqは、DNSキャッシュサーバとしても動作する。
ローカルマシンで動作させることによって、名前解決が非常に速くなった。


■dnsmasqのインストールを行った。

# yum install dnsmasq
================================================================================
 Package         アーキテクチャー
                                バージョン                リポジトリー     容量
================================================================================
更新します:
 dnsmasq         x86_64         2.76-2.el7_4.2            updates         277 k
トランザクションの要約
================================================================================
更新  1 パッケージ
総ダウンロード容量: 277 k
Is this ok [y/d/N]: y
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
dnsmasq-2.76-2.el7_4.2.x86_64.rpm                          | 277 kB   00:05  
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  更新します              : dnsmasq-2.76-2.el7_4.2.x86_64                   1/2
  整理中                  : dnsmasq-2.66-21.el7.x86_64                      2/2
  検証中                  : dnsmasq-2.76-2.el7_4.2.x86_64                   1/2
  検証中                  : dnsmasq-2.66-21.el7.x86_64                      2/2
更新:
  dnsmasq.x86_64 0:2.76-2.el7_4.2                                            
完了しました!


■設定ファイルの編集を行った。

○オリジナルの設定ファイルのバックアップを行った。
# cp /etc/dnsmasq.conf /etc/dnsmasq.conf.org

○設定ファイルを作成しなおした。
(オリジナルをバックアップした後、あらかじめ削除しておく。)
# vim /etc/dnsmasq.conf

設定内容は、次のページにあるものを参考にした。(CentOS 6)
http://akira-arets.blogspot.jp/2017/04/centos6-dnsmasq-settings.html



■サービスの自動起動を設定した。

# systemctl enable dnsmasq.service
Created symlink from /etc/systemd/system/multi-user.target.wants/dnsmasq.service to /usr/lib/systemd/system/dnsmasq.service.


■サービスを起動した。

○起動
# systemctl start dnsmasq

○状態確認
# systemctl status dnsmasq
dnsmasq.service - DNS caching server.
   Loaded: loaded (/usr/lib/systemd/system/dnsmasq.service; enabled; vendor preset: disabled)
   Active: active (running) since 木 2017-10-12 10:49:02 JST; 26s ago
 Main PID: 4834 (dnsmasq)
   CGroup: /system.slice/dnsmasq.service
           └─4834 /usr/sbin/dnsmasq -k
10月 12 10:49:02 localhost.localdomain systemd[1]: Started DNS caching server..
10月 12 10:49:02 localhost.localdomain systemd[1]: Starting DNS caching server....
10月 12 10:49:02 localhost.localdomain dnsmasq[4834]: started, version 2.76 cachesize 150
10月 12 10:49:02 localhost.localdomain dnsmasq[4834]: compile time options: IPv6 GNU-getopt DBus no-i18n IDN DHCP DHCPv6 no-Lua TFTP no-conntrack ipset aut...t inotify
10月 12 10:49:02 localhost.localdomain dnsmasq[4834]: using nameserver 8.8.8.8#53
10月 12 10:49:02 localhost.localdomain dnsmasq[4834]: using nameserver 192.168.1.1#53 for domain local.example.com
10月 12 10:49:02 localhost.localdomain dnsmasq[4834]: failed to load names from /etc/dnsmasq_static_hosts.conf: No such file or directory
Hint: Some lines were ellipsized, use -l to show in full.

上記で、/etc/dnsmasq_static_hosts.conf が見つからないというエラーが表示されている。
これは静的レコードを記述するためのファイルで、/etc/hosts のように記述できる。
ここでは使用していない。



■動作テスト1

dnsmasqサービスは、ローカル(127.0.0.1)で動作している。
2回目のリクエストではキャッシュが効いて、名前解決が非常に早くなっていることがわかった。


○1回目のリクエスト
# dig @127.0.0.1 google.com
; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7 <<>> @127.0.0.1 google.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23438
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 299 IN A 216.58.***.***
;; Query time: 45 msec;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: 木 10月 12 10:**:** JST 2017
;; MSG SIZE  rcvd: 55

○1回目のリクエスト
# dig @127.0.0.1 google.com
; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7 <<>> @127.0.0.1 google.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22966
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 296 IN A 216.58.***.***
;; Query time: 1 msec;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: 木 10月 12 10:**:** JST 2017
;; MSG SIZE  rcvd: 55

■デフォルトでdnsmasqを利用して名前解決を行うように設定した。

○現在のネットワークデバイスの一覧
# nmcli device
デバイス  タイプ    状態      接続
wlp4s0    wifi      接続済み  wlp4s0
enp5s0    ethernet  利用不可  --  
lo        loopback  管理無し  -- 
○現在の接続について、DNSサーバー情報を取得
(現在は、ネットワーク上のDNSサーバーが指定されている。)
# nmcli dev show wlp4s0 | grep DNS
IP4.DNS[1]:                             192.168.1.1

○DNSサーバを自動的に取得しないように設定
# nmcli con mod wlp4s0 ipv4.ignore-auto-dns yes

○現在の接続で、ローカル動作のdnsmasqをDNSサーバとして利用するように設定
# nmcli con mod wlp4s0 ipv4.dns 127.0.0.1

○ネットワークに再接続
# nmcli con up wlp4s0
接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/6)

○現在の接続について、DNSサーバー情報を取得
(現在は、ネットワーク上のDNSサーバーが指定されている。)
# nmcli dev show wlp4s0 | grep DNS
IP4.DNS[1]:                             127.0.0.1


■動作テスト2

テスト1と同様に、レスポンスタイムを確認した。
上記で設定を済ませたので、今度は、@127.0.0.1を指定する必要がない。

○1回目のリクエスト
# dig yahoo.co.jp
; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7 <<>> yahoo.co.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5836
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;yahoo.co.jp. IN A
;; ANSWER SECTION:
yahoo.co.jp. 262 IN A 182.22.***.***
yahoo.co.jp. 262 IN A 183.79.***.***
;; Query time: 11 msec;; SERVER: 127.0.0.1#53(127.0.0.1);; WHEN: 木 10月 12 11:**:** JST 2017
;; MSG SIZE  rcvd: 72

# dig yahoo.co.jp
; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7 <<>> yahoo.co.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9528
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;yahoo.co.jp. IN A
;; ANSWER SECTION:
yahoo.co.jp. 260 IN A 183.79.***.***
yahoo.co.jp. 260 IN A 182.22.***.***
;; Query time: 0 msec;; SERVER: 127.0.0.1#53(127.0.0.1);; WHEN: 木 10月 12 11:**:** JST 2017
;; MSG SIZE  rcvd: 72

(注意)
○キャッシュの有効時間

上記、260 は、キャッシュの有効時間である。
これが、0 になってしまうと、キャッシュは無効になり、再び外部DNSサーバにリクエストされる。
したがって、元からキャッシュ有効時間が0に設定されているようなレコードについては、
デフォルトではキャッシュが機能しないことになる。()
この時間は、TTL と呼ばれ、DNSレコードと共に設定されている


○キャッシュできるホスト数の最大数

また、キャッシュ有効時間が残っているにも関わらず、上位DNSサーバに再名前解決している場合があった。(上記のようにdigコマンドで確認した。)
最初、dnsmasq側がレコードのTTLを無視して、独自設定のキャッシュ有効時間に従っているのかと思った。
考えてみれば、デフォルトではキャッシュされるホスト数は150個のようである。
これを越えた場合には、キャッシュが切り捨てられるのではないか。
そして切り捨て分については、上位DNSサーバから再取得することになったのではないかと思う。
キャッシュできるホスト数の最大数は、次の項目で設定できるので、この値を増やせば良いと思う。
cache-size=

○キャッシュ有効時間の上書き

また、dnsmasq側で、レコードのキャッシュ時間をコントロールすることもできるようだ。
(ただし、マニュアルには下記の設定項目は載っていなかったので動作するかわからない。)
最低キャッシュ有効時間は次の項目で設定できる。
これによって、たとえ元々レコードのTTLが0に設定されていても、dnsmasqは指定した秒数はキャッシュできる
min-cache-ttl=
逆に、キャッシュ有効時間をdnsmasq側で制限することもできる。
長いTTLが設定されたレコードにもかかわらず、指定した秒数までキャッシュする。
max-cache-ttl=


■統計情報を取得

○新しい情報をログに出力させる
# pkill -USR1 dnsmasq

○ログを表示する
# tail /var/log/messages
Oct 12 14:06:14 localhost dnsmasq[1349]: time 1507784774
Oct 12 14:06:14 localhost dnsmasq[1349]: cache size 150, 492/1533 cache insertions re-used unexpired cache entries.
Oct 12 14:06:14 localhost dnsmasq[1349]: queries forwarded 638, queries answered locally 164
Oct 12 14:06:14 localhost dnsmasq[1349]: queries for authoritative zones 0
Oct 12 14:06:14 localhost dnsmasq[1349]: server 8.8.8.8#53: queries sent 638, retried or failed 0
Oct 12 14:06:14 localhost dnsmasq[1349]: server 192.168.1.1#53: queries sent 0, retried or failed 0


実践DNS DNSSEC時代のDNSの設定と運用 (アスキー書籍)


<参考>
・【Linux CentOS 6.7 64bit】dnsmasqでドメイン名に応じて問い合わせ先を自動切替することなど【dnsmasq】
< http://akira-arets.blogspot.jp/2017/04/centos6-dnsmasq-settings.html > 2017年10月12日

・【Linux CentOS 7(1511)】nmcliコマンドを使って行うネットワークの設定と変更
< http://akira-arets.blogspot.jp/2016/12/linux-centos7-nmcli-basicsettings.html > 2017年10月12日

・[Dnsmasq-discuss] Caching with custom upstream domain
< https://www.mail-archive.com/dnsmasq-discuss@lists.thekelleys.org.uk/msg11568.html > 2017年10月12日

・[SOLVED] Override TTL Setting External DNS Records
< https://tutel.me/c/unix/questions/330652/register.html > 2017年10月12日

・zesty (8) dnsmasq.8.gz
< http://manpages.ubuntu.com/manpages/zesty/man8/dnsmasq.8.html > 2017年10月12日

・Caching Nameserver using dnsmasq
< https://www.g-loaded.eu/2010/09/18/caching-nameserver-using-dnsmasq/ > 2017年10月12日

・DNSMASQ
< http://www.thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html > 2017年10月12日

・How to measure DNS cache efficiency / cached items?
< https://unix.stackexchange.com/questions/162973/how-to-measure-dns-cache-efficiency-cached-items > 2017年10月12日

投げ銭

★投げ銭をしてくださるなら、下記のPayPal専用リンクからできます。m(_ _)m ★