web-dev-qa-db-ja.com

DNS:ローカルサーバーに権限のあるサーバーに結果を重ね合わせる方法は?

DNSを制御するドメインがあり、インターネットでホストされています。また、インターネットにアクセスできるNAT接続の内部ネットワーク(192.168.0.0/24)もあり、これも制御しています。この内部ネットワークには、DNSリゾルバーもあります。両方のDNSソフトウェアはPowerDNSです。

私ができるようにしたいのは、内部ネットワーク上のDNSリゾルバーが、権限のあるサーバーから送信されたクエリと結果のレコードを追加/変更できるようにすることです。たとえば、権限のあるサーバーには、animal.example.comの単一のレコードがある場合があります。

animal.example.com.    IN    AAAA    2001:140:283::1

ただし、内部クライアントがanimal.example.comのDNSルックアップを実行すると、次のように返されるようにしたいと思います。

animal.example.com.    IN    AAAA    2001:140:283::1
animal.example.com.    IN    A       192.168.0.2

明らかに、example.comのように権限のあるふりをするように内部DNSサーバーを設定することもできますが、メインDNSサーバーと内部DNSサーバーを同じレコードで同期させるには、かなりの労力が必要になります。両方。内部DNSサーバーを何らかの方法でメインDNSサーバーのスレーブにすることができても、独自の結果を追加するためのプロビジョニングがある場合は、それが理想的です。

これは可能ですか?

4
growse

実際、iを実行する必要がある場合は、postresolveのデータをマングルするリカーサーでLuaスクリプトを使用します。

ただし、実際には別の方法をお勧めします。権限のあるサーバーからexample.comをAXFRするinternal.example.comのような個別の権限のあるゾーンを使用し、ローカルのRFC1918データを追加するだけです。

このようにして、LANからインターネット上にあるように権限のあるゾーンをデバッグし、内部データを使用することができます。

PowerDNS Recursor Luaスクリプティングについて: http://doc.powerdns.com/recursor-scripting.html

2
ZaphodB

私が望むのはスプリットホライズンDNSセットアップですが、PowerDNSはそれを直接サポートしていません(BindやDJBDNSとは異なります)。著者からのそれに関する公式の回答はここにあります: http://mailman.powerdns.com/pipermail/pdns-users/2006-September/003779.html

特にファイルがファイルシステムに明確に配置されている場合、私自身、スプリットホライズンDNSが特に混乱することはありません。 ./master-interal/domain.com ./master-external/domain.com

彼らが提案している唯一のオプションは、異なるポートでリッスンしているサーバー上でPowerDNSの2つの異なるインスタンスを実行することです。次に、iptablesを利用して、関連するインスタンスにトラフィックをポート53にリダイレクトすると思います。

4
Twirrim

PowerDNSRecursorを介してDNSを分割する

Fedora 20をしばらくいじってみたところ、うまくいったようです。私はどこにも完全なハウツーを見つけていないので、最小限のセットアップのための短い記事:

Explanation

webserver.dyndns.orgを解決して、インターネットとLANの両方からWebサービスにアクセスしたいと考えています。

インターネットから

インターネット上のマシンaは、webserver.dyndns.orgをIPアドレスIPispに解決します。 BehingIPispは、NATを備えたルーターであり、ポート80をLAN IPIPxにポート転送し、Webサービスをインターネット。

これは当然、ドメインdyndns.orgの権限のあるネームサーバーにIPアドレスIPispを登録することによって行われます。 DynDnsのようなサービスは、ルーターまたはLANのどこかで実行されているddclientを使用して実行されるため、ここではこれ以上関心がありません。

LANから

LAN上のマシンbwebserver.dyndns.orgをIPアドレスIPxに解決し、WebサービスがLANを直接。さらに、LAN上のすべてのマシンがbar.localdomainの行に沿って名前が付けられていると仮定すると、名前webserver.localdomainIPxに解決されるはずです。 。また、適切な測定のために逆ルックアップを行い、IPxをLAN内のwebserver.dyndns.org(インターネット上ではIPxに解決します。 )もちろん何にも解決されず、IPispはISPによって生成された任意の文字列に解決されます。)

pdns-recursorがIPIPdnsを備えた別のマシンで実行されていると想定しますが、Webサーバーで実行することもできます( IPxまたはエイリアスと同じIPアドレス上にあるか、LAN上に1台のマシンしかない。

マシン「b」は、DHCPを介して静的または動的に構成できます。 dhclientdnsmasq、場合によってはavahiを参照してください。 NetworkManagerもここに入力されます。これは、/etc/resolv.confを書き換える可能性があるためです。今のところ、静的構成を想定しています。

また、次のことを想定します。

IPx = 192.168.1.1
IPdns = 192.168.1.2
IPbar = 192.168.1.3

次に:

/etc/resolv.conf任意のマシン:

nameserver 192.168.1.2
domain localdomain

pdns-recursorの構成:

/etc/pdns-recursor/recursor.confは基本的に次のようになります。

setuid=pdns-recursor
setgid=pdns-recursor
allow-from=127.0.0.0/8, 192.168.1.0/8, ::1/128, fe80::/10
auth-zones=webserver.dyndns.org=/etc/pdns-recursor/[webserver.dyndns.org].zone, localdomain=/etc/pdns-recursor/[localdomain].zone, 168.192.in-addr.arpa=/etc/pdns-recursor/[168.192.in-addr.arpa].zone
local-address=192.168.1.2

上記は非常に削減されたものを参照しています ゾーンファイル (実際の名前は重要ではありません):

/etc/pdns-recursor/[168.192.in-addr.arpa].zone内(レコード名の末尾にドットがないことに注意してください。これは絶対名ではなく相対名です。1.11.1.168.192.in-addr.arpaを意味します)。これは、「IN」の有無にかかわらず機能します。

1.1   IN   PTR     webserver.dyndns.org.
2.1   IN   PTR     dns.localdomain.
3.1   IN   PTR     b.localdomain.

/etc/pdns-recursor/[webserver.dyndns.org].zone内(レコード名の末尾のドットに注意してください。これは相対名ではなく絶対名です)

webserver.dyndns.org.  IN  A  192.168.1.1

/etc/pdns-recursor/[localdomain].zone

webserver    IN  A  192.168.1.1
dns          IN  A  192.168.1.2
b            IN  A  192.168.1.3

pdns-recursorを再起動した後、onは次のコマンドを実行してDigを使用してテストできます。

PDNS=192.168.1.2

# Test unknwon domain resolution and webserver resolution    
Dig @$PDNS www.cnn.com | grep -A1 ";; ANSWER SECTION:"                  
Dig @$PDNS webserver.dyndns.org | grep -A1 ";; ANSWER SECTION:"

# Test responses for localdomain
Dig @$PDNS unknown.localdomain | grep -A1 ";; ANSWER SECTION:"
Dig @$PDNS webserver.localdomain | grep -A1 ";; ANSWER SECTION:"
Dig @$PDNS b.localdomain | grep -A1 ";; ANSWER SECTION:"
Dig @$PDNS dns.localdomain A | grep -A1 ";; ANSWER SECTION:"

# Test responses for localdomain if the domain is omitted
Dig +search @$PDNS webserver | grep -A1 ";; ANSWER SECTION:"

# Test reverse resolution
Dig @$PDNS -x 192.168.1.1 | grep -A1 ";; ANSWER SECTION:"
Dig @$PDNS -x 192.168.1.2 | grep -A1 ";; ANSWER SECTION:"
Dig @$PDNS -x 192.168.1.3 | grep -A1 ";; ANSWER SECTION:"
Dig @$PDNS -x 192.168.1.4 | grep -A1 ";; ANSWER SECTION:"
1
David Tonhofer

非常に混乱し、複雑で、管理が難しいため、このパスをたどらないことを強くお勧めします。代わりに、inside.example.comのような別の内部ドメインを設定する必要があります。次に、外部DNSサーバーも内部ネットワーク上にある場合は、両方のドメインに対して権限を持つように設定する必要があります。ただし、外部DNSサーバーが内部ネットワーク上にない場合は、内部DNSサーバーをinside.example.comに対して権限を持つように設定する必要があります。次に、内部DNSサーバーは、他のすべての要求を外部DNSサーバーに転送する必要があります。

これの欠点は、すべての内部マシンのドメインを変更する必要があることですが、その前もって作業を行うことで、後で多くの混乱を避けることができます。

1
Phil Hollenback

PowerDNSで PipeBackend を使用します。 Pythonでいくつかのシステムを作成しました。

PipeBackend:

PipeBackendは主に、PowerDNSと緊密に統合することなく新しいバックエンドの迅速な開発を可能にすることを目的としています。これにより、エンドユーザーは任意の言語でPDNSバックエンドを作成できます。

0
alvosu