内部ネットワークのBINDの一部のDNSエントリを上書きする


39

BINDを実行し、単一のゲートウェイを介してインターネットに接続されたDNSサーバーを備えた内部ネットワークがあります。私のドメイン「example.com」は、外部DNSプロバイダーによって管理されています。そのドメイン内のエントリの一部、たとえば「host1.example.com」と「host2.example.com」、および最上位エントリ「example.com」は、ゲートウェイのパブリックIPアドレスを指します。

内部ネットワーク上にあるホストに、「host1.example.com」、「host2.example.com」、「example.com」をゲートウェイではなく内部IPアドレスに解決してもらいたい。「otherhost.example.com」などの他のホストは、引き続き外部DNSプロバイダーによって解決される必要があります。

「host1.example.com」と「host2.example.com」のBINDに2つの単一エントリゾーンを定義することにより、host1およびhost2エントリに対してこれを行うことに成功しました。ただし、「example.com」のゾーンを追加すると、そのドメインのすべてのクエリはローカルDNSサーバーによって解決され、「otherhost.example.com」のクエリはエラーになります。

ドメインの一部のエントリのみをオーバーライドし、残りを再帰的に解決するようにBINDを構成することは可能ですか?



1
「ドメインの一部のエントリのみを上書きするようにBINDを構成できますか?」いいえ、BINDではありません。サブドメインを使用します。
ボルツマイヤー2009年

1
アンバウンドは、私が求めていたとおりのことをしているようですので、Alnitakの回答を受け入れられた回答として設定しています。しかし、最終的に、私はbortzmeyerのアドバイスに従い、ドメインエントリをオーバーライドしません。すべての返信をありがとう!
レミーブランク

1
バインドは、応答ポリシーゾーンでこれを実行できるようになりました。以下の私の答えをご覧ください。Unboundなどの他のソリューションは、CNAMEをオーバーライドできません。Bindのポリシーゾーンでは、サブドメインを実行する必要はありません。個々のレコードを自由にオーバーライドできます。
フローリンアンドレイ

回答:


18

最良の方法は、バインド9.8.1以降の応答ポリシーゾーンを使用することです。任意のゾーンの単一のレコードをオーバーライドできます(そして、そのためにサブドメイン全体を作成する必要はありません、変更したい単一のレコードのみ)、CNAMEなどをオーバーライドできます。Unboundなどの他のソリューションはCNAMEをオーバーライドできません。

https://www.redpill-linpro.com/sysadvent/2015/12/08/dns-rpz.html


編集:その後、これを適切に行いましょう。上記のリンクされたチュートリアルに基づいて、私が行ったことを文書化します。

私のOSはRaspberry Pi用のRaspbian 4.4ですが、この技術はDebianとUbuntuに変更を加えることなく、または他のプラットフォームに最小限の変更を加えて機能するはずです。

バインド構成ファイルがシステム上で保持されている場所に移動します/etc/bind。ここにあります。db.rpz次の内容で呼び出されるファイルをそこに作成します。

$TTL 60
@            IN    SOA  localhost. root.localhost.  (
                          2015112501   ; serial
                          1h           ; refresh
                          30m          ; retry
                          1w           ; expiry
                          30m)         ; minimum
                   IN     NS    localhost.

localhost       A   127.0.0.1

www.some-website.com    A        127.0.0.1

www.other-website.com   CNAME    fake-hostname.com.

それは何をするためのものか?

  • www.some-website.com偽のアドレス127.0.0.1でIPアドレスを上書きし、そのサイトのすべてのトラフィックをループバックアドレスに効率的に送信します
  • というwww.other-website.com別のサイトにトラフィックを送信しますfake-hostname.com

ここで使用できるバインドゾーンファイルに入れられるものはすべて。

これらの変更を有効にするには、さらにいくつかの手順があります。

named.conf.localこのセクションを編集して追加します。

zone "rpz" {
  type master;
  file "/etc/bind/db.rpz";
};

上記のリンク先のチュートリアルでは、さらに多くのものを追加するように指示されていますzone "rpz" { }が、単純なセットアップでは必要ありません。ここで示したのは、ローカルリゾルバで動作するための最小値です。

編集named.conf.optionsし、options { }セクションのどこかにresponse-policyオプションを追加します。

options {
  // bunch
  // of
  // stuff
  // please
  // ignore

  response-policy { zone "rpz"; };
}

次に、バインドを再起動します。

service bind9 restart

それでおしまい。ネームサーバーはこれらのレコードのオーバーライドをすぐに開始する必要があります。

変更が必要な場合は、単に編集してdb.rpzから、バインドを再起動してください。

ボーナス:DNSクエリをsyslogに記録する場合は、手順を監視し、編集named.conf.localloggingて、これらのステートメントを含むセクションがあることを確認します。

logging {
    // stuff
    // already
    // there

    channel my_syslog {
        syslog daemon;
        severity info;
    };
    category queries { my_syslog; };
};

バインドを再度再起動すると、それだけです。

Bindを実行しているマシンでテストします。

dig @127.0.0.1 www.other-website.com. any

別のマシンでdigを実行する場合は、@ 127.0.0.1ではなく@ the-ip-address-of-Bind-serverを使用してください。

この手法を使用して、作業中のウェブサイトのCNAMEをオーバーライドし、テスト中の新しいAWSロードバランサーに送信しました。Raspberry Piを使用してBindを実行し、RPiもWiFiルーターとして機能するように構成されました。したがって、RPiで実行されているSSIDにデバイスを接続すると、テストに必要なDNSオーバーライドを取得できます。


1
BIND RPZは実際には(まだ)QTYPEごとに単一のレコードをオーバーライドできないことに注意してください- 特定の所有者名のすべてのレコードをオーバーライドします。つまり、MXレコードなどではなく、ドメインのAレコードを上書きしたい場合は、できません。MXレコードもRPZゾーンに配置し、実際のゾーンとの同期を維持する必要があります。
-Alnitak

2
あなたがしたようにこれを壊してくれてありがとう。非常に役立ちます。
-sruffell

注意点はありますか?私はpfsenseでこれを行おうとしていますが、結果を「偽造」することはできません。実際のアドレスが報告されます。私は手紙の指示に従ったと信じています。
レンネ

@Lenne動作するはずです。投稿を編集し、変更をテストするための提案を追加しました。
フローリンアンドレイ

@LenneのpfSense BINDパッケージには、これがGUIに約1年間組み込まれているため、設定をいじる必要はありません。OP:NXDOMAINで返信するか、単に応答をドロップするなど、RPZで実行できる他のいくつかのことに言及する価値があります。
miken32

21

未結合の再帰的なDNSサーバは、個々のリソースレコードを上書きする能力を持っています。

見てくださいlocal-zonelocal-dataで構成の設定マニュアル、例えば:

local-zone: "example.com." transparent
local-data: "foo.example.com. IN A 192.168.1.1"

transparent設定は、local-zoneが指定されていない名前に対して通常の再帰的な検索を行うように指示しlocal-dataます。


1
まさに私がやりたいことのようです、ありがとう。今夜はUnboundを読み上げます。
レミーブランク

一方、それの知恵は非常に疑わしいです。internal.example.comドメインを持つことはより明確です。
ボルツマイヤー09年

@Bortzmeyer-あなたは正しいかもしれませんが、私はWouterがただの楽しみのためにそれを入れたとは思いません;-)
Alnitak

3
@bortzmeyer、時には選択肢がありません。例:SBS 2008には単一のLAN IPが必要ですが、ルーターが転送する外部IPを使用して外部から到達する必要があります。Microsoftは、SBSで2つのネットワークカードを使用することも、同じカードで2つのIPを構成することも許可しません。ローカルサーバーがDNS名を外部IPに解決する場合、ルーターはLAN IPに対してDNATとSNATの両方を行う必要があり、SBSのログにはすべてのアクセスがルーターのIPからのものであることが示されますが、これは間違っています。私はunbound自分のルーターにインストールします、ソリューションははるかに優れていると思います。
コスミンプルンド

質問はBINDに固有であるため、これは質問に答えません。
-bzeaman

4

「dnsmasq」を調べると、解像度を微調整してかなり巧妙なことができます。


ありがとう、良いヒント。dnsmasqは再帰的な解決を行わないので、そのためには別のポートでBINDを実行する必要があります(ISPのDNSサーバーは不安定です)。
レミーブランク

4

あなたが探しているのは、Webopediaによって次のように定義されているスプリットDNSです。

スプリットDNSインフラストラクチャでは、同じドメインに対して2つのゾーンを作成します。1つは内部ネットワークで使用され、もう1つは外部ネットワークで使用されます。スプリットDNSは、名前解決のために内部ホストを内部ドメインネームサーバーに誘導し、外部ホストは名前解決のために外部ドメインネームサーバーに誘導されます。

基本的に、外部ゾーンファイルのコピーを作成し、それを内部DNSサーバーで支えてから、内部ネットワークに特に必要なレコードを変更または追加する必要があります。これはかなり一般的な設定ですが、2つのDNSサーバー間で「外部」レコードの同期を維持するのは面倒です。パブリックサーバーでレコードを作成または変更する場合は、プライベートサーバーでもレコードを作成または変更する必要があります。

これは、使用するDNSサーバーの実装に関係なく実装できます。ほとんどのセットアップでは、外部ネットワークにサービスを提供するDNSサーバーと、内部ネットワークにサービスを提供する別のDNSサーバーがあります。BINDでは、おそらく他の実装として、named.confファイルのゾーンセクション内で「allow-query」ステートメントを使用することにより、同じサーバー上に両方のバージョンのゾーンを配置できます。

BINDのもう1つの可能性(これを試したことはありません)は、内部で使用するレコードのみを使用して、内部DNSサーバーにexample.comドメインを設定することです。次に、「first」引数を使用して「forwarder」ステートメントを設定します(「forwarders」と組み合わせて)。理論的には、これは外部DNSサーバー(「フォワーダー」で設定されているように、内部レコードを持たず、失敗応答を返す)を要求します。その後、内部サーバーは応答を探します。それがうまくいくかどうかは確かですが、それは考えです。


2つのゾーンファイルの同期を維持することは、外部DNSファイルが動的DNSクライアントを介して更新されるため、複雑になります。ただし、forwardステートメントを読み上げます。ヒントをありがとう。
レミーブランク

いいえ、BIND転送は機能しません。未知のドメインに対してのみ行われますが、内部ネームサーバーはexample.comを認識し、権威があります。
ボルツマイヤー2009年

1
ドキュメントを正しく読んでいる場合、ゾーンセクション内の「forward first」ステートメントは、BINDに権限のあるローカルドメインに対しても外出してフォワーダーで回答を探すように指示し、それが可能な場合にのみローカル情報を使用する必要があります。フォワーダーから回答を得ます。
ジャスティンスコット

グローバルな「最初に転送」を指定すると、「ドキュメントからフォワーダーにクエリを送信し、応答しない場合はクエリに応答しようとします」が、応答を受信した場合、それ自体を解決しようとしません。応答が信頼できない場合やNXDOMAINである場合でも強制的に解決できればよいのですが、フォワーダーから応答を受け取った場合、bindは試行しません。
パブロ・マルチネス

3

BINDでは、目的のホスト名を使用してゾーンを定義することにより、この結果に到達します。少数のホストのみをオーバーライドする場合、このアプローチは適切です。

私のゾーン宣言は次のようになります。

zone "override.example.com" {
        type master;
        notify no;
        file "zone-config/override.example.com";
};

私のゾーン定義は次のようになります。

$TTL 4H
@       IN      SOA     ns.override.example.com.    root.override.example.com. (
                        2009072215      ; Serial
                        3600            ; Refresh
                        600             ; Retry
                        604800          ; Expire
                        3600    )       ; Minimum
;
                NS      ns
        IN      NS      ns.override.example.com.
        IN      A       192.168.1.100
ns      IN      A       192.168.1.100

したがって、イントラネットDNSとISP DNSでexample.comを照会すると、同じIPが取得されますが、override.example.comを照会すると、イントラネットDNS(プライマリ)にアクセスできる場合に異なる結果が得られます。


2

あなたはすでに正しい軌道に乗っています。

内部DNSサーバーでは、「example.com」のすぐ下にあるすべての例外ホストに対してゾーンを定義する必要があります。これらの例外を最小限に抑えるために、すべての内部マシンに「hosta.internal.example.com」という名前を付けるのが一般的です。DNSサーバーはほとんどのクエリを外部DNSサーバーに送信しますが、ゾーン「internal.example.com」に対して権限があります。(一度小さな操作をすり抜けると、通常はクライアントが向けられるDNSサーバーがいくつかあり、それらがサーバーである「internal.example.com」向けの別の権威あるDNSがあります。)

通常、説明する例外が作成されるのは、ホストが外部および内部の両方で到達可能でなければならない場合のみです。それでも、外部からは「host1.example.com」を使用し、内部からは「host1.internal.example.com」を使用できます。内部ホストは、「internal.example.com」内の名前を検索するように構成されます。サーバーの証明書がサーバーを「host1.example.com」として識別している場合など、すでに実行していることが適切な場合があります。その場合は、クライアントを接続する名前にする必要があります。


はい、「host1.example.com」ホストについては、すでにうまく機能しています。トリッキーな部分は同じよう...に「example.com」をトップレベルを処理している
レミーブランク

2

dnsmasqを使用すると、本当に簡単になります。http://www.thekelleys.org.uk/dnsmasq/doc.html DNSサーバーとして機能しますが、ローカルDNSサーバーから回答を取得します。良い点は、ゾーンファイルをいじらずに単一のドメインレコードを上書きできることです。


2

実際のところ、これを行う方法は、おそらくわずかに異なっていても、別の方法があります。同じ状況があり、外部および内部で使用されるドメインがあり、外部の静的および動的ホストがあります。本当に痛いのは、外部の動的なものだけです。このソリューションはおそらく最もエレガントではありませんが、小さなスクリプトで実装できます。ほとんどの場合、動的DNSプロバイダーのAPIを使用して独自の動的DNSスクリプトを実行しています。5分ごとにこのスクリプトをcronで実行しています。

1)外部IPを取得します。変わった?出口なし。

2)IPを変更し、dyndns-providerのAPIを新しいIPアドレスで呼び出し、

3)db.mydomain.comを外部IPでsed

4)バインドを再起動します。

ホームネットワークで非常に確実に動作します


私と同じプロセス。詳細については、Wiki Stealth Name Serverを参照してください。しかしdyn.dev.shahed.biz、World Wide から解決できません!この問題の解決にご協力ください。
Md Shahed Hossain
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.