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サーバーのスレーブにすることができても、独自の結果を追加するためのプロビジョニングがある場合は、それが理想的です。
これは可能ですか?
実際、iがを実行する必要がある場合は、postresolveのデータをマングルするリカーサーでLuaスクリプトを使用します。
ただし、実際には別の方法をお勧めします。権限のあるサーバーからexample.comをAXFRするinternal.example.comのような個別の権限のあるゾーンを使用し、ローカルのRFC1918データを追加するだけです。
このようにして、LANからインターネット上にあるように権限のあるゾーンをデバッグし、内部データを使用することができます。
PowerDNS Recursor Luaスクリプティングについて: http://doc.powerdns.com/recursor-scripting.html
私が望むのはスプリットホライズン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にリダイレクトすると思います。
Fedora 20をしばらくいじってみたところ、うまくいったようです。私はどこにも完全なハウツーを見つけていないので、最小限のセットアップのための短い記事:
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上のマシンbはwebserver.dyndns.org
をIPアドレスIPxに解決し、WebサービスがLANを直接。さらに、LAN上のすべてのマシンがbar.localdomainの行に沿って名前が付けられていると仮定すると、名前webserver.localdomain
もIPxに解決されるはずです。 。また、適切な測定のために逆ルックアップを行い、IPxをLAN内のwebserver.dyndns.org
(インターネット上ではIPxに解決します。 )もちろん何にも解決されず、IPispはISPによって生成された任意の文字列に解決されます。)
pdns-recursorがIPIPdnsを備えた別のマシンで実行されていると想定しますが、Webサーバーで実行することもできます( IPxまたはエイリアスと同じIPアドレス上にあるか、LAN上に1台のマシンしかない。
マシン「b」は、DHCPを介して静的または動的に構成できます。 dhclient
とdnsmasq
、場合によっては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.1
は1.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:"
非常に混乱し、複雑で、管理が難しいため、このパスをたどらないことを強くお勧めします。代わりに、inside.example.com
のような別の内部ドメインを設定する必要があります。次に、外部DNSサーバーも内部ネットワーク上にある場合は、両方のドメインに対して権限を持つように設定する必要があります。ただし、外部DNSサーバーが内部ネットワーク上にない場合は、内部DNSサーバーをinside.example.comに対して権限を持つように設定する必要があります。次に、内部DNSサーバーは、他のすべての要求を外部DNSサーバーに転送する必要があります。
これの欠点は、すべての内部マシンのドメインを変更する必要があることですが、その前もって作業を行うことで、後で多くの混乱を避けることができます。
PowerDNSで PipeBackend を使用します。 Pythonでいくつかのシステムを作成しました。
PipeBackend:
PipeBackendは主に、PowerDNSと緊密に統合することなく新しいバックエンドの迅速な開発を可能にすることを目的としています。これにより、エンドユーザーは任意の言語でPDNSバックエンドを作成できます。