Защита, оптимизация и повышение производительности сайта с помощью CDN CloudFlare

Что такое CDN? Если коротко, CDN (Content Delivery Network) — глобальная сеть, которая служит для ускорения доставки трафика от поставщиков к получателям. К примеру, когда вы смотрите видео с Youtube, это видео не отправляется из единого датацентра, а обслуживается ближайшим к вам сервером CDN. Таким образом поставщики контента не только повышают качество обслуживания, но и снижают затраты на доставку трафика.

Среди покупателей услуг CDN есть самые разные потребители:

  • поставщики стримингового медиа-контента;
  • разработчики программного обеспечения;
  • сервисы доствки рекламы;
  • контентные сайты.

Разные сети CDN организованы по-разному, в зависимости от целей сети. Часто применяется принцип организации с помощью Anycast IP — способ, при котором владелец сети CDN публикует одни и те же IP-сети из разных точек с помощью протокола BGP. Таким образом, для пользователя из Москвы, некоторый IP A.B.C.D может видеться как московский, а для пользователя из Берлина как находящийся в Нидерландах.

Это позволяет избежать ряда проблем, например, с DNS, когда компьютеры пользователей помнят старые адреса, которые уже находятся в аварийном состоянии.

С другой стороны, Anycast IP не гарантирует лучшего маршрута трафика, поскольку это достаточно грубый инструмент. Однако, он надежен и применяется в CDN широко.

Не стоит думать, что CDN полезен только для огромных проектов и стоит кучу денег. Далее, мы рассмотрим как можно использовать CDN с обычным сайтом, какие преимущества это дает и что необходимо предусмотреть при использовании.

CDN CloudFlare

CloudFlare (CF) — известная компания на рынке CDN. Основная фишка CF заключается в комбинировании не только услуг CDN, но и защиты от DDoS как для больших, так и для малых проектов. С недавнего времени CF так же предоставляет всем сайтам бесплатные SSL-сертификаты, за которые совсем не надо платить деньги.

Вы можете начать пользоваться CF совершенно бесплатно, получая при этом услуги, которые удовлетворят даже требовательного клиента. Рассмотрим задачи, которые CDN CF поможет решить вашему сайту.

Большая безопасность передачи данных. При работе через CloudFlare ваш сайт бесплатно может использовать SSL-сертификат, выданный CloudFlare.

Защита сайта от DDoS. CF самостоятельно защищает ваш сайт от атак, не требуя никаких действий с вашей стороны. Если сайт настроен правильно, то его IP-адрес не виден злоумышленнику, а значит масштабная атака на него невозможна. CF выдерживал атаку мощностью 400 Gbit/s — это третья в мире по объему атака.

Конечно, если сайт располагается на одном IP-адресе с другими сайтам, то никакая защита не сработает, в случае атаки на эти сайты, если они не защищены. Это справедливо для служб разделяемого хостинга, когда на одном сервере, а может быть даже на одном IP-адресе размещаются сотни и тысячи сайтов.

В рамках этой статьи предполагается, что ваш сайт размещается на аппаратном сервере или VPS с выделенным IP, на котором нет других ресурсов.

Ускорение сайта. Используя CDN, вы приближаете трафик к абонентам. Если сайт использует много статических данных, таких как картинки, видео-файлы, архивы, Javascript, CSS, то все эти файлы будут оседать в CDN, что приведет к уменьшению времени загрузки страничек, снижению нагрузки на сервер, а значит большему удовлетворению пользователей.

Отказоустойчивая балансировка нагрузки на сайт. Если ваш сайт использует несколько серверов для обслуживания трафика, CF может самостоятельно распределять по ним нагрузку, используя либо динамическое обнаружение IP-адресов по CNAME, либо несколько записей типа A.

Ограничения и недостатки CDN

Стоит отметить, что наряду с вышеперечисленными достоинствами, использование CDN может быть сопряжено с ограничениями и со сложностями.

Ориентация на HTTP, HTTPS. CDN ориентированы на использование протоколов HTTP и HTTPS. Это означает, что их возможности по защите и ускорению могут быть использованы только там, где применяются эти протоколы. К примеру, вы не сможете защитить CDN сервер телефонии или сервер удаленного доступа.

Ориентация на стандартные порты. CDN требует, чтобы трафик отдавался вашим web-сервером с определенных портов. Например, CF говорит, что кэшируемый трафик должен отдаваться только с портов 80 и 443. А весь список разрешенных портов приведен на специальной странице.

Таким образом, например, вы не можете направить трафик с порта CF 443 на произвольный порт вашего сервера, только на 443. Впрочем есть такая штука как CF Spectrum — новый сервис CF, который работает как файрвол для серверов, которые находятся под управлением. Однако, Spectrum еще не распространен широко, поэтому мы его не обсуждаем.

Блокировка CF Роскомнадзором. Такие случаи в истории были. Сейчас РКН уже наученный и многократно битый палками за то, что он блокировал критически важные сервисы интернета, поэтому без разбора ведомство старается критическую инфраструктуру не блокировать, работая в режиме уведомления владельцев. Однако, такое может случиться. В этом случае вы должны оперативно снять ресурс с защиты CF и уже менее чем через 1 минут трафик пойдет напрямую на IP вашего сервера.

Именно для решения этой проблемы, помимо сертификата SSL, выдаваемый бесплатно CF, вам нужен свой сертификат SSL, который вы будете использовать, если вам придется выключить защиту в случае блокировки CF РКН.

Делегирование DNS на серверы CF. Это обязательное требование работы с CF. Вы должны делегировать обслуживание доменного имени, которое использоваться совместно с CF на DNS-серверы компании. Впрочем, этот фактор может быть как преимуществом, поскольку DNS-серверы CF являются одними из лучших в своем классе, так и недостатком, если требуется «хитрое» управление зоной.

Перенастройка HTTP-сервера и самого движка сайта. Когда сайт размещается за CDN, IP-адреса клиентов сайта уже не доступны непосредственно, поскольку источником запросов становится CDN. При этом CDN передает информацию о реальных источниках запросов посредством HTTP-заголовков X-Forwarded-For и CF-Connecting-IP. Если сайту требуется обрабатывать IP-адреса клиентов, он должен уметь извлекать информацию как в режиме без CDN, так и в режиме с CDN. К примеру, как делает приведенный ниже фрагмент кода на Python:

x_real_ip = request.headers.get("X-Real-IP")
x_forwarded_for = request.headers.get("X-Forwarded-For", "")
x_forwarded_for = x_forwarded_for.split(',')[0]

self.remote_ip = x_forwarded_for or x_real_ip or request.remote_ip

Подключение сайта к CloudFlare

Далее предполагается, что у вас уже есть рабочий сайт с SSL-сертификатом, который доступен в интернете. Процесс подключения сайта к CF довольно прост и состоит из следующих шагов:

  1. Регистрация в CloudFlare:
    • заводим учетную запись;
    • указываем доменное имя сайта, который будем защищать;
    • выбираем тарифный план (бесплатный план позволяет защищать только один домен).
  2. CF сканирует DNS-зону вашего домена и показывает вам записи, которые он решил добавить к себе в зону, если каких-то записей не хватает, можете добавить их на этом этапе сами;
  3. CF показывает на какие DNS-серверы необходимо перенести доменную зону (например, в нашем случае это — clyde.ns.cloudflare.com, janet.ns.cloudflare.com);
  4. вы входите в панель регистратора, у которого покупали доменное имя и меняете там обслуживающие зону DNS на те, которые предложил вам CF;
  5. ждете пока DNS-серверы зоны не изменятся на серверы CF (может занять до 24х часов).

После завершения делегирования ping до вашего сайта должен идти на серверы CF, а не на тот IP, где размещен сайт.

Снятие сайта с защиты

Снять сайт с защиты можно за 1 минуту. Входим в аккаунт и выбираем сайт (в нашем случае netpoint-dc.com):

Входим в управление DNS:

Меняем A и AAAA (если есть) записи нажатием на облачко с вида:

на вид:

Теперь CF будет только обслуживать DNS-запросы к вашему сайту, а трафик будет идти напрямую.

Балансировка трафика между несколькими серверами

Для балансировки нагрузки добавьте столько записей A, AAAA, сколько у вас имеется серверов с разными IP-адресами — по одной на каждый IP-адрес. Альтернативно CF позволяет использовать запись CNAME. В этом случае вы можете реализовать следующую стратегию с применением дополнительного домена. Потребуется две доменных зоны:

  • mysite.com, которая делегирована на CF;
  • *.myservice-site.com, которая обслуживается на вашем DNS;

Для обеих зон есть SSL-сертификаты, например от Let’s Encrypt. Для всех узлов, среди которых осуществляется балансировка, например,

  • a.myservice-site.com A.B.C.1
  • b.myservice-site.com A.B.C.2
  • c.myservice-site.com A.B.C.3

Создается по одной A (AAAA) записи:

  • pool.myservice-site.com A A.B.C.1
  • pool.myservice-site.com A A.B.C.2
  • pool.myservice-site.com A A.B.C.3

На локальном балансировщике mysite.com настраивается обычная балансировка по серверам (например, с помощью nginx), чтобы корректно обрабатывать трафик при отключении CF.

В это же время на CF настраивается только одна запись вида: mysite.com CNAME pool.myservice.com. CF умеет самостоятельно делать динамическое определение серверов, которые скрыты за CNAME. Таким образом, управляя A-записями на своем DNS вы сможете добавлять или удалять новые хосты из пула балансировки CF.

Если вам необходимо снять защиту CloudFlare, просто измените способ пропуска трафика для записи CNAME, как в примере, приведенном ранее, где используется обычная запись типа A, AAAA.

Таким образом, при использовании балансировки трафика, данная стратегия позволяет осуществлять большей частью на стороне своего DNS, при этом, если требуется отключить защиту, вы можете сделать это с помощью изменения режима обслуживания трафика для одной записи CNAME, а не для множества записей A, AAAA.

Заключение

В статье мы рассмотрели какие возможности дает CDN CloudFlare вашему сайту. Как начать пользоваться этой услугой совершенно бесплатно. Кроме того, мы рассмотрели механизм подключения, основанный на использовании CNAME, что подходит для сайтов с балансировкой нагрузки по нескольким серверам.