DNS サーバーに逆引きゾーンを設定する (CentOS 5.5): Linux の使い方


逆引き DNS の必要性

ドメイン名と IP アドレスとを関連付ける DNS サーバーでは、ドメイン名から IP アドレスを検索する "正引き" の他に、IP アドレスからドメイン名を検索する "逆引き" というものがあります。

一般的にはドメイン名を使って IP アドレスを探す場合が多いと思うので、逆引きについて意識する場面はあまりないかもしれないですが、インターネットの仕組みの中ではけっこう利用されていて、これがないとサーバーの運用に支障が出てきてしまうほどです。

 

例えば、逆引きができないメールサーバーから発信されたメールを、迷惑メールと判断して受け取ってくれないサーバーが存在します。そのため、逆引き設定が行われないと、そのサーバー経由で送信したメールが相手に届かないという問題が発生する可能性が出てきます。

ところで、逆引きを迷惑メールの判断材料に使用する主旨としては、逆引きが設定されたメールサーバーは、つまりちゃんとドメインが取得されているため、身元が信頼できるだろうという判断ができるという話を聞いたことがあります。

でも、メールのドメインと逆引きのドメインとがぜんぜん違うこともありますし、ドメイン自体が簡単に入手できることもあり、個人的にはそのような判断は意味をなさないような気がします。そもそも、ドメインよりも IP アドレスを取得する方が難しいですし、もし逆引きの設定ができないとすれば、それはドメインや身元の問題ではなく別の要因のように思います。

 

実際、自分自身も、ハウジングサービスで逆引き DNS の設定が提供されなかったがために、正当なメールサーバーの運用が出来なかったことがありました。

結局、仮想サーバーを外部に借りてメールのリレーサーバーを構築して何とか回避しましたが、どちらかと言えば本来は、ハウジングサービスよりも仮想サーバーを用いたメールサーバーの方が身元の信頼性は低いように感じるのでした。

 

これについては関わったハウジングサービスの例外的な質の悪さもあるとは思うのですが、そのような経験とそもそもの意義を考えると、送信元の逆引きができないことを不正なメールの判断材料とすることに意味はないと思います。

それどころかむしろ、正しいメールが相手に正しく届かない、害にさえつながることのように感じます。

これに対する反論として 「迷惑メールが減ったことが効果のある証拠」 という話も耳にしますが、正常なメールも含めた絶対量が減ったのですから、迷惑メールが減るのは当然です。懸念すべきは、正当なメールをサーバー管理側で排除しているというところです。

今の迷惑メールの量では難しことは否めませんが、やはりそれが迷惑メールかどうかというのは、可能なかぎり最終的には受け取り手が判断できるようにするのが正しい姿であると思っています。

他にも、ネットワークに逆引きが設定されていないがために、PING や SSH といったコマンドの待ち時間が極端に遅くなる場合があります。

例えば PING で、IP アドレスを指定して ping を実行した場合にはすぐに "Reply from ..." といった結果が返ってくるのに、同じホストへドメイン名を使用して ping を実行した場合には、十数秒ほど待たされた後にようやく応答がかえってくるという場合は、逆引きが設定されていないことが原因の場合があるようです。

これはどうやら、プログラムが裏で逆引きを試みるものの、その情報を取得する DNS を見つけられずにインターネットをしばらく彷徨うため、その待ち時間が表面化してしまっているようです。なお、SSH や SMTP、TRACEROUTE や Nagios の NRPE といったものも、この影響を受けるようでした。

逆引きの設定といっても、ホスト単位ではなくその IP アドレスの逆引きを担うゾーン (SOA) が見つかるかどうかが問題のようでしたので、それさえ用意されていれば、対象のホスト自体が逆引きできなくても問題はありません。

とくにプライベート IP アドレスを用いた LAN で、自分で用意したキャッシュサーバーを利用している場合には、逆引きを自分が運用する DNS サーバーに登録しておかないと、このような症状が発生してきてしまう場合があると思います。

 

逆引き DNS を設定する

今回は CentOS 5.5 の BIND 9.3.6 という環境で運用しているキャッシュサーバーに逆引きを設定してみようと思います。

LAN ネットワークは "192.168.0.0/24" であるとして、これに必要と思われる逆引きゾーンを設定して行く感じになります。キャッシュサーバーの構築については 内部ネットワークに名前解決のための DNS を提供する を参考にしてみてください。

 

逆引きの設定には "in-addr.arpa" という、逆引き専用のゾーンを使用します。

この後に続けて、IP アドレスのオクテット(ドットの区切り)事に順に階層を辿ったゾーンを定義することになります。

たとえば "192.168.0.0/24" であれば、そのネットワークに所属する IP アドレスは "192.168.0.*" といった感じになるので、逆引きは "0.168.192.in-addr.arpa" というゾーンを登録して、その中に PTR レコードを登録して行くという運びになります。

これは TCP/IP の約束事となっていますので、例えば "192.168.0.1" という IP アドレスを逆引きしようとした場合には、自動的に "1.0.168.192.in-addr.arpa" というクエリーを DNS で検索してくれます。

 

BIND で逆引きゾーンを登録する場合、通常のドメインとほとんど変わらず、まずは "/etc/named.conf" に次のようにゾーンを追加します。

zone "0.168.192.in-addr.arpa"

{

type master;

file "data/192.168.0.rev";

}

このようにしたら、"/var/named/data/192.168.0.rev" を作成して、例えば次のようなゾーンファイルを用意します。

$TTL 3600

 

@    IN SOA    ns1.domain.xxx.xx.jp. admin.domain.xxx.xx.jp. (

2010121501    ; serial

6m    ; refresh

3m    ; retry

4w    ; expiry

1d    ; minimum

)

 

    IN NS    ns1.domain.xxx.xx.jp.

    IN NS    ns2.domain.xxx.xx.jp.

 

1    IN PTR    host1.domain.xxx.xx.jp.

上記では例として "1" という PTR レコードを用意していますが、これはなくても構いません。

メールサーバーの運用を行う場合には、こういった具体的なホストに対するドメイン名の設定も必要ですが、PING 等の応答が極端に遅くなる問題については SOA レコードの設定までで大丈夫な様子です。

ちなみにこの "1" という PTR レコードを登録することにより、"1.0.168.192.in-addr.arpa" という逆引きが可能になります。

 

このほかにも、ローカルネットワークで利用される IP アドレスは幾つかありますので、それらについても同様に、逆引き用の SOA レコードを設定しておいた方が良いと思います。

127.0.0.1 0.0.127.in-addr.arpa
0.0.0.0 0.in-addr.arpa
255.255.255.255 255.in-addr.arpa

上記左側のような IP アドレスが使用されるケースはあると思いますので、これについても右側に記載したゾーンの SOA レコードを登録しておくと良いと思います。

"0.0.0.0" や "255.255.255.255" にはとくに PTR レコードは必要ないと思いますが、"127.0.0.1" については "localhost" という名前が付けられるのが一般的ですので、次のような内容の "0.0.127.in-addr.arpa" ゾーンファイルを用意すると良いと思います。

$TTL 3600

 

@    IN SOA    ns1.domain.xxx.xx.jp. admin.domain.xxx.xx.jp. (

2010121501    ; serial

6m    ; refresh

3m    ; retry

4w    ; expiry

1d    ; minimum

)

 

    IN NS    ns1.domain.xxx.xx.jp.

    IN NS    ns2.domain.xxx.xx.jp.

 

1    IN PTR    localhost.

このようにすることで、"127.0.0.1" の逆引きの結果は "localhost" になるようになります。

このとき PTR レコードの最後の "." をつけ忘れると、このゾーンに割り当てられたドメインが付与されて "localhost.0.0.127.in-addr.arpa" というドメインが逆引きで取得されてしまうので注意します。