web-dev-qa-db-ja.com

(Windows)PowerShellを使用して、BIND9サーバーに対してTSIGを使用して動的DNS更新を実行する

BIND9 DNSサーバーを実行し、TSIGキーを使用して顧客からのダイナミックDNS更新を許可します。

私の顧客の1人は、Windows環境のみを使用しているため、PowerShellを使用してスクリプトを実行しています。彼は、PowerShellを使用して動的更新をサーバーに送信したいと考えています。

テストのためにLinuxシェルからこれを行うのは簡単です。nsupdateを使用してください。

差出人: https://www.freeipa.org/page/Howto/DNS_updates_and_zone_transfers_with_TSIG

クライアント

Bind-utilsパッケージからのnsupdateの場合、オプション-y Algorithm:keyname:keyvalueまたは-kkeyfilenameオプションのいずれかを使用する必要があります。例えば。

$ nsupdate -y hmac-sha512:keyname:keyvalue

または

$ nsupdate -k Kkeyname.+165+0316.private

次に、更新を行います。

から https://linux.die.net/man/8/nsupdate

# nsupdate
> update delete oldhost.example.com A
> update add newhost.example.com 86400 A 172.16.1.1
> send

Powershellwithoutなしで更新を行うにはTSIGは...ちょっと簡単です...私は思いますか?:コマンドレットを使用してください(たとえば) 追加-DnsServerResourceRecordA

Add-DnsServerResourceRecordA -Name "Host23" -ZoneName "contoso.com" - AllowUpdateAny -IPv4Address "172.18.99.23" -TimeToLive 01:00:00

ドキュメントを精査した後、トランザクション署名への参照がないか、TSIGキーを使用していることがわかりません。

TISGキーを使用して動的更新をPowershellからBIND9サーバーに送信するにはどうすればよいですか?

これは、イライラするほど例を見つけるのが難しいです。私が見つけることができるほとんどの例は、PowerShellを使用してAPIを介して更新を送信し、APIを介して(おそらく)ブラックボックス内で何らかの展開または動的更新を実行します。 DDNS更新をビルドし、PowerShellを使用して送信したいだけです。

1
Watki02

BINDからnsupdateをダウンロードする必要があります( https://www.isc.org/downloads/ )。 PowerShellホストからnsupdateを呼び出すことができます。

2
Jim B

Tsigファイルが提供されている場合にDDNSリクエストを作成して送信するスクリプトを次に示します。権限のないユーザー(他の管理者を含む)がこのファイルにアクセスできないように、NTFSアクセス許可が設定されていることを確認してください。

これは、nsupdate.exeと関連するdllがC:\ windows\system32にインストールされていることを前提としていますが、他のパス用に変更することもできます。

プルリクエストを歓迎します。 https://github.com/ACiDGRiM/UsefulScripts/blob/master/Update-DNS.ps1

Param (
    [String]$KeyPath = "C:\Windows\System32\drivers\etc\windows-update-client.txt",
    [String]$NSScriptPath = "$env:Temp\nsupdate.txt",
    [String]$NSUpdatePath = "$env:SystemRoot\System32"
)

begin {
    #Gather status of system IP Addresses, DNS Servers, and domains
    $IPAddresses = Get-NetIPAddress | Where-Object -FilterScript { ($_.InterfaceAlias -like "Ethernet*" -or $_.InterfaceAlias -like "Wi-Fi*") -and $_.IPAddress -notlike "fe*"}
    $DNSServers = Get-DnsClientServerAddress | Where-Object -FilterScript { $_.InterfaceAlias -like "Ethernet*" -or $_.InterfaceAlias -like "Wi-Fi*"}
    $DNSClient = Get-DnsClient | Where-Object -FilterScript { $_.InterfaceAlias -like "Ethernet*" -or $_.InterfaceAlias -like "Wi-Fi*"}
}

process {
    [array]$RequestOutput = @()
    #Parse network status into simplified objects
    foreach ( $if in $IPAddresses ) {
        $requesthash = @{
            IPAddress = @{Address = $if.IPAddress;AddressFamily = $if.AddressFamily}
            Zone = $DNSClient | Where-Object -FilterScript { $_.InterfaceAlias -eq $if.InterfaceAlias } | Select-Object -ExpandProperty "ConnectionSpecificSuffix" -First 1
            Servers = $DnsServers | Where-Object -FilterScript { $_.InterfaceAlias -eq $if.InterfaceAlias } | Select-Object -ExpandProperty "ServerAddresses"
        }
        $RequestObj = New-Object -TypeName psobject -Property $requesthash
        $RequestOutput += $RequestObj 

    }

    #Condense zones from multiple interfaces
    [array]$UniqueZones = ($RequestOutput.Zone|Sort-Object -Unique)
    #Combine IPv6 and IPv4 addresses into a single object property for each zone
    [array]$CombinedOutput = @()
    for ($i=0;$i -lt $UniqueZones.count;$i++) {
        $Combinedhash = @{
            Addresses = $RequestOutput | Where-Object -FilterScript {$_.Zone -eq $UniqueZones[$i]} | Select-Object -ExpandProperty "IPAddress"
            Servers = $RequestOutput | Where-Object -FilterScript {$_.Zone -eq $UniqueZones[$i]} | Select-Object -ExpandProperty "Servers" | Sort-Object -Unique
            Zone = $UniqueZones[$i]
        }
        $CombinedObj = New-Object -TypeName psobject -Property $Combinedhash
        $CombinedOutput += $CombinedObj 
    }

    foreach ( $o in $CombinedOutput ) {
        foreach ( $s in $o.Servers ) {
            $CurrentRecords = Resolve-DnsName $env:COMPUTERNAME`.$($o.Zone) -Server $s -Type "A_AAAA" -DnsOnly -DnssecOK -QuickTimeout -ErrorAction "SilentlyContinue" | Select-Object -ExpandProperty "IPAddress" -ErrorAction "SilentlyContinue"
            if ( $CurrentRecords ) {
                $CurrentState = Compare-Object $IPAddresses.IPAddress $CurrentRecords -ErrorAction "SilentlyContinue"
            } else {
                $CurrentState = $true
            }

            if ( $CurrentState ) {
                $script += "server $s
"
                foreach ( $a in $o.Addresses ) {
                    if ( $a.AddressFamily -eq "IPv4" ) {
                        $PTR = $a.Address -replace '^(\d+)\.(\d+)\.\d+\.(\d+)$','$3.$2.$1.in-addr.arpa.'
                    } else {
                        $PTR = (([char[]][BitConverter]::ToString(([IPAddress]$a.Address).GetAddressBytes())-ne'-')[31..0]-join".")+'.ip6.arpa.'
                    }
                    $script += "update delete $env:COMPUTERNAME.$($o.Zone). $(if($a.AddressFamily -eq "IPv4"){"A"}else{"AAAA"})

update add $env:COMPUTERNAME.$($o.Zone). 60 $(if($a.AddressFamily -eq "IPv4"){"A"}else{"AAAA"}) $($a.Address)

update delete $PTR PTR

update add $PTR 60 PTR $env:COMPUTERNAME.$($o.Zone).


"
                }
            }

        }
    }
}

end {
    $script | Out-File -FilePath $NSScriptPath -Encoding "ascii" -Force
    Start-Process -FilePath (Join-Path -Path $NSUpdatePath -ChildPath "nsupdate.exe") -ArgumentList "-d -k `"$KeyPath`" `"$NSScriptPath`"" -Wait -NoNewWindow -RedirectStandardError "$env:TEMP\nsstderr" -RedirectStandardOutput "$env:TEMP\nsstdout" -WorkingDirectory $NSUpdatePath | Out-Null

}
0
ACiD GRiM