p2p сервис. Публичный туннель в локальную сеть

Возникла задача выводить около 200 устройств во внешний мир. Проблема, что все устройства за NAT и провайдер не дает внешний IP

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

Решение оказалось простое, хоть и с китайским веб-интерфейсом…

Сервер

Скачивание нужных файлов

  • Скачиваем frp. Благо он доступен для широкого круга платформ
    Поскольку настраиваем сначала серверную часть, нужно лишь 2 файла с архива: frps и frps.toml
    На сервере создал директорию frps в root. Вот полный путь: /root/frps. Туда закидаем два файла о которых шла речь выше
  • Скачиваем панель управления сервером. Репозиторий архивный, потому сделал себе копию
    Создаем директорию в /root/frps-panel. В нее закидаем файлы, что скачали выше (для своей архитектуры)

Настройка файлов конфигурации

  • Для директорий даем права 0777
  • Теперь нужно настроить сервер. Вся конфигурация находится в файле /root/frps/frps.toml. Удалите текущие содержимое и вставьте то что ниже
#Сервер доступен с интернета
bindAddr = "0.0.0.0"
#Работает на порту 7000
bindPort = 7000

#Включаем доступ по веб
webServer.addr = "0.0.0.0"
#Порт для управления
webServer.port = 7500
#Логин
webServer.user = "admin"
#Пароль
webServer.password = "admin"

#Добавляем плагин для управления веб-интерфейсом
[[httpPlugins]]
name = "frps-panel"
addr = "127.0.0.1:7200"
path = "/handler"
ops = ["Login","NewWorkConn","NewUserConn","NewProxy","Ping"]

Полный пример настройки сервера. Будьте внимательны, поскольку это может конфликтовать с китайской панелью управления https://github.com/fatedier/frp/blob/dev/conf/frps_full_example.toml

  • Дальше настраиваем панель управления. В файле /root/frps-panel/frps-panel.toml. Замените содержимое на то что ниже
    Немного логики работы. Панель по API подключается к серверу и далее им управляет
    admin_user, admin_pwd — это данные для входа в панель управления
    dashboard_user, dashboard_pwd — это данные сервера (его API)
# basic options
[common]
# frps panel config info
plugin_addr = "0.0.0.0"
plugin_port = 7200
admin_user = "admin"
admin_pwd = "admin"
# specified login state keep time
admin_keep_time = 0

# enable tls
tls_mode = false
#tls_cert_file = "cert.crt"
#tls_key_file = "cert.key"

# frp dashboard info
dashboard_addr = "0.0.0.0"
dashboard_port = 7500
dashboard_user = "admin"
dashboard_pwd = "admin"

Проверка работы

  • Теперь проверяем что все работает в тестовом режиме
    Запускаем команду cd /root/frps; ./frps -c ./frps.toml
    В браузере вводим IP сервера и порт 7500, в результате должны увидеть запрос логин/пароля.
    По умолчанию это admin / admin
  • Теперь запускаем панель управления
    Запускаем команду cd /root/frps-panel; ./frps-panel -c ./frps-panel.toml
    В браузере вводим IP сервера и порт 7200, в результате должны увидеть запрос логин/пароля.
    По умолчанию это admin / admin
    Интерфейс будет китайский, но переводчик неплохо решает проблему. Да и не так часто вы будете обращаться до этой панели

Автоматический запуск

  • Если все работает, пора заставить запускать сервер автоматически как демон
    Переходим в директорию /etc/systemd/system/
    Создаем файл frps.service со следующим содержимым
[Unit]
Description = frp multiuser service
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# config of frps.toml,you should change the file path
Environment=FRPS_OPTS="-c /root/frps/frps.toml"
# command of run frps,you should change the file path
ExecStart = /root/frps/frps $FRPS_OPTS

[Install]
WantedBy = multi-user.target

Далее
systemctl daemon-reload
service frps start

В этой же директории создаем файл frps-panel.service со следующим содержимым

[Unit]
Description = frp multiuser service
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# config of frps-panel.toml,you should change the file path
Environment=FRPS_PANEL_OPTS="-c /root/frps-panel/frps-panel.toml"
# command of run frps-panel,you should change the file path
ExecStart = /root/frps-panel/frps-panel $FRPS_PANEL_OPTS

[Install]
WantedBy = multi-user.target

Далее
systemctl daemon-reload
service frps-panel start

Перепроверяем что службы стартанули и все нормально
service frps status
service frps-panel status

Создаем клиента

Клиент

  • Скачиваем frp
  • Поскольку настраиваем сначала клиентскую часть, нужно лишь 2 файла с архива: frp и frp.toml
  • На клиенте создал директорию frp в root. Вот полный путь: /root/frp. Туда закидаем два файла о которых шла речь выше
  • Для директорий даем права 0777
  • Теперь нужно настроить сервер. Вся конфигурация находится в файле /root/frp/frp.toml. Удалите текущие содержимое и вставьте то что ниже
#IP центрального сервера
serverAddr = "46.217.55.85"
serverPort = 7000

#Веб-интерфейс на клиенте
webServer.addr = "0.0.0.0"
webServer.port = 7400
webServer.user = "admin"
webServer.password = "admin"

#Идентификация пользователя
user = "123"
[metadatas]
token = "123"

#Прокидаем локальный порт 5001. На сервере девайс будет доступен по порту 12001
[[proxies]]
name = "syno"
type = "tcp"
localIP = "192.168.88.5"
localPort = 5001
remotePort = 12001

[[proxies]]
name = "myserver"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80
remotePort = 12000

Если хотите больше вариантов проксирования https://github.com/fatedier/frp/blob/dev/conf/frpc_full_example.toml

  • Теперь проверяем что все работает в тестовом режиме
    Запускаем команду cd /root/frp; ./frp -c ./frp.toml
    В браузере вводим IP сервера и порт 7400, в результате должны увидеть запрос логин/пароля.
    По умолчанию это admin / admin
  • Если все работает, пора заставить запускать сервер автоматически как демон
  • Переходим в директорию /etc/systemd/system/
  • Создаем файл frp.service со следующим содержимым
[Unit]
Description = frp multiuser service
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# config of frp.toml,you should change the file path
Environment=frp_OPTS="-c /root/frp/frp.toml"
# command of run frp,you should change the file path
ExecStart = /root/frp/frp $frp_OPTS

[Install]
WantedBy = multi-user.target

Далее
systemctl daemon-reload
service frp start

Перепроверяем что службы стартанули и все нормально
service frp status

Наверх