Cloudflare DNS

Первые впечатления от Cloudflare DNS и прочих сервисов от Cloudflare. В целом, весьма гиковская штука, местами очень продвинутая, но есть и некоторые неожиданные нюансы.

TL;DR

После первой недели с момента большого переезда, мне Cloudflare видится как весьма достойный набор сервисов, очень простой трансфер, вполне приемлемая цена, но есть и некоторые нюансы. Технически, он требует определенных усилий, чтобы заставить его работать как вам хочется, но это не так сложно, как кажется, хотя и весьма странно.

С чего все началось

Давным давно, в далекой-далекой галактике, я использовал GoDaddy для всех моих доменов. Я уже не помню, что я использовал до этого, но GoDaddy был на его фоне чем-то современным, привлекательным и совсем недорогим, на первый взгляд. Конечно, в 2023 году это звучит смешно, но в начале века это было нормально и многие люди использовали GoDaddy для своих доменов совершенно не задумываясь о том, что это может быть не лучшим выбором. Довольно быстро я понял, что GoDaddy - это какой-то позор: отвратительная поддержка, постоянные попытки меня как-то обмануть, технические глюки и неожиданные платежи за что-то, что они мне сами добавили. Хотя я и старался его внимательно холить и лелеять, один домен я таки потерял исключительно из-за ошибки на их стороне. Служба поддержки была абсолютно беспомощна и по сути заявила, что “такое иногда случается, но мы ничего не можем сделать”. Это было последней каплей и я решил, что пора что-то менять.

Моим выбором поначалу стал Gandi. Я успел перенести туда несколько доменов без особого труда, хотя это и заняло долгое время. Но медленный процесс был вызван тормознутостью процесса на стороне GoDaddy, а не Gandi. В целом, Gandi был весьма приличным регистратором; надежным и предсказуемым. Управление DNS у них сделано для простых людей и не вызывает никаких вопросов, если вы хоть раз делали подобные вещи. Цены были вполне приемлемыми, никаких глюков не происходило, а их репутация в интернет-кругах была “достойный регистратор”. Единственная странность возникла, когда они поменяли систему авторизации и заставили меня создать новый аккаунт. Это было немного странно, но в целом все сработало.

Через пару лет я обратил внимание на подобный сервис от AWS - Route53. Я уже давно пользовался AWS в основном для рабочих нужд, хотя и личные проекты тоже там были. Для работы Route53 был несомненно лучшим вариантом, т.к. все остальное тоже было в AWS. Я перенес туда все рабочие домены, а для тех, перенос которых был по ряду причин невозможен, использовал hosted zones от Route53. В целом, все работало и работает прелестно, и интеграция с остальными сервисами AWS это киллер-фича. Там есть много такого, чего обычные DNS не предоставляют, типа возможности резолвинга по условиям, мониторинга, failover на уровне DNS и прочего необходимого для рабочих проектов.

Но и для личных сайтов и доменов Route53 показался более чем привлекательным. Нормальная цена, гибкость всего этого хозяйства, железобетонная надежность. За долгие годы использования, ни одной проблемы с DNS не возникло. Со временем, большая часть моих личных доменов оказалась в Route53 и жила там счастливо много лет.

Что-то пошло не так

За последний год, “присутствие” моих личных проектов в AWS начало уменьшаться и сжалось до Route53. До этого я держал там пару весьма активных проектов, которые использовали разнообразные ресурсы AWS, и цена вопроса за все это хозяйство мне казалась вполне адекватной. Я платил где-то в районе $100-200 в месяц, но это было вполне оправдано. Я никогда особо не исследовал детали этих расходов, и просто платил за все это. Но в последнее время, я перенес все свои проекты на другие платформы, остался только Route53. Последний счет, который я получил, был на сумму около $40, и это был первый раз после перехода всего прочего на другие платформы. Т.е. за то, что я хостил у них с десяток зон, я заплатил $40 в месяц. Это стало определенным сюрпризом, при том, что я не использовал никаких дополнительных услуг, кроме DNS. При более внимательном рассмотрении этого счета и деталей прошлых счетов, обнаружилось, что цена вовсе не стабильна и зависит от количества и вида запросов. Тут, конечно нет никакого обмана, все описано в деталях, однако я вовсе не ожидал, что количество запросов к DNS могут быть настолько большим и, самое главное, настолько нестабильным. Без всяких действий с моей стороны, количество запросов к DNS может варьироваться из месяца в месяц буквально на порядок (это я обнаружил, когда проанализировал детали оплаты за весь год). Подобная ситуация мне показалась нездоровой, и хотя $40 в месяц это не так много, но принципиально мне не нравится такая нестабильность и непредсказуемость.

Переход на Cloudflare

Cloudflare никогда не был чем-то, что я практически использовал, хотя я и слышал о нем много хорошего. В моих глазах он ассоциировался прежде всего с CDN, но не так давно, когда мне понадобилось поднять туннель для приложения, что хостится в моем интранете, их Zero Trust подошел для этой задачи более чем полностью. При этом, чтобы любой сервис от Cloudflare использовать, нужно зарегистрировать то, что они называют “Website” и по сути это требует использования их DNS. Кроме NS записей, они предоставляют и полный набор услуг по регистрации и трансферу доменов. За регистрацию они берут минимально возможную цену и не накручивают ничего сверху.

Процесс переноса доменов в Cloudflare несколько необычный, но по сути простой и быстрый. Из странного - в отличие от всех остальных, они это делают “с другого конца”. Первым делом надо завести “Website” на этот домен, поменять NS на старом регистраторе, чтобы они указывали на Cloudflare, и только потом уже переносить домен. При этом, перенос домена происходит очень быстро (минуты), а не через несколько дней, как это обычно бывает. В целом, процесс переноса первого домена занял у меня несколько минут, и в течение часа все уже работало.

Странности, сложности и особенности

Первая сложность и странность была в том, как собственно перенести все имеющиеся записи из Route53 на Cloudflare. После регистрации Cloudflare пытается сам достать список всех записей и добавляет их автоматически. К сожалению, это работает весьма условно. В моем случае, он достал только часть записей, и даже из тех, что достал, он не смог правильно распознать некоторые CNAME. Я не уверен, на какой стороне тут проблема, но то, что он не сообразил добавить . постфикс в те CNAME, что Route53 отдает как feed-master.umputun.com. 1800 CNAME jess.umputun.com это конечно безобразие. Ну а на фоне того, что даже таких записей он смог получить только часть, надежность автоматического добавления не очень вдохновляет. Я понял, что это не наш путь и решил все сделать вручную. Конечно не в смысле “добавлять все руками”, но сделать импорт всех записей на стороне Cloudflare. Никакого готового способа экспортировать зону из Route53 нет (к слову, такое есть в Cloudflare, одним кликом), так что мне пришлось написать мелкий скрипт, что это делает и заодно, добавляет . в конце CNAME записей. Вот такой результат нашего совместного творчества с ChatGPT получился:

#!/bin/bash

export AWS_ACCESS_KEY_ID=********************
export AWS_SECRET_ACCESS_KEY=****************************************

zonename=$1

hostedzoneid=$(aws route53 list-hosted-zones --output json | jq -r ".HostedZones[] | select(.Name == \"$zonename.\") | .Id" | cut -d'/' -f3)
aws route53 list-resource-record-sets --hosted-zone-id $hostedzoneid --output json | jq -jr '.ResourceRecordSets[] | if .Type == "CNAME" and (.ResourceRecords[0]?.Value | test("\\.$") | not) then "\(.Name) \t\(.TTL) \t\(.Type) \t\(.ResourceRecords[0]?.Value). \n" else "\(.Name) \t\(.TTL) \t\(.Type) \t\(.ResourceRecords[]?.Value)\n" end'

После этого, я просто скопировал вывод этого скрипта и вставил в форму импорта на сайте Cloudflare. Все записи были добавлены без проблем, но все A и CNAME автоматически получили “Proxied” режим, а это источник еще одной странности. Тут дело в том, что Cloudflare это прежде всего CDN и проксирование это его гордость и фича. Но на практике, далеко не все сайты готовы к этому. Неожиданных проблем при этом может возникнуть столько, что это тема для отдельной статьи. В моем случае, я не хотел, чтобы все мои домены были проксированы, и мне пришлось отключать это вручную. На самом деле, это не так сложно, но вот что меня удивило - это нельзя сделать для всех записей сразу. На самом деле, это можно сделать, но только через API, а не через веб-интерфейс. В целом, это не такая большая проблема, но все же странно, что такая базовая фича не доступна через веб-интерфейс.

Я несколько упрощаю картину, и проксирование это совсем не бесполезная фигня, которую надо просто отключить. Во многих случаях, это очень полезная фича, например для защиты от DDoS-атак, или для ускорения загрузки сайта, или для сокрытия публичного IP сайта. И в моем случае некоторые домены я переключил обратно на проксирование, но только после того, как разобрался с тем, что это вообще такое и как это работает. Там немало специфики, и если вы не знаете, что это такое, то это лучше не трогать.

Дополнительные фичи

Помимо DNS, Cloudflare предоставляет множество других сервисов, которые могут быть полезными. Например, они предоставляют бесплатный сертификат для всех доменов, которые у них зарегистрированы. Это не такая большая фича в эпоху Let’s Encrypt, но все же приятно, что это делается автоматически и бесплатно. Они предоставляют и множество других сервисов, типа защиты от DDoS, WAF, и прочих безопасностных фич. Из того, чему я нашел реальное применение - это их Pages сервис. Это простой и бесплатный хостинг для статических сайтов, который работает на их CDN. В целом, это похоже на GitHub Pages, но если у вас уже есть там домен, то это может быть удобно. В моем случае, я перенес туда все свои мелкие статические сайты моих программных проектов (например https://repoxy.io, https://tg-spam.umputun.dev и еще десяток прочих), и это работает весьма неплохо. Ну и этот сайт, на котором вы сейчас находитесь, тоже теперь там живет.

Попытка перенести в Pages сайт https://radio-t.com показала, что это не так просто для проектов посложнее. Т.е. страницы это просто статика, и там можно построить практически любую. В нашем случае даже особо ничего не надо было делать вручную, т.к. сайт на hugo и Cloudflare Pages умеет такое строить из коробки. Однако, там есть и бэкенд, и это уже сложнее. В нашем случае, это относительно простой API, но все равно, это не статика. В общем, это тема для отдельного разговора, но в целом, это тоже можно сделать, если очень хочется, но это уже не так просто.

Выводы

Мне, по большому счету, понравился результат, и, в целом, понравился процесс. Штука эта весьма продвинутая, в ней есть много интересных фич, но все это скорее для гиков, чем для нормальных людей.