Содержание
ngrok действительно очень удобное решение, хотите ли вы показать запущенный локально сайт коллеге, или сделать локальный сервис доступным из сети интернет. Но бесплатный ngrok имеет существенные ограничения, а за цену платной версии $5 / месяц, можно арендовать целый сервер, запустить на нем бог знает что и использовать все его ресурсы.
Альтернативу ngrok я искал давно, пробовал localtunnel и другие варианты, но не так давно в дебрях lowendtalk.com наткнулся на упоминание идеального со всех сторон решения — FRP (fast reverse proxy).
Что нам потребуется:
- Найденный на lowendbox.com VPS с белым IP (несколько долларов в год) или быстрый дроплет от DigitalOcean за $5 и бонус $100 при регистрации по ссылке
- Любая ОС и архитектура, хотя я проверял на Debian 9 amd64
- FRP (fast reverse proxy)
- Traefik опционально, чтобы иметь бесплатный HTTPS от Let’s Encrypt
- Домен, опционально, и желательно управляемый через CloudFlare или другого провайдера, для https
Из коробки FRP может направлять запросы с выбранного внешнего порта на один из портов вашей машины. Если у вас есть собственный домен — то тогда можно направлять запросы с разных поддоменов на разные локальные сервисы. Если домен управляется через одного из поддерживаемых провайдеров — то можно еще и HTTPS прикурить. Лично я настоятельно рекомендую использовать CloudFlare, он самый быстрый и бесплатный. Именно его я буду описывать далее. Шаги, связанные с DNS и HTTPS национальные, и их можно пропускать.
FRP
Установка
wget https://github.com/fatedier/frp/releases/download/v0.30.0/frp_0.30.0_linux_amd64.tar.gz tar -xvf frp_0.30.0_linux_amd64.tar.gz sudo mv frp_0.30.0_linux_arm/frpc /usr/bin/ sudo mv frp_0.30.0_linux_arm/frps /usr/bin/ sudo mv frp_0.30.0_linux_arm/systemd/frp*.service /lib/systemd/system/ sudo systemctl enable frps
Для настройки нужно создать и отредактировать файл /etc/frp/frps.ini
[common] bind_port = 7000 kcp_bind_port = 7000 bind_udp_port = 7001 vhost_http_port = 8080 subdomain_host = awesomefrp.ru token=aWeS0m3fRp
(заменить awesomefrp.ru на свой домен, при наличии, а при отсутствии вообще не указывать)
bind_port — порт, на котором будет сервер будет слушать подключения клиентов
kcp_bind_port — порт для альтернативного UDP протокола, на которым меньше задержки но чуть больше трафик (опционально)
bind_udp_port — UDP порт для организации прямых peer-to-peer соединений между клиентам (опционально)
vhost_http_port — порт, на котором сервер будет слушать HTTP подключения извне и перенаправлять их клиентам (опционально)
subdomain_host — домен, чьи поддомены могут использовать клиенты (опционально)
token — пароль для доступа к серверу, любая строка, главное указать точно такую-же при настройке клиента
На этом настройка сервера завершена. Можно запустить его sudo systemctl enable frps
DNS
Если есть домен 2 уровня (а при цене в 150-200 рублей в год вполне можно его себе купить вместо чашки кофе или бутылки пива). То советую его добавить в CloudFlare.
После этого нужно получить API-токен управления DNS записями, необходимый для автоматической генерации wildcard SSL сертификатов.
В правом-верхнем меню CloudFlare нужно выбрать My Profile, затем API Tokens и Create Token.
Какие нужны права:
- Account / Account Settings (Read) — получение списка зон на аккаунте
- Zone / Zone (Read) — получение параметров зоны
- Zone / DNS (Edit) — добавление TXT записи домену, чтобы получить wildcard SSL сертификат
Ограничения, собственно, на аккаунт, на котором домен, и на сам домен. Полученный токен скопировать и записать в файл /etc/traefik/env (см. далее).
Traefik
Так как FRP слушает на порту 8080, нужно настроить проксирование запросов с 80 порта на 8080, а так же с 443 с использование шифрования.
Устанавливаем
wget https://github.com/containous/traefik/releases/download/v2.1.1/traefik_v2.1.1_linux_amd64.tar.gz tar -xvf traefik_v2.1.1_linux_amd64.tar.gz sudo mv traefik /usr/bin/
Описываем сервис /lib/systemd/system/traefik.service
[Unit] Description=Traefik is an open-source Edge Router that makes publishing your services a fun and easy experience [Service] EnvironmentFile=/etc/traefik/env ExecStart=/usr/bin/traefik Restart=always [Install] WantedBy=multi-user.target
Настраиваем общую часть /etc/traefik/traefik.toml
[entryPoints] [entryPoints.web] address = ":80" [entryPoints.websecure] address = ":443" [providers] [providers.file] filename = "/etc/traefik/dynamic_conf.toml" watch = true [certificatesResolvers.le.acme] email = "[email protected]" storage = "/var/acme.json" [certificatesResolvers.le.acme.dnsChallenge] provider = "cloudflare" resolvers = ["1.1.1.1:53", "1.0.0.1:53"]
Динамическая часть /etc/traefik/dynamic_conf.toml
[http.routers] [http.routers.frps] entryPoints = ["web"] rule = "Host(awesomefrp.ru
) || HostRegexp({subdomain:[a-z]+}.awesomefrp.ru
)" service = "frps" [http.routers.frps-secure] entryPoints = ["websecure"] rule = "Host(awesomefrp.ru
) || HostRegexp({subdomain:[a-z]+}.awesomefrp.ru
)" service = "frps" [http.routers.frps-secure.tls] certResolver = "le" # From static configuration [[http.routers.frps-secure.tls.domains]] main = "awesomefrp.ru" sans = ["*.awesomefrp.ru"] [http.services] [http.services.frps.loadBalancer] [[http.services.frps.loadBalancer.servers]] url = "http://127.0.0.1:8080/"
(заменить awesomefrp.ru на свой домен)
Записываем токен CloudFlare в /etc/traefik/env
CLOUDFLARE_DNS_API_TOKEN=AwEsOmE1234567890frp
(указать свой токен)
Запускаем
sudo systemctl enable traefik sudo systemctl start traefik sudo systemctl status traefik
Если повезло и все сделали правильно — можно пользоваться) Если нет — идти читать логи)
Подключаемся
Для примера скачиваю сборку под arm — для Raspberry PI 3
wget https://github.com/fatedier/frp/releases/download/v0.30.0/frp_0.30.0_linux_arm.tar.gz tar -xvf frp_0.30.0_linux_arm.tar.gz sudo mv frp_0.30.0_linux_arm/frpc /usr/bin/ sudo mv frp_0.30.0_linux_arm/frps /usr/bin/ sudo mv frp_0.30.0_linux_arm/systemd/frp*.service /lib/systemd/system/ sudo mkdir /etc/frp/
Настройки в файле /etc/frp/frpc.ini
[common] server_addr = awesomefrp.ru server_port = 7000 token=aWeS0m3fRp [web] type = http local_port = 8123 subdomain = ha
(заменить awesomefrp.ru на свой домен, token на свой)
Запускаем
systemctl enable frpc systemctl start frpc systemctl status frpc
Voi la, теперь по адресу https://ha.awesomefrp.ru доступен ваш локальный сервис!
0 Комментарии。