BINDのViewを使って複数のネットワークごとに見せる情報を変える

Linux

 

社内に複数のLANがあり、LANごとにDNSのクエリ結果を変えたい場合に有用なのがBINDのView機能です。

 

接続条件によってDNSクエリ結果を変化させたい

一言で言ってしまえば「接続条件によってDNSのクエリ結果を変える機能」です。

同じゾーン情報でも、アクセス元によっては異なる結果を返したい場合などに使えます。例えば、以下のような状況。

Viewが有効な状況
  • 社内にWebサーバがあり、複数のLANに足を出している。
  • 各LANのクライアントには、自身が所属するLANのWebサーバのIPを返したい。
  • DNSは1台で済ませたい

などです。社内のセキュアなLAN、リモートアクセスLANなどで分かれている場合などが現実的な状況でしょうか。もっとも悩まなくて済む解決策はDNSサーバを複数台立てることですが、LANの数に合わせてDNSを都度立ち上げるのはスマートではありませんし、LANを一つにまとめてしまったり、不要なルーティングを追加するのはセキュリティ上好ましくありません。

そこで使うのがBINDのView機能です。

 

BINDのView機能

View機能はBindのver8から使用できるようになったので、CentOS7であれば(ver9)であれば問題なく使用できます。

今回はアクセス元のIPによってクエリ内容を変えるという前提ですが、Viewの本来の機能は特定の接続条件によってクエリ内容を変えるというものです。なので、接続元のIPに限らず、様々な条件を付けることもできます。もちろん、ALLOW/DENYを変えることも可能です。

ここでは、ygg-tech.comの名前解決クエリに対し、

  • Secure LANに所属するクライアントには、192.168.0.1を返す。
  • Remote Access LANに所属するクライアントには、172.24.0.1を返す。

というフローを実現させます。

 

named.confの設定

実際の設定は以下のようになります。まずはメインとなる/etc/named.conf(の抜粋)

 

options {
  allow-query { 172.24.0.0/24;
                192.168.0.0/24; };
  forwarders  { 8.8.8.8; };
  recursion yes;
};

optionsステートメントでは、クエリを受けるのも各セグメントからのみ、保持しているゾーン情報以外のクエリは外部DNSへフォーワードする設定。

acl "RemoteAccessLAN" {
  172.24.0.0/24;
};

acl "SecureLAN" {
  192.168.0.0/24;
};

aclステートメントにて、アクセス元のネットワークの定義を行います。

view "ViewRemoteAccessLAN" {
  match-clients { RemoteAccessLAN; }; ※定義したACL名
  recursion yes;

  zone "." IN {
    type hint;
    file "named.ca";
  };

  zone "ygg-tech.com" IN {
    type master;
    file "ygg-tech.com_RemoteAccess";
    allow-update { none; };
    allow-transfer { none; };
};

view "ViewSecureLAN" {
  match-clients { SecureLAN; }; ※定義したACL名
  recursion yes;

  zone "." IN {
    type hint;
    file "named.ca";
  };

  zone "ygg-tech.com" IN {
    type master;
    file "ygg-tech.com_Secure";
    allow-update { none; };
    allow-transfer { none; };
};

viewステートメントを使って、match-clientsに指定したACLリストに合致したアクセス元に対するゾーン定義を指定します。

ゾーン情報

最後にゾーンファイルです。Viewで定義したそれぞれのゾーンファイルを用意します。

/var/named/ygg-tech.com_RemoteAccess

$TTL 2
@               IN SOA          dns.ygg-tech.com root.ygg-tech.com (
                                20200901        ; serial
                                3h              ; refresh
                                1h              ; retry
                                1w              ; expiry
                                1d )            ; minimum
                IN NS           dns.ygg-tech.com.
@               IN A 172.24.0.1
*               IN A 172.24.0.1

/var/named/ygg-tech.com_Secure

$TTL 2
@               IN SOA          dns.ygg-tech.com root.ygg-tech.com (
                                20200901        ; serial
                                3h              ; refresh
                                1h              ; retry
                                1w              ; expiry
                                1d )            ; minimum
                IN NS           dns.ygg-tech.com.
@               IN A 192.168.0.1
*               IN A 192.168.0.1

あとは、各ネットワークに所属するクライアントから、digやnslookupにて期待通りの応答があることを確認してください。