使用带有 NAT 的 IP 的动态 DNS

使用带有 NAT 的 IP 的动态 DNS

我们的组织在 ADSL 上使用 Billion 7800 路由器,并配备 USB 4G/LTE 故障转移功能。在 ADSL 上,我们的 dynDNS 会注册正确的公共 IP 地址。当它故障转移到 4G 时,USB 加密狗不会向 Billion 提供公共 IP,而是提供 NAT 后的 IP 192.168.8.100。由于动态 DNS 应用程序/凭据存储在 Billion 上,因此 Billion 使用 192.168.8.100 地址更新公共记录。这并不理想。

我们希望有一种方式让记录成为公共 IP 地址。一个简单的谷歌就可以返回实际的公共 IP 地址。是否有任何动态 DNS 提供商可以从注册请求中获取实际的公共 IP,并将此公共 IP 用于 A 记录?

我们当前提供商的响应只是“重新配置您的网络,以便路由器可以看到公共 IP”或“改用 Windows 客户端代理/应用程序执行注册”。由于硬件限制和软件安装限制,这两种方法都不可能实现。

除了使用其他能够动态确定请求来源的公共 IP 并使用该 IP 的提供商之外,我看不出还有其他解决此问题的方法。

答案1

这看起来是个小问题。您可以:

  • 安装大多数服务提供的动态 DNS 更新程序(dynDNS 示例)在网络内的任何一台机器上

  • 定期运行查询(curl),以更新您的公共 IP 的值(dynDNS 说明

答案2

让您的“动态 IP”与您的 DNS 保持同步的一种方法是使用 Dyn 或 NoIP 等服务,它们提供其专有域名/可供购买的域名。

但是,如果您有自己的自定义域名,则可以使用 NameSilo 的 DNS 服务(http://www.namesilo.com) 作为您的 DNS 提供商,并使用下面的 powershell windows 脚本以及计划任务来复制 Dyn/NoIP 服务。

假设您正在运行 Windows,这里有一个简单的脚本,您可以使用任务计划程序“安排”它在启动/登录时运行,然后每 6 小时重新运行一次(这样,由于 IP 地址更改而导致的最大停机时间为 6 小时)。

将下面的脚本保存在名为NameSiloDDNS.ps1

# NameSilo API Dynamic DNS
#Variables
param([string]$APIkey=$(throw "APIKey is required"), [string]$domain=$(throw "Domain is required"), [string]$record)


###Code - Do not edit below this line
# Gather data about the DNS entries in the domain
$listdomains = Invoke-RestMethod -Uri "https://www.namesilo.com/apibatch/dnsListRecords?version=1&type=xml&key=$APIkey&domain=$domain"
$CurrentIP = $listdomains.namesilo.request.ip
if ($record) {
    $RecordIP = ($listdomains.namesilo.reply.resource_record|where {$_.host -eq "$record.$domain" -and $_.type -eq "A"}).value
    $RecordID = ($listdomains.namesilo.reply.resource_record|where {$_.host -eq "$record.$domain" -and $_.type -eq "A"}).record_id
} else {
    $RecordIP = ($listdomains.namesilo.reply.resource_record|where {$_.host -eq "$domain" -and $_.type -eq "A"}).value
    $RecordID = ($listdomains.namesilo.reply.resource_record|where {$_.host -eq "$domain" -and $_.type -eq "A"}).record_id
}
$listdomains.namesilo.reply
#Write-Host "CurrentIP $CurrentIP, RecordIP $RecordIP, RecordID $RecordID"

# If the current IP address is not the same as the one in the record it updates it
Write-Host "https://www.namesilo.com/apibatch/dnsUpdateRecord?version=1&type=xml&key=$APIkey&domain=$domain&rrid=$RecordID&rrhost=$record&rrvalue=$CurrentIP&rrttl=3600"
if ($CurrentIP -ne $RecordIP){
    if ($record) {
        Write-Host "Updating $record.$domain with IP $CurrentIP"
    } else {
        Write-Host "Updating $domain with IP $CurrentIP"
    }
    $update = Invoke-RestMethod -Uri "https://www.namesilo.com/apibatch/dnsUpdateRecord?version=1&type=xml&key=$APIkey&domain=$domain&rrid=$RecordID&rrhost=$record&rrvalue=$CurrentIP&rrttl=3600"
    $update.namesilo.reply
} else {
    Write-Host "No need to update $record.$domain, IP $CurrentIP upto date"
}

接下来将下面的脚本保存在名为的文件中UpdateDDNSIPv4.bat

PowerShell -ExecutionPolicy Bypass .\NameSiloDDNS.ps1 <NameSilo_API_Key> somedomain.com
PowerShell -ExecutionPolicy Bypass .\NameSiloDDNS.ps1 <NameSilo_API_Key> somedomain.com subdomain

将两个文件保存在同一目录中。UpdateDDNSIPv4.bat是任务计划程序在您的重复任务中应该调用的批处理文件。

需要注意的几点是,您需要登录到您的 NameSilo 帐户,然后在 API 管理器 -> 生成 API 密钥下,您需要在上面的批处理脚本中输入该密钥来替换<NameSilo_API_Key>。此脚本可用于更新A主域(例如somedomain.com)以及子域(例如subdomain)的 DNS 记录。您可以为要更新的每个域/子域创建一行。

该脚本将自动找到您的“公共 IP 地址”,然后更新您的 NameSilo DNS A 记录。

您可以在这里找到此脚本的 BASH 等效版本:https://github.com/pztop/namesilo_ddns

您还可以在以下位置找到与 Python 等效的脚本: https://github.com/rbenji/DynamicDNS-for-NameSilo

此脚本取自并定制自http://www.forkrobotics.com/2014/10/dynamic-dns-with-namesilo-and-powershell/

希望这可以帮助

答案3

您可以使用 AnyDesk(版本 5.2+),它允许您在客户端之间建立 TCP 连接。

我使用它通过互联网将我的客户端 PC 连接到 Team Foundation Server (TFS)。服务器和客户端位于 NAT 后面。我将本地和远程端口设置为“8080”,然后我可以使用客户端上的以下地址从客户端连接到服务器:'http://localhost:8080/tfs/

参考:TCP-隧道-AnyDesk

相关内容