81. Ещё раз о Cloudflare. Раз и навсегда.


 В связи с многочисленными вопросами новичков и общей неразберихой в теме удалённого доступа было решено навести в этом деле порядок. Так что в этом материале постараемся объединить 3 уже имеющиеся на этом сайте практические статьи по теме.

Cloudflare — это сеть серверов по всему миру, к которой люди подключают свои сайты, чтобы увеличить скорость их загрузки и защитить от DDoS-атак. Также при помощи этого сервиса можно управлять DNS-записями на домене и перевести сайт на HTTPS. У них есть бесплатный тариф и несколько платных. В зависимости от тарифа, уровень защиты и возможности по ускорению сайта отличаются.

Есть ли минусы у подобного решения и стоит ли его использовать?

Про минусы можно сделать выводы после прочтения этой статьи на Хабре. А выводы, иметь или не иметь, каждый делает сам.


Cloudflare позволяет делать следующие вещи:

-  Шифровать трафик на основе сертификатов. Подключение на основе сертификатов ещё называют безопасным, или HTTPS.

- Привязать  настоящий айпи к доменному имени.

- Создать виртуальный "туннель" для доменного имени. С одной стороны которого, на входе будет стоять айпи адрес облачного сервиса(именно он будет виден всему интернету), а с другой - настоящий айпи нашего раутера. Тем самым этот сервис являет собой подобие использование абонентского ящика для обычной почты, вместо указания реального адреса.

- Реализация защитных функций от внешних атак.

    Клаудфлэр многопрофильный сервис с максимально гибкими настройками. Разные опции включаются на разных тарифных планах, но есть и бесплатные возможности в ограниченном количестве.
Дополнительно ко всему, этот сервис позволяет кэшировать у себя часть данных сайта, на который пытались зайти. Тем самым ускоряя его загрузку (оставляет на своих серверах копии элементов страницы, чтобы не подгружать их снова).
Так же доступен защитный сетевой экран (фаервол). В бесплатной версии возможность настройки до 5 правил. Для начала нам хватит и одного - блокировать весь входящий трафик, который не из списка интернет провайдеров. Ограничивая доступ по стране мы существенно снижаем возможность взлома, без нагрузки на своё сетевое оборудование и сам сервер.

Итак, наша задача: иметь возможность подключаться к виртуальным машинам/контейнерам и по возможности к другим устройствам в домашней сети извне. Т.е. снаружи, из интернета. Естественно максимально безопасным способом и без вреда для всей внутренней "кухни".

Решение в теории:
Для начала нужна входная точка в домашнюю сеть. Таким устройством может быть раутер, но эта вещь не уникальна для каждого и в большинстве домашних раутеров особо не разгуляешься в плане настроек и изменений, а особенно с учётом требований безопасности.
Поэтому необходима среда, в которой будет работать агент сервиса, поддерживающий с ним постоянное двустороннее соединение.
Как это работает:


1. Где-то в домашней сети установлен некий клиент (агент). Который одной рукой соединён с клаудфлэр и подключен к заранее настроенному туннелю, а другой рукой держится за локальную сеть и значит может видеть в ней все устройства. У туннеля есть адрес, привязанный к заранее приобретённому доменному имени, идентификатор для определения, и токен - некий пароль.
2. Заходим снаружи по адресу (саб)домена.
3. Запрос перенаправляется в интернет и ищет куда на самом деле "привязан" этот (саб)домен.
4. Благодаря предварительно сделанным настройкам доменного имени, запрос попадает на сервера Cloudflare.
5. А тот уже в свою очередь "знает" что к нему подключен агент с нашей домашней сети, который поддерживает с ним постоянное соединение. И запрос уходит этому агенту.
6. Агент получает и обрабатывает запрос, и переводит его на требуемый адрес во внутренней сети.
7. Если конечно устройство включено, настроено и работает нормально, то доступ к нему будет получен.


Что нужно чтобы начать всем этим пользоваться?
    Во первых надо обзавестись собственным доменом первого уровня. И чтобы была возможность поменять настройки адресации этого домена (NS record). На момент написания этого материала есть как минимум один регистратор, предлагающий домен второго уровня бесплатно на год.
Так что заходим на freenom.com , регистрируемся и оформляем домен. 

*UPD
Однако стоит помнить про бесплатный сыр и мышеловку. Уже меньше через месяц после выхода этой статьи в 2022 году, появилась информация о прекращении поддержки новых доменов первого уровня из тех зон, которые этот регистратор раздаёт бесплатно. Однако попытка не пытка.

(у регистратора namecheap.com можно купить домен в индийской зоне co.in за 29.08 $ на 10 лет) 


После приобретения домена необходимо зарегистрироваться на cloudflare.com и добавить его.




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

Завершаем настройки и ждём e-mail о подтверждении и активации домена на клаудфлэр.

Далее необходимо определиться со способом подключения к этому сервису и как будем управлять тем самым подключением. Есть следующие варианты:
  • Дополнение для Home Assistant (статья №13)
  • Служба на самом Proxmox (статья №46) (подходит и для совместимых ОС на всех устройствах)
  • Отдельный LXC контейнер (статья №74)
  • Установленный где угодно в вашей сети Docker контейнер
  • Служба на компьютере под управлением Windows/MAC.
У каждого из вариантов есть свои плюсы и минусы. Главное помнить пару простых условий:

 - Связь с сервисом должна работать постоянно чтобы обеспечить доступ снаружи (из интернета) во внутрь (к выбранным локальным ресурсам). А значит та среда, откуда будет производиться эта связь должна работать постоянно и быть постоянно на связи с внешним миром. Так что будет ли это домашний комп, старый ноутбук, или плата микрокомпьютера - решать вам.
- Безопасность. Т.к. предоставление доступа извне штука весьма щепетильная, то рекомендуется оставить за собой возможность максимально быстро и просто отключить этот доступ в случае угрозы. Желательно, не повредив при этом ничего другого в домашней лаборатории. Что и как именно вам легче отключить даже не находясь дома - решать тоже только вам.

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

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

Хотя настоящие любители острых ощущений, любящие ходить по краю, смотрят с презрением на такие ухищрения 😀

И первым делом настроим Web Application Firewall для всего своего домена. На портале в Cloudflare открываем настройки домена -> безопасность -> фаервол приложений и создаём новое правило


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

логика такого правила проста: если вызываемый адрес - наш домен и провайдер интернета откуда подключаются не указаны в списке, то тогда блокировать подключение.

Нажимаем на Edit expression и вставляем код с этой странички вместо того, что написано по умолчанию:
Не забываем отредактировать указанный домен на свой.

Здесь перечислены регистрационные номера IL провайдеров интернета, а так же 2 номера Google для будущей настройки доступа из системы Google Home и возможности управления голосом. Желающие пользоваться Яндекс Алисой или сервисами от Amazon, могут добавить ASN этих сервисов в список самостоятельно.

Теперь доступ из интернета на свой адрес https://chego-to-tam.com включая любой его поддомен будет работать только если исходящее соединение произведено с одного из указанных провайдеров.

Наверняка сразу у многих возникнет вопрос: "а что делать если я уехал за границу в командировку/на отдых и всё равно хочу иметь связь с домом?". Легитимно и вполне решаемо.
Заходим на сайте в логи фаервола, смотрим на  ASN номера последних попыток соединиться из страны нахождения и временно добавляем их в правило созданное выше. Главное не забыть их потом оттуда убрать. Ну и само собой, если находясь за границей в гостинице и будучи подключенным там к локальной сети огромен шанс что это будет один провайдер, а при попытке зайти с местной сим-карты или другой локации - провайдер будет другим. И поэтому придётся снова проверить логи и добавить ещё номера по необходимости. Это максимальное неудобство - вполне приемлемая цена за максимальную безопасность предоставляемую бесплатно.

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

Последнее что осталось сделать из подготовительной работы на сайте сервиса, это включить себе доступ к управлению туннелями. Дело в том, что это хоть и бесплатная функция (в базовой конфигурации), но её необходимо купить. Купить за 0 долларов и 0 центов. Да-да, именно так. И для покупки нужно внести данные платёжного средства которым может быть кредитная карточка или пэйпал. С этого платёжного средства будет снята сумма равная цене покупки - т.е. по факту снято ничего не будет. Но Cloudflare видимо хочет при любом шаге пользователя в сторону иметь возможность получить с него лишние пару центов. Но есть способ как этого избежать и о нём чуть позже.
 Поэтому, смело покупаем и оформляем сделку, и по
Для начала жмём на  Zero Trust и в открывшемся окне указываем имя своей команды, которая будет работать над проектом. Можно писать что угодно, главное чтобы удовлетворяло критериям сайта


на следующем этапе выбираем бесплатный пакет.


после чего переходим к оплате


На что сервис сообщает что к учётной записи не привязано средство оплаты и предлагает тут же исправить ситуацию.

Заполняем стандартные поля как для покупки в обычном интернет магазине.

И завершаем покупку убедившись что везде фигурирует цена выбранного пакета - 0.00$.
Как только откроется доступ к панели Zero Trust, возвращаемся назад в главную панель управления и в меню пользователя (вверху справа) переходим в пункт оплаты

Здесь, в пункте выбора средств оплаты будет хранится информация о введённой кредитной карте. Просто удаляем запись и забываем об этом недоразумении.

Основные приготовления со стороны сервиса закончены. Можно приступить к настройке внутри домашней лаборатории. 

Определились с выбором установки о котором было сказано ранее?
  • Дополнение для Home Assistant (статья №13)
  • Служба на самом Proxmox (статья №46) (подходит и для совместимых ОС на всех устройствах)
  • Отдельный LXC контейнер (статья №74)
Вот шаги для каждого из вариантов:

Дополнение для Home Assistant.

Для начала надо добавить несколько строк в основной файл конфигурации. Открываем в уже установленном текстовом редакторе файл configuration.yaml и Добавляем в него несколько строк.

http: use_x_forwarded_for: true trusted_proxies: - 172.30.33.0/24

Убеждаемся, глядя на зелёную галочку, что текст файла остался без ошибок и сохраняемся.
Теперь необходимо установить репозиторий дополнения. Заходим в настройки ХА -> дополнения -> магазин дополнений -> добавить репозитории. Добавляем репозиторий по ссылке:
https://github.com/brenner-tobias/ha-addons
Если дополнение не появится в списке установленных, то просто обновляем страницу. Теперь его можно установить.


Важно!!!
На этом этапе отключаем автозагрузку дополнения и пока что не запускаем его.
Теперь можно перезапустить сервер для применения изменений.

После загрузки системы заходим в конфигурацию установленного дополнения и в строке external homeassistant hostname указываем имя приобретённого домена. Строку Cloudflare Tunnel Name можно оставить без изменений или исправить на своё название (только латинскими буквами).


Возвращаемся на главный экран дополнения, включаем все настройки и запускаем его. После чего переходим на вкладку "журнал". Нас интересует строка с адресом, по которой активируется туннель между домашним сервером Home Assistant и сервисами Cloudflare. Копируем адрес, заходим на него из новой вкладки и отметив на страничке свой домен нажимаем Authorize.

Для более тонкой настройки дополнения и настроек доступа к другим хостам в локальной сети, рекомендуется почитать документацию дополнения. Там всё описано, перепечатывать и переводить нет смысла.

Служба на Proxmox.

Все действия будут выполняться в консоли проксмокса, так что не важно каким способом она будет открыта. Максимально удобный это подключение через ssh с помощью Putty.

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

Перейдём на сайт Cloudflare и выбрав свой домен, откроем настройки туннелей. Для этого в новом интерфейсе панели надо перейти в меню доступа и оттуда загрузить панель Zero Trust



Собственно здесь в разделе сетей переходим в туннели



И выбираем туннель Cloudflared





В открывшемся окне нажимаем на создание туннеля и зададим ему имя. Сохраняем настройки.
 

Теперь откроется окно выбора команды для установки агента


Выбираем операционную систему Дебиан, архитектуру процессора согласно тому, что установлен в железке, и копируем предложенную команду (она уже будет содержать в себе всю необходимую информацию для настройки, включая токен.

ВАЖНО!!!

Т.к. в проксмокс (скорее всего) вы уже работаете под пользователем root, то некоторые команды или их параметры должны быть написаны чуть иначе. Поэтому перед применением данной команды необходимо удалить из неё слово sudo*там, где оно встречается. Т.е. всего в двух местах.
*sudo - повышает права пользователя для выполнения тех или иных команд, на которые обычно у него прав нет. Пользователь root является глобальным администратором всей системы, обладающий максимальными правами на всё, поэтому повышать их просто некуда.

Копируем отредактированную команду в консоль (или редактируем её там же) и жмём Enter.

Если всё ок, то установка произойдёт очень быстро и не выдаст никаких сообщений об ошибке


Теперь это будет работать как служба внутри проксмокса. Осталось только сделать так, чтобы она автоматически перезапускалась при сбоях, и автоматически же запускалась при включении/перезапуске мини-пк.
Для этого выполняем команду systemctl enable --now cloudflared

После завершения установки необходимо в терминале выполнить команду:
cloudflared login
В ответ на неё, система выдаст ссылку, зайдя по которой туннель будет полностью активирован и готов к работе после нажатия на кнопку авторизации.
 
 


Возвращаемся в настройки туннелей Cloudflare и нажимаем далее, переходя к следующему разделу


Допустим необходимо дать снаружи доступ ко всему проксмоксу.
Допустим что из внутренней сети он доступен по адресу https://1.2.3.4:8006

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

Для обеспечения доступа к Proxmox и Home Assistant также необходимо в дополнительных настройках приложения включить отмену проверки сертификатов и включить поддержку HTTP2.


Так же, в случае с ХА необходимо добавить одну строку в файл configuration.yaml
В раздел http подключений, к доверенным сетям прокси серверов так же добавить всю домашнюю сеть. Не забываем сохранить файл и перезагрузить настройки с предварительной проверкой конфигурации.

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

После сохранения настроек туннеля, видно что он работает должным образом и запись сабдомена создана.


При попытке зайти на новый адрес, должен открыться соответствующий ресурс в домашней сети.

Если необходимо добавить ещё одно имя/устройство, то нажимаем на конфигурацию уже имеющегося туннеля, переходим на вкладку имён хостов и добавляем новую запись.

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


На главной странице панели идём в настройки DNS и выбрав для редактирования нужную запись - удаляем её.

Что имеем в итоге?
На железке крутятся разные виртуалки. С этой же железки к ним есть и доступ для управления, и она же ответственна за связь этих виртуалок с внешним миром.

На этом всё. Огромная благодарность XTarget за помощь в создании данной статьи.

UPD.
Иногда в панели управления туннелями можно увидеть следующее сообщение:

Оно говорит о том, что версия клиентской службы установленная в проксмоксе устарела и требует обновления.

Для решения этой задачи нужно добавить ключи подтверждения для обновления с доверенного источника и адрес самого источника, в систему.
Делается это с помощью следующих команд:
Сначала создадим директорию для ключа: mkdir -p --mode=0755 /usr/share/keyrings

Теперь импортируем ключ в соответствующую директорию: curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null

На этом этапе можно добавить адрес откуда будет обновляться компонент Cloudflare в системный список обновления компонентов:
Debian Bullseye (stable)
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared bullseye main' | tee /etc/apt/sources.list.d/cloudflared.list
Debian Bookworm (testing)
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared bookworm main' | tee /etc/apt/sources.list.d/cloudflared.list

Теперь можно запустить команду для проверки и установки обновлённых компонентов: apt update && apt upgrade -y



Как видно, после запуска команды, система проверяет источники откуда тянуть обновления, и среди них так же появились сервера Cloudflare.
Обновление найдено, скачано, распаковано и установлено. Однако, если проверить панель управления туннелями, то сообщение об обновлении всё ещё будет присутствовать. Это потому, что для применения изменений после обновления, нужно либо перезапустить проксмокс, либо перезапустить только саму службу Cloudflare.
Конечно второе сделать проще и быстрее, поэтому запускаем команду: systemctl restart cloudflared и обновляем страничку с настройками туннелей.


Видно что номер версии изменился и пропало сообщение о необходимости обновления.

Отдельный LXC контейнер

Для установки нового LXC, запустим в консоли проксмокса следующий скрипт:
bash -c "$(wget -qLO - https://github.com/community-scripts/ProxmoxVE/raw/main/ct/cloudflared.sh)"
Он создаст контейнер основанный на Debian с 512мб оперативной памяти,  2Гб жёсткого диска и 1 процессором с одним ядром.
Если до этого был настроен сервис на проксмоксе и есть желание его отключить,  то пока открыта нужная консоль, остановим его. Делается это командой:
systemctl stop cloudflared.service
Теперь отключить автозапуск.
systemctl disable cloudflared.service

Подготовительные работы.

Теперь переходим к новому контейнеру и работаем только в нём.
Если есть желание заходить по SSH в систему под рутом (с пользователем root), то надо это разрешить в конфиг файле. Выполняем команду
nano /etc/ssh/sshd_config
И ищем строку #PermitRootLogin prohibit-password
После чего меняем её на
PermitRootLogin yes
И перезапускаем службу SSH
service ssh restart

Контейнер работает с автологином. Если необходимо удостовериться какой пароль используется для пользователя root, то его можно сбросить командой 
passwd

Чтобы убедиться что временная зона настроена корректно, можно выполнить команду 
timedatectl

Чтобы узнать айпи и мак адреса нового LXC, выполним
ip a
и сделаем необходимую привязку на DHCP сервере.

Настройка cloudflared.

Перейдём непосредственно к настройке.

Для начала установим ключи репозитория
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null

И укажем их в файлах для обновлениия
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared bookworm main' | tee /etc/apt/sources.list.d/cloudflared.list


Перейдём на сайт Cloudflare и выбрав свой домен, откроем настройки туннелей. Для этого в новом интерфейсе панели надо перейти в меню доступа и оттуда загрузить панель Zero Trust



Собственно здесь в разделе сетей переходим в туннели



И выбираем туннель Cloudflared


В открывшемся окне нажимаем на создание туннеля и зададим ему имя. Сохраняем настройки.
 


Теперь открываем панель управления своим туннелем (на сайте Cloudflare) и копируем код из раздела установки сервиса. Если работаем из под пользователя root, то тогда копируем БЕЗ SUDO!!!


После того как служба успешно установлена


Добавим её в автозапуск командой
systemctl enable --now cloudflared

После завершения установки необходимо в терминале выполнить команду:
cloudflared login
В ответ на неё, система выдаст ссылку, зайдя по которой туннель будет полностью активирован и готов к работе после нажатия на кнопку авторизации.
 
 


Возвращаемся в настройки туннелей Cloudflare и нажимаем далее, переходя к следующему разделу


Допустим необходимо дать снаружи доступ ко всему проксмоксу.
Допустим что из внутренней сети он доступен по адресу https://1.2.3.4:8006

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

Соответственно если Хоум Ассистант доступен по адресу http://1.2.3.5:8123
То добавляем новую запись, указываем протокол и адрес 

Для обеспечения доступа к Proxmox и Home Assistant также необходимо в дополнительных настройках приложения включить отмену проверки сертификатов и включить поддержку HTTP2.


Так же, в случае с ХА необходимо добавить одну строку в файл configuration.yaml
В раздел http подключений, к доверенным сетям прокси серверов так же добавить всю домашнюю сеть. Не забываем сохранить файл и перезагрузить настройки с предварительной проверкой конфигурации.

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

После сохранения настроек туннеля, видно что он работает должным образом и запись сабдомена создана.


При попытке зайти на новый адрес, должен открыться соответствующий ресурс в домашней сети.

Если необходимо добавить ещё одно имя/устройство, то нажимаем на конфигурацию уже имеющегося туннеля, переходим на вкладку имён хостов и добавляем новую запись.

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


На главной странице панели идём в настройки DNS и выбрав для редактирования нужную запись - удаляем её.

Чтобы настроить автоматические обновления контейнера:
Открываем на редактирование файл планировщика задач с помощью команды crontab -e.
указываем когда и что запускать:
* * * * * apt update -y && apt dist-upgrade -y && apt autoremove -y && apt autoclean -y && systemctl restart cloudflared.service
Формат записей crontab выглядит следующим образом:
"минуты" "часы (в формате указанном в настройках системы)" "день месяца" "месяц" "день недели" "команда".
Т.е. запись вида
44 19 * * * apt update -y && apt dist-upgrade -y && apt autoremove -y && apt autoclean -y && systemctl restart cloudflared.service
будет запускать всё ту же команду каждый день в 7 часов и 44 минуты каждый вечер.

Не рекомендуется проверять и ставить компоненты как во время бэкапа системы, так и во время выключения.
  1. Если в проксмоксе настроены бэкапы на определённый час и занимают Х времени, то лучше не выбирать этот временной промежуток для проверки обновлений контейнера.
  2. Так же, если в прокрсмоксе настроена автоматическая перезагрузка по определённым дням недели, то логично предположить что именно в это временное окно не стоит планировать обновления.
  3. Т.к. после проверки обновления происходит перезапуск службы, то важно чтобы этот процесс не мешал ежедневной работе.
Поэтому учитывая эти пункты, вместо первой звёздочки указываем минуты, а вместо второй - часы. Это и будет время, в которое будет срабатывать задача планировщика. Т.е. раз в сутки.

Осталось добавить новый контейнер в соответствующий набор резервного копирования, и на этом настройка будет полностью закончена

Комментарии