frp — это утилита для создания обратных туннелей. Она позволяет получить доступ к локальному ресурсу за NAT через промежуточный сервер.
Многие знают про существование сервисов типа ngrok и localtunnel, которые позволяют делать нечто подобное. У них есть бесплатные тарифные планы, которые имеют ограничения по ежемесячному трафику и количеству подключений. Поэтому (и не только) в ряде случаев использование self-hosted-решений, таких как frp
, оказывается более предпочтительным.
Установка
Установка ручками
Так как frp
написана на языке программирования Go, то для «установки» достаточно распаковать архив, содержащий исполняемые файлы. Они тащат с собой рантайм, а поэтому не требуют каких-либо системных зависимостей.
Скачиваем последнюю версию:
wget https://github.com/fatedier/frp/releases/download/v0.59.0/frp_0.59.0_linux_amd64.tar.gz
Распакуем архив:
tar -xvf frp_0.59.0_linux_amd64.tar.gz
В распакованной директории будут два исполняемых файла: frps
(сервер) и frpc
(клиент). Переместим их в /usr/local/bin
:
mv frp_0.59.0_linux_amd64/frp{s,c} /usr/local/bin
Arch Linux:
# сервер
yay -S frps-bin
# клиень
yay -S frpc-bin
NixOS:
nix-env -iA nixpkgs.frp
Настройки сервера
Создайте конфигурационный файл для сервера frps
. Например, /etc/frps.ini
, он должен содержать что-то типа этого:
[common]
bind_port = 7000
# Доп. настройки, которые могут быть полезны
# Токен доступа для аутентификации клиентов
# token = <your_secure_token>
# Ограничение скорости до 10 МБ/с для каждого соединения
bandwidth_limit = 10MB
# можно так же запустить веб-админку
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin123
Этот файл конфигурации указывает серверу frps
прослушивать порт 7000 для входящих соединений. На 7500 порту будет висеть Dashboard, где можно посмотреть, например, трафик.
Далее настройте systemd для автоматического запуска сервера frps
. Пример содержимого файла /etc/systemd/system/frps.service
:
[Unit]
Description=FRP Server Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/frps -c /etc/frps.ini
Restart=on-failure
RestartSec=15s
Для активации и запуска сервиса выполните:
systemctl daemon-reload
systemctl enable --now frps
Проверим статус сервиса:
systemctl status frps
Если не знаем или не помним ip сервера:
curl -s https://ifconfig.me
curl -s https://api.ipify.org
curl -s https://ipinfo.io
Настройка клиента
Создайте конфигурационный файл для frps
:
/path/to/frpc.ini
# Основные настройки
[common]
server_addr = <server_ip>
server_port = 7000
# ssh - это имя, которое выдумываешь сам и таких пользовательских сегментов может быть сколько угодно
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 10022
Замените <server_ip>
на IP-адрес вашего сервера. Эта конфигурация позволяет пробросить локальный SSH-сервер (порт 22) на внешний порт 10022 на сервере.
Запустите клиент frp
с указанной конфигурацией:
frpc -c /path/to/frpc.ini
Использование конфига аналогично запуску такой команды:
frpc tcp -n 'ssh' -s <server_ip> -P 7000 --local_ip=127.0.0.1 --local_port=22 --remote_port=10022
Проверка
После этого можно подключиться к домашнему ПК через SSH с использованием команды:
ssh -p 10022 user@server_ip