我们的组织在 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
答案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/‘