Хостинг сайтов с помощью Cloudflare tunnel

Иногда возникают задачи по размещению серверов в частных сетях, которые по разным причинам могут быть недоступны в сети Интернет. Простейший пример – размещение общедоступного сайта в домашних условиях на Raspberry Pi.

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

При этом размещать свою dns-зону нужно будет в Cloudflare.

Подготовка к работе

Во-первых, на сервере необходимо установить cloudflared. В официальной документации все подробно описано, и сводиться к загрузке файла и его установки. Пример для Debian:

wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb 
sudo dpkg -i cloudflared-linux-amd64.deb

Для установки на малинке нужно загружать бинарник и размещать его в доступной директории, для примера:

wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm
sudo mv cloudlfared-linux-arm /usr/local/bin/cloudflared
sudo chmod +x /usr/local/bin/cloudflared

Во-вторых, проводим аутентификацию:

cloudflared tunnel login

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

Создание туннеля

Создаем туннель, для примера juevorg:

cloudflared tunnel create juevorg

После создания туннеля мы получаем информацию об ID созданного туннеля и о новом json-файле, содержащем данные аутентификации:

pi@raspberrypi:~$ cloudflared tunnel create juevorg
Tunnel credentials written to /home/pi/.cloudflared/dbe98e0d-6435-4dff-af22-fc8205a0b1f1.json. cloudflared chose this file based on where your origin certificate was found. Keep this file secret. To revoke these credentials, delete the tunnel.

Created tunnel juevorg with id dbe98e0d-6435-4dff-af22-fc8205a0b1f1

Уже сейчас можно проводить запуск туннеля, но мы создадим системный сервис для управления:

sudo mkdir -p /etc/cloudflared
sudo vim /etc/cloudflared/config.yml

Предполагается, что на данный момент времени у вас на сервере уже размещается веб-сервер, который работает, для примера, на 80 порту. В пустой файл вставляем содержимое, на основе полученной ранее информации об ID туннеля и имени файла:

tunnel: dbe98e0d-6435-4dff-af22-fc8205a0b1f1 
credentials-file: /home/pi/.cloudflared/dbe98e0d-6435-4dff-af22-fc8205a0b1f1.json
ingress:
  - hostname: tst.juev.org
    service: http://localhost:80
  - service: http_status:404

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

sudo cloudflared service install
sudo systemctl enable cloudflared
sudo systemctl start cloudflared

Для просмотра логов сервиса использовать команду:

sudo journalctl -u cloudflared

Можно так же проверить статус созданного туннеля через команду:

cloudflared tunnel info juevorg

Итак туннель создан, теперь осталось направить в него запросы! Для этого есть два способа:

  1. Используя приложение cloudflared. Просто используем команду

    cloudflared tunnel route dns juevorg tst.juev.org
    
  2. Самостоятельно создать CNAME записи, указывающие на домены вида myuuid.cfargotunnel.com. К примеру, можно создать CNAME запись на tst.juev.org, который будет указывать на dbe98e0d-6435-4dff-af22-fc8205a0b1f1.cfargotunnel.com

Даем немного времени на обновление зоны и проверяем:

Все работает! Работает с малинки, к которой нет доступа из интернета.

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