Хостинг сайтов с помощью 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
Итак туннель создан, теперь осталось направить в него запросы! Для этого есть два способа:
-
Используя приложение cloudflared. Просто используем команду
cloudflared tunnel route dns juevorg tst.juev.org
-
Самостоятельно создать CNAME записи, указывающие на домены вида
myuuid.cfargotunnel.com
. К примеру, можно создать CNAME запись наtst.juev.org
, который будет указывать наdbe98e0d-6435-4dff-af22-fc8205a0b1f1.cfargotunnel.com
Даем немного времени на обновление зоны и проверяем:
Все работает! Работает с малинки, к которой нет доступа из интернета.
Нужно помнить, что для каждого созданного ингресса необходимо будет использовать отдельной поддомен. Рекомендую так же обратить свое внимание на официальную документацию , в которой есть описание различных кейсов.