Могу ли я использовать запись CNAME (только) для перенаправления своего домена без A-записи в ситуации DDNS? - PullRequest
0 голосов
/ 27 февраля 2019

Мне кажется, я понимаю разницу между ними и тем, когда следует использовать CNAME для обычного перенаправления, но другие вопросы / ответы не отвечают моему конкретному сценарию:

Я не могу получить статический IP длямой хозяин дома, поэтому вынужден использовать DDNS.Допустим, у меня есть mydomain.net, на который я хочу указать mydomain.ddns.net.Я поместил запись CNAME в свой DNS-провайдер следующим образом:

CNAME * .mydomain.net mydomain.ddns.net

Я использую www и ftp, следовательно, подстановочный знак.

У меня нет A-записи, поскольку она будет работать только временно, пока мой IP не изменится снова, поэтому запись CNAME является единственной.У меня запущен инструмент No-IP, поэтому mydomain.ddns.net обновляется всякий раз, когда он меняется, и это прекрасно работает.

Когда я пытаюсь пропинговать mydomain.net, он не может найти хост, поэтому DNS не работает, и поэтому я подозреваю, что что-то не так с моей записью CNAME.Я подозреваю, что это потому, что у меня нет A-записи, но я не могу найти нигде, чтобы подтвердить это.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 16 апреля 2019

После вдохновения от @colde и небольшого количества работы я хотел поделиться своим пакетным сценарием, который реализует его ответ.

Он выполняется планировщиком задач каждые 10 минут, сначала проверяет, есть ли подключение к Интернету, и, если да, проверяет, изменился ли мой публичный IP-адрес, и только в этом случае обновляет DNS cloudflare через их API.

Я анонимизировал свои личные идентификаторы и URL-адрес API, очевидно, вам нужно их изменить.

@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 ---"
0 голосов
/ 27 февраля 2019

*.example.net не поймает example.net.Однако, как вы упоминаете, если вы пингуете www.example.net, он попадет на CNAME.

К сожалению, вы не можете иметь CNAME на example.net, потому что CNAME не разрешено сосуществовать с любыми другими типами записей,и для example.net у вас будут как минимум записи типа NS (который указывает ваши серверы имен).

Один из способов обойти это вместо использования ddns.net - использовать провайдера, которыйимеет API и обновляет запись A для example.net напрямую.Одним из таких провайдеров может быть Cloudflare , который предоставляет DNS-хостинг бесплатно.Существует множество из руководств о том, как использовать их в качестве динамического DNS.

...