Запускаем собственный ngrok

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 = "awesomwuser@gmail.com"
  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 доступен ваш локальный сервис!

Оставить комментарий


Примечание - Вы можете использовать эти HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

* Copy This Password *

* Type Or Paste Password Here *

32 207 Spam Comments Blocked so far by Spam Free Wordpress