web-dev-qa-db-ja.com

サーバー2016のDNSポリシーを使用して、ドメイン内の一部のレコードに対してのみ代替IPを返すことはできますか?

2つの重要な目標を持つ一種のDNSスプリットブレインシナリオを提供する必要があります。

  1. 「特別な」DNSクライアント(サブネットに基づく)は、1つのドメイン内の特定のAレコードを他のクライアントとは異なるIPアドレスに解決する必要があります
  2. 同じドメイン内の他のすべてのレコードは、どのクライアントが要求しているかに関係なく、等しく解決される必要があります。

つまり、クライアントによってはレコードがほとんど異なる、一種の「DNSリライト」またはオーバーレイを作成したいと思います。私は、サーバー2016のDNSポリシーによってこれを達成したいと考えていました。このポリシーでは、「スプリットブレイン/ホライズン」を意図されたシナリオの1つとして説明しています。 https://blogs.technet.Microsoft.com/networking/2015/05/12/split-brain-dns-deployment-using-windows-dns-server-policies/ -しかし、私はそうです目標2を達成できません。

私のテストでは、一致したクライアントに返される代替IPアドレスとクライアントサブネットに基づくクエリ解決ポリシーを使用してZoneScopeを作成し、目標1)を達成しました。ただし、クライアントが「特別な」サブネットからのものであると一致した場合、特別なZoneScopeからのレコードのみを解決できますが、「デフォルト」のスコープからは解決できません。そのため、目標2は失敗します。

特別なzonescopeに一致するレコードが含まれていない場合に、デフォルトのZoneScopeにフォールバックできる構成手順を見逃した可能性がありますか?これは、応答ゾーンポリシーを使用したBIND DNSで簡単に実行できると言われていますが、可能な限りMSを使用したいと思います。また、これらの「特別な」サーバーは完全に制御されていないため、hostsファイルを使用することはできません。

再現する手順

#define subnet of restricted servers
Add-DnsServerClientSubnet -name SpecialServers -IPv4Subnet 192.168.0.0/24    
#define ZoneScope for the special records 
Add-DnsServerZoneScope -ZoneName "test.local" -Name "SpecialZoneScope" 

#Prepare some testing records in the default scope
Add-DnsServerResourceRecord -ZoneName "test.local" -A -Name HostA -IPv4Address 1.1.1.1
Add-DnsServerResourceRecord -ZoneName "test.local" -A -Name HostB -IPv4Address 1.1.1.2
#Prepare alternative record in SpecialZoneScope
Add-DnsServerResourceRecord -ZoneName "test.local" -ZoneScope "SpecialZoneScope" -A -Name HostA -IPv4Address 20.20.20.1

#Define query resolution policy 
Add-DnsServerQueryResolutionPolicy -Name "SplitBrainZonePolicy" -Action ALLOW -ClientSubnet "eq,SpecialServers" -ZoneScope "SpecialZoneScope,1" -ZoneName "test.local"

結果:

「通常の」クライアントからのnslookup:

> HostA.test.local
Server:  dns.test.local
Address:  ****

Name:    HostA.test.local
Address:  1.1.1.1

> HostB.test.local
Server:  dns.test.local
Address:  ****

Name:    HostB.test.local
Address:  1.1.1.1.2

「デフォルト」ゾーンスコープからの両方のレコードが正しく返されます。

「特別な」サブネット内のクライアントからのnslookup:

> HostA.test.local
Server:  dns.test.local
Address:  ****

Name:    HostA.test.local
Address:  20.20.20.1

> HostB.test.local
Server:  dns.test.local
Address:  ****

*** dns.test.local can't find HostB.test.local: Non-existent domain

HostAは、意図したとおり、SpecialZoneScopeからの代替IPで解決されますが、HostBはまったく解決されません。

2
StepCZ

はい、あなたは間違いなくこれを行うことができます。クエリ解決ポリシーをゾーンスコープ内の特定のレコードに制限するのを忘れたことを除いて、すべて正しく実行しました。これは、以下に示すように-FQDNパラメーターを使用して行います。

Add-DnsServerQueryResolutionPolicy -Name "SplitBrainZonePolicy" -Action ALLOW -FQDN "eq,HostA.test.local" -ClientSubnet "eq,SpecialServers" -ZoneScope "SpecialZoneScope,1" -ZoneName "test.local"

説明

ゾーンスコープを元のゾーンにオーバーレイされた一種の「透明性」と考えようとしていますが、実際はそうではありません。

これは不透明な代替ゾーンです(ファイルの代替データストリームのようなものです)。そのゾーンスコープに対するクエリがデフォルトゾーンに「フォールバック」することはありません。

したがって、クエリ解決ポリシーを作成するときは、特定のクエリがゾーンスコープを選択するためのルールを定義します。

1つのレコードHostAのみでゾーンスコープを定義し、特定のIPからそのゾーンにすべてのクエリを送信するQRPを定義することで、事実上、そのレコードしか表示できないと言っています。

QRPにFQDNを追加すると、指定されたサブネットのクライアントのみがクエリも実行HostA.test.localであり、代替ゾーンスコープに送信されます。

もちろん、ゾーンにさらにレコードがある場合は、複数のレコードを指定するか、複数のQRPを作成する必要があります。ワイルドカードを使用することもできます。

1
briantist