在 DDNS 情况下,我可以使用 CNAME 记录(仅)来重定向我的域而没有 A 记录吗?
Can I use a CNAME record (only) to redirect my domain without an A-record in DDNS situation?
我想我明白两者之间的区别以及何时使用 CNAME 正常重定向,但另一个 questions/answers 不回答我的具体情况是:
我家里的主机无法获取静态IP,所以被迫使用DDNS。假设我有 mydomain.net,我想指向 mydomain.ddns.net。我在我的 DNS 提供商中放置了一条 CNAME 记录,如下所示:
CNAME *.mydomain.net mydomain.ddns.net
我使用 www 和 ftp 因此使用通配符。
我没有 A 记录,因为这只能在我的 IP 再次更改之前暂时有效,所以 CNAME 记录是唯一的记录。我有 No-IP 工具 运行,所以 mydomain.ddns.net 确实会在它发生变化时得到更新,而且效果很好。
当我尝试 ping mydomain.net 时,它找不到主机,因此 DNS 不工作,因此我怀疑我的 CNAME 条目有问题。我怀疑是因为我没有 A-Record,但找不到任何地方可以证实这一点。
提前致谢。
*.example.net
不会赶上example.net
。但是,正如您提到的,如果您 ping www.example.net
它将命中 CNAME。
很遗憾,您不能在 example.net
上拥有 CNAME,因为 CNAME 不允许与任何其他记录类型共存,对于 example.net
,您至少会有NS 类型(指定您的名称服务器)。
解决此问题的一种方法是使用具有 API 的提供程序而不是使用 ddns.net,并直接更新 example.net
的 A 记录。此类提供商之一可能是 Cloudflare that does DNS hosting for free. There are plenty of guides 如何将它们用作动态 DNS。
在@colde 的启发和一些工作之后,我想分享我实现他的答案的批处理脚本。
它由 Task Scheduler 每 10 分钟执行一次,首先检查是否有互联网连接,如果有,检查我的 public IP 是否更改,只有这样,通过他们的更新 cloudflare DNS API。
我已经匿名化了我的个人标识符和 API url,显然你需要更改它们。
@echo off
cls
setlocal EnableExtensions EnableDelayedExpansion
set logFile=.\UpdatePublicIP.log
call :log "--- SCRIPT STARTED ---"
goto TestInternet
:log
echo [!date! !time!] %~1
echo [!date! !time!] %~1 >>%logFile%
exit /b 0
:TestInternet
REM First test for internet connectivity.
call :log "Detecting internet."
PING -n 1 8.8.8.8|find "Reply from " >NUL
IF NOT ERRORLEVEL 1 goto :CheckPublicIP
IF ERRORLEVEL 1 goto :NoInternet
:NoInternet
call :log "No internet, nothing to do."
goto End
:CheckPublicIP
call :log "Detecting public IP."
for /f %%A in (
'powershell -command "(Invoke-Webrequest "http://api.ipify.org").content"'
) do (
set TempPublicIP=%%A
)
call :log "Current Public IP: %TempPublicIP%"
if not "%TempPublicIP%"=="%PublicIP%" (
call :log "Saved IP [%PublicIP%] different to current [%TempPublicIP%] IP, updating saved PublicIP."
REM Note: setx saves env var but only available in future cmd windows, not current one.
setx PublicIP %TempPublicIP% >nul
goto UpdateDNS
) else (
call :log "Current IP = saved IP, nothing to do."
)
goto End
:UpdateDNS
call :log "Updating CloudFlare DNS record to [%TempPublicIP%]."
curl -X PUT "https://api.cloudflare.com/client/v4/zones/12345abcde12345abcde12345abcde12/dns_records/1234567890qwertyuiop0987654321ab" -H "X-Auth-Email: yourusername@hotmail.com" -H "X-Auth-Key:a123b4567c8defghijklmnopqrstuvwxyz123" -H "Content-Type: application/json" --data "{\"type\":\"A\",\"name\":\"yourdomainname.net\",\"content\":\"%TempPublicIP%\"}"|findstr.exe modified_on >nul
REM Can't use "success":true due to the quote. Assuming the string "modified_on" occurs on success only.
IF NOT ERRORLEVEL 1 goto :CloudFlareSuccess
IF ERRORLEVEL 1 goto :CloudFlareError
goto End
:CloudFlareSuccess
call :log "CloudFlare DNS update succeeded.
goto End
:CloudFlareError
call :log "CloudFlare DNS update failed.
goto End
:End
call :log "--- SCRIPT FINISHED ---"
我想我明白两者之间的区别以及何时使用 CNAME 正常重定向,但另一个 questions/answers 不回答我的具体情况是:
我家里的主机无法获取静态IP,所以被迫使用DDNS。假设我有 mydomain.net,我想指向 mydomain.ddns.net。我在我的 DNS 提供商中放置了一条 CNAME 记录,如下所示:
CNAME *.mydomain.net mydomain.ddns.net
我使用 www 和 ftp 因此使用通配符。
我没有 A 记录,因为这只能在我的 IP 再次更改之前暂时有效,所以 CNAME 记录是唯一的记录。我有 No-IP 工具 运行,所以 mydomain.ddns.net 确实会在它发生变化时得到更新,而且效果很好。
当我尝试 ping mydomain.net 时,它找不到主机,因此 DNS 不工作,因此我怀疑我的 CNAME 条目有问题。我怀疑是因为我没有 A-Record,但找不到任何地方可以证实这一点。
提前致谢。
*.example.net
不会赶上example.net
。但是,正如您提到的,如果您 ping www.example.net
它将命中 CNAME。
很遗憾,您不能在 example.net
上拥有 CNAME,因为 CNAME 不允许与任何其他记录类型共存,对于 example.net
,您至少会有NS 类型(指定您的名称服务器)。
解决此问题的一种方法是使用具有 API 的提供程序而不是使用 ddns.net,并直接更新 example.net
的 A 记录。此类提供商之一可能是 Cloudflare that does DNS hosting for free. There are plenty of guides 如何将它们用作动态 DNS。
在@colde 的启发和一些工作之后,我想分享我实现他的答案的批处理脚本。
它由 Task Scheduler 每 10 分钟执行一次,首先检查是否有互联网连接,如果有,检查我的 public IP 是否更改,只有这样,通过他们的更新 cloudflare DNS API。
我已经匿名化了我的个人标识符和 API url,显然你需要更改它们。
@echo off
cls
setlocal EnableExtensions EnableDelayedExpansion
set logFile=.\UpdatePublicIP.log
call :log "--- SCRIPT STARTED ---"
goto TestInternet
:log
echo [!date! !time!] %~1
echo [!date! !time!] %~1 >>%logFile%
exit /b 0
:TestInternet
REM First test for internet connectivity.
call :log "Detecting internet."
PING -n 1 8.8.8.8|find "Reply from " >NUL
IF NOT ERRORLEVEL 1 goto :CheckPublicIP
IF ERRORLEVEL 1 goto :NoInternet
:NoInternet
call :log "No internet, nothing to do."
goto End
:CheckPublicIP
call :log "Detecting public IP."
for /f %%A in (
'powershell -command "(Invoke-Webrequest "http://api.ipify.org").content"'
) do (
set TempPublicIP=%%A
)
call :log "Current Public IP: %TempPublicIP%"
if not "%TempPublicIP%"=="%PublicIP%" (
call :log "Saved IP [%PublicIP%] different to current [%TempPublicIP%] IP, updating saved PublicIP."
REM Note: setx saves env var but only available in future cmd windows, not current one.
setx PublicIP %TempPublicIP% >nul
goto UpdateDNS
) else (
call :log "Current IP = saved IP, nothing to do."
)
goto End
:UpdateDNS
call :log "Updating CloudFlare DNS record to [%TempPublicIP%]."
curl -X PUT "https://api.cloudflare.com/client/v4/zones/12345abcde12345abcde12345abcde12/dns_records/1234567890qwertyuiop0987654321ab" -H "X-Auth-Email: yourusername@hotmail.com" -H "X-Auth-Key:a123b4567c8defghijklmnopqrstuvwxyz123" -H "Content-Type: application/json" --data "{\"type\":\"A\",\"name\":\"yourdomainname.net\",\"content\":\"%TempPublicIP%\"}"|findstr.exe modified_on >nul
REM Can't use "success":true due to the quote. Assuming the string "modified_on" occurs on success only.
IF NOT ERRORLEVEL 1 goto :CloudFlareSuccess
IF ERRORLEVEL 1 goto :CloudFlareError
goto End
:CloudFlareSuccess
call :log "CloudFlare DNS update succeeded.
goto End
:CloudFlareError
call :log "CloudFlare DNS update failed.
goto End
:End
call :log "--- SCRIPT FINISHED ---"