いますぐ実践! Linuxシステム管理

いますぐ実践! Linux システム管理 / Vol.225 / 読者数:2186名

こんばんは、うすだです。

まとまった時間を確保できたため、部屋を少し整理しました。
すると、昔読んで、もう一度読みたいと思っていた本がいくつか見つかりました。

なにか悩みごとや改善したいことがあると、 この本を読めば今度こそ解決できる!と思い込んで、新しい本を買ったりしていました。

ですが、昔買って読んだ本や、古典と言われる本と、 書かれていることがそう変わらなかったりしますよね。
そう思って、しばらくは本を買わず、古い本をめりめりと読もうと思っています。

そして、いつも、読んだらそれでおしまいになっていたのですが、 自分がどう思ったのかを記録して、行動に反映までしていこうと思っています。

いままで、あまりにも考えずに生きてきたため、そう簡単にいかないかもしれません。 ですが、まずは、やりかたがどうであれ、 考えることを習慣にすることが先決だと思って、試行錯誤してみるつもりです。

いくつになっても自分のバージョンアップは必要ですよねということで、 今回もはりきってまいりましょう。

今回のお題 - dnsmasq でDNSのキャッシュサービスを気軽に動かす

普通(…ん? 普通ってなんなんでしょうかね)の組織であれば、 DNSサーバやDHCPサーバが稼働していて、 きちんとサービスが提供され管理もされていることかと思います。

ですが、こじんまりしたネットワークであったり、 それこそ自分のマシンだけだったりすると、 そのためにいちいちサーバを設定して立ち上げるのは面倒だったりします。

いまどきのブロードバンドルータなどがあれば、わりと半自動的に設定ができて、 サービスしてくれたりもします。
ただ、もう少し細かい設定が必要な場合は、 別途用意する必要が生じるのではないかと思います。

そこで今回は、「dnsmasq」なるものを使って、 DNSのキャッシュサーバを気軽に動かしてみたいと思います。

とりあえずいつものようにパッケージから

Debian系のディストリビューションをお使いの貴兄は、 dnsmasq-base というパッケージがすでに入っていると思います。
ですが、これには設定ファイルや起動スクリプトが含まれないため、 別途dnsmasq というパッケージを入れましょう。
RedHat系をお使いの貴兄は、すでに dnsmasq というパッケージがあると思いますが、 なかったら入れてください。

  # apt-get install dnsmasq      (Debian系の場合)
  # yum install dnsmasq          (RedHat系の場合)

dnsmasq の説明を簡単に

動かす前に、dnsmasq の機能について、簡単にご説明します。

まず、設定ファイルは /etc/dnsmasq.conf です。
あるいは、/etc/dnsmasq.d/ 以下に置いたファイルも読み込まれます。

そして、肝心の機能ですが、DNSのキャッシュサーバ、 DHCPサーバおよびTFTPサーバとして動作します。
これら3つの機能がありますが、必要なサーバだけを動作させられます。

DNSサーバとしては、次のように動作します。クライアントから問合せがあると、 まず /etc/hosts を確認し、情報があればそれを返します。
なければ、ホンモノのDNSサーバへ問い合わせて、その結果を返します。

DHCPサーバとしては、次のように動作します。指定した範囲のIPアドレスを、 指定した期間リースすることができます。アドレスの範囲は複数指定できます。また、 特定のマシンに固定のアドレスをリースすることも可能です。 オプションも複数設定できます。ただし、みんな同じ設定になってしまうようです。

TFTPサーバとしては、他のTFTPサーバと同様、 特定のディレクトリ以下に対してアクセスできるように動作させることが可能です。

DNSキャッシュサーバとして動かす

それでは、ようやく動かしてみたいと思います。

…ですが、その前に、NetworkManager をお使いの貴兄は、 確認することがあります。
/etc/NetworkManager/NetworkManager.conf に以下の設定がある場合は、 これをコメントアウトする必要があります。

  dns=dnsmasq

この設定があると、NetworkManagerによって設定される度に、 dnsmasq がこちらの意図しない設定で起動されてしまいます。そのため、 dnsmasq を動かそうとするとかち合ってしまいます。
dnsmasqをサーバとして動かしたい場合は、 上記の先頭に「#」を付加してコメントアウトしてください。

上記をコメントアウトしたら、NetworkManager を再起動してください。

  # service network-manager restart   (Debian系の場合)
  # service NetworkManager restart    (RedHat系の場合)

 

そして、アプリなどが dnsmasq に問合せるよう、 /etc/resolv.conf には下記を追加してください。
ただ、ホンモノのDNSサーバの情報も必要なため、 既存の nameserver の設定は残しておいてください。

  nameserver 127.0.0.1

NetworkManagerをお使いの場合は、DNSサーバーに 127.0.0.1 を追加してください。 たとえば、現在のDNSサーバーが 192.168.1.1 の場合、以下のように設定します。

  127.0.0.1, 192.168.1.1

ただ、Ubuntuなどのように、 dnsmasqが参照する resolv.conf を別で用意する設定になっている場合は、 元のDNSサーバだけでよいため上記を行う必要はありません。
たとえば、Ubuntu で dnsmasq がどう動いているか、以下のように確認をしてみます。 (もちろん、dnsmasq を起動してから実施しています。)

  $ ps -ef | grep dnsmasq
  ...中略...
  dnsmasq  27730   1  0 Aug04 ?      00:00:00 /usr/sbin/dnsmasq \
  -r /var/run/dnsmasq/resolv.conf ...後略...
  $ cat /var/run/dnsmasq/resolv.conf
  nameserver 192.168.1.1

上記の場合、 /var/run/dnsmasq/resolv.conf に元のDNSサーバが自動的に設定され (「resolvconf」さんがそうするみたいです)、 dnsmasq はそれを見てホンモノのDNSサーバを知ります。そのため、 /etc/resolv.conf には「nameserver 127.0.0.1」だけあれば充分です。

 

…ややっこしい準備ができましたら、いよいよ動かします。
キャッシュサーバとして動かすだけなら、 /etc/dnsmasq.conf は初期状態のまんまで問題ありません。下記のように起動します。

  # service dnsmasq start

恒久的にサービスとして動かしたい場合は、いつものように設定します。

  # update-rc.d dnsmasq defaults   (Debian系の場合)
  # chkconfig dnsmasq on           (RedHat系の場合)

そして、自分自身(localhost)に対して、適当に問合せてみましょう。

  $ host www.gogle.com localhost
  ...中略...
  www.gogle.com is an alias for www-cctld.l.google.com.
  www-cctld.l.google.com has address 74.125.235.183
  www-cctld.l.google.com has address 74.125.235.191
  www-cctld.l.google.com has address 74.125.235.184
  www-cctld.l.google.com has IPv6 address 2404:6800:4004:805::101f

一般的なFQDNだけでなく、 /etc/hosts に書いてある変なホストも解決ができるかどうか、試してみてください。

  $ host okashii localhost
  ...中略...
  okashii.usupi.org has address 115.146.17.161

上記の okashii は、/etc/hosts にのみ登録されていますが、 引けていることがわかります。
ちなみに、わたしの環境では、IPv6 も引けました。

  $ host -t aaaa ip6-localnet localhost
  ...中略...
  ip6-localnet has IPv6 address fe00::

もし、他のマシンから dnsmasq を利用したい場合は、ポート「53/udp」が通るよう、 dnsmasqを起動している側も参照したい側も設定する必要があります。

おわりに

以上、dnsmasq を DNSキャッシュサーバとして動かす設定手順を、 さらりとご説明しました。

NetworkManager や resolvconf などとの絡みもあり、ややこしいのですが、 コマンドやアプリケーションが dnsmasq を利用するためにどういう設定が必要で、 dnsmasq 自身がDNSサーバへ問合せるためにどういう設定が必要なのか考えれば、 そのうちわかってくると思います。
(わたしは、UbuntuやFedoraを眺めながら、数日悩みました。)

で、今回はDNSしかご紹介できませんでしたので、 DHCPとTFTPについては次回にまとめてご紹介したいと思っております。

宿題の答え

前回の宿題は、

  テキストファイルならdiff、バイナリファイルならcmpで比較するもの
  を作ってみましょう。

でした。

diff コマンドは、ありがたいことに、対象のファイルがバイナリだと、 バイナリだよ、と以下のように判断してくださいます。
終了コードも 0 ではない値を返してくださいます。

  $ diff /bin/ls /bin/cat
  バイナリーファイル /bin/ls と/bin/cat は異なります
  $ echo $?
  2

これを利用して、バイナリの場合は cmp コマンドに比較させる、 というスクリプトを書いてみました。

#!/bin/sh
# 各種メッセージを英語にしていただく
LANG=C; export LANG

# diffとcmpのオプション
DIFFOPTS=${DIFFOPTS:--up}
CMPOPTS=${CMPOPTS:--l}
# 一時ファイル(前回と同様です)
TMPFILE=`mktemp /tmp/diff-cmp-XXXXXX`
trap "rm -f $TMPFILE" `seq 0 15`

# 引数チェック
if [ $# -ne 2 ]; then
    echo "Usage: $0 file1 file2"
    exit 1
fi

# diffで比較
diff $DIFFOPTS $1 $2 > $TMPFILE
ret=$?
if [ $ret -ne 0 ]; then
    case "`cat $TMPFILE`" in
    Binary*differ)
        # cmpで比較し直し
        cmp $CMPOPTS $1 $2
        ret=$?
        ;;
    *)
        # 単に一致しなかっただけなので結果を出力
        cat $TMPFILE
        ;;
    esac
else
    # 終了コード0の場合出力がないはずだけど、念のため
    cat $TMPFILE
fi
exit $ret

diffコマンドの出力結果を一時ファイル(/tmp/diff-cmp-なんとか)に保存しておき、 バイナリだ的なメッセージならcmpコマンドに比較させ直す、 というだけのスクリプトです。
(詳細な説明は、上記のてきとーなコメントでご容赦ください。)

これを、たとえば diff-cmp.sh というファイル名で保存したら、 いつものように実行権をつけて実行します。

  $ chmod +x diff-cmp.sh
  $ ./diff-cmp.sh /bin/ls /bin/cat
     25  64 234
     26 276 236
     33 334 114
  ...後略...

diffコマンドのオプションは「-up」、cmpコマンドのオプションは「-l」を使用します。 気に入らない場合は、それぞれDIFFOPTS、CMPOPTSで実行時に指定してください。
(オプションなしの場合は、下記のようにスペースを指定してください。)

  $ DIFFOPTS=" " ./diff-cmp.sh /etc/passwd- /etc/passwd
  57a58
  > usu:x:101:100:USUDA Hisashi,,,:/home/usu:/bin/sh
  64d64
  < usu:x:101:100:USUDA Hisashi,,,:/home/usu:/bin/csh

 

さて、実行結果が一番短いもの、となると、ずいぶんややこしくなりますが、 やや冗長なスクリプトを書いてみました。

#!/bin/sh
# 各種メッセージを英語にしていただく
LANG=C; export LANG

# 実行する候補数は4つ
NR=4
# 一時ファイルも4つ作成
TMPFILES=""
for n in `seq 1 $NR`; do
    eval "TMPFILE${n}=`mktemp /tmp/diff-cmp-${n}-XXXXXX`"
    TMPFILES="$TMPFILES `eval \"echo \\$TMPFILE${n}\"`"
done
# 終了時に4つとも消します
trap "rm -f $TMPFILES" `seq 0 15`

# 引数チェック
if [ $# -ne 2 ]; then
    echo "Usage: $0 file1 file2"
    exit 1
fi

# 4つ実行して、出力を一時ファイルに、終了コードも記録
n=1
for cmd in "diff" "diff -up" "diff -cp" "cmp -l"; do
    tmpfile="`eval \"echo \\$TMPFILE${n}\"`"
    $cmd $1 $2 > $tmpfile 2>&1
    eval "ret${n}=$?"
    n=`expr $n + 1`
done

# 出力が一番短い結果を選択
minfile=""
minlen=0
minret=0
for n in `seq 1 $NR`; do
    tmpfile="`eval \"echo \\$TMPFILE${n}\"`"
    case "`cat $tmpfile`" in
    Binary*differ)
        # バイナリだよという場合は対象外
        ;;
    *)
        len=`du -b $tmpfile | awk '{print $1}'`
        if [ "z${minfile}" = "z" -o $minlen -gt $len ]; then
            minfile=$tmpfile
            minlen=$len
            minret="`eval \"echo \\$ret${n}\"`"
        fi
        ;;
    esac
done
# 一番短い結果を出力
cat $minfile
exit $minret

説明は…ご容赦ください。
(どうしてもわからないという貴兄は、メールでご質問ください。
特に、バグや改善などのご指摘は、大歓迎いたします。)

そして、終了コードのチェックをすっぽかしているのは、ご愛嬌です。
(終了コードが 0 で「Binary files 云々」とはならないはずなので…。)

苦労した割には、結局オプションなしのdiffかcmpしか実行されない、 という結果しか得られませんでしたが…。OTZ

今回の宿題

今回の宿題は、

  resolv.conf に複数の nameserver を指定した場合、順番に問合せるの
  か、並行して問い合わせるのか、確認してみましょう。

です。

…えーと、ここ数ヶ月気になっていることを、宿題にしてみました。
大昔になにかのライブラリのソースを見たときは、 並行だったように記憶しているのですが、嘘かもしれませんし、 変わっているかもしれません。

基本的にソースは見ないで、動作を確認することで判断してみようと思い …じゃなくて、判断してみてください。(^ε^;

あとがき

唐突ですが、8月から、組み込みが主体の会社に転職いたしました。

1年半前に、このままじゃいかんと思って、 Linuxのシステム構築や管理を行う会社へ転職しました。
ですが、自分がいま持っている利点や性格と、 その会社のビジョンや仕事の進め方などを照らし合わせてみたところ、 とっても合っていないのではないかということに、今更ながら気がつきました。

で、残された時間やタイミングを考えたら今しかないと思い、 えいやーで話を進めました。
…とはいえ、えいやーすぎたため、残念ながら「円満退社」とはいかず、 最後の挨拶もできないままフェードアウトせざるを得ませんでした。

そのため、心残りや反省すべき点がてんこ盛りのまま、現在に至ります。
ただ、そのままずるずると悩んだままにせず、 自分で決断をして進めたということは、少なくとも評価したいと思っています。

また、今回転職するにあたり、かつて在籍していた会社の人や友人から、 いろいろアドバイス等いただくことができました。
(そのため、珍しいことに、7月は飲みにいく機会が多数ありました。)

当然、否定的なご意見もやんわりといただきましたが、それも踏まえた上で、 今回決心した次第です。
なにはともあれ、いろんな方が思ってくださっていることがわかり、 大変感謝感激な1ヶ月を過ごすことができました。

それはそれとして、定年までの17年をどう過ごすのか、 真ん中の幹となる目標を明確にする必要があると思っています。
ですので、新しい会社のビジョンや仕事の内容を確認した上で、 8月中に目標を立ててしまおうと目論んでいます。
(当然、定年後のことも考えた上で、目標を立てます。)

この際、いきあたりばったりでもいいのでは? という心の声も聞こえたりしているのですが、家族がいる以上、 そういうわけにもいかないだろうと思い、 その声は(いまのところは)聞かないことにしています。

そんな感じで、7〜8月はバタバタしていますが、当メルマガは、 いままで通り特に変わらずゆるゆるとやっていきますので、 安心して(?)購読していただけますと、たいへん幸いです。

 

今回も、ここまで読んでいただき、たいへんありがとうございました。
次回は、8月19日(日) の未明にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- 小布施で紹介していただいたりしました。うれしい!
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)
http://twitter.com/kuriking/ (栗つぶやき)
http://facebook.com/kuriking3 (栗顔本)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本