FRP (Fast Reverse Proxy) - обратный прокси-сервер
-
FRP — это быстрый обратный прокси-сервер, позволяющий сделать локальный сервер, расположенный за NAT или брандмауэром, доступным из интернета. В настоящее время он поддерживает протоколы TCP и UDP, а также HTTP и HTTPS, что позволяет перенаправлять запросы к внутренним сервисам через доменное имя.
- Что умеет: Пробрасывает TCP, UDP, HTTP и HTTPS.
- Веб-интерфейс: У него есть встроенный Dashboard (на порту 7500 по умолчанию), где можно смотреть состояние всех туннелей, трафик и ошибки.
- Плюс: Очень легкий, работает на одном конфиг-файле (
.toml). - Сложность: Низкая (похоже на настройку SSH, но удобнее).
-
Задача - сделать обратный туннель наподобие autossh, чтобы был постоянный доступ к серверу, у которого временно "слетел" внешний ip-адрес, или случайно заблокированы файрволом порты, необходимые для прямого доступа к серверу извне. При этом, исходящий трафик не заблокирован, то есть доступ в интернет у сервера есть.
Назовём этот сервер "Сервер А1".
Для этого нужен второй сервер, не имеющий проблем с прямым доступом. Этот сервер обозначим как "Сервер Б".
К серверу "Сервер Б" можно подключать не только "Сервер А1", но и "Сервер А2", "Сервер А3", и так далее.
Важный нюанс:
Когда вы подключаетесь через FRP, вы фактически идете по цепочке:Ваш компьютер -> Сервер Б -> Туннель FRP -> Сервер А1 (порт 22).
-
Пошаговая инструкция по установке и настройке FRP.
Шаг 1: Скачивание (на обоих серверах)
Внимание!
SSH-сервер должен быть установлен на всех серверах, если его нет, устанавливаем:sudo apt install openssh-server
Далее, скачиваем FRP.
FRP — это один архив с двумя файлами:
frps(server) иfrpc(client).- Зайдите на страницу релизов GitHub.
- Скопируйте ссылку на актуальную версию для Linux (обычно
_linux_amd64.tar.gz). - Скачайте и распакуйте на обоих серверах.
Пример:
# Переходим в домашнюю папку cd ~ # Скачиваем архив (версия 0.61.1 актуальна на текущий момент) wget https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_linux_amd64.tar.gz tar -xvzf frp_0.61.1_linux_amd64.tar.gz # Для удобства переименуем папку mv frp_0.61.1_linux_amd64 frp
Шаг 2: Настройка сервера "Сервер Б" (Стабильный) — FRPS
Здесь нам нужен файл конфигурации
frps.toml(Server).- Отредактируйте конфиг:
mcedit frps.toml - Вставь следующее:
bindPort = 7000 # Порт, по которому "Сервер А1" будет стучаться к "Сервер Б" [auth] token = "<секретный_токен_связи>" [webServer] addr = "0.0.0.0" port = 7500 user = "admin" password = "<пароль_админа>"Секретный токен связи можно создать командой
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1
- Запуск:
./frps -c frps.toml(Если всё ок, панель будет доступна по адресу
http://IP_SERVER_B:7500).
Шаг 3: Настройка "Сервер А1" (Проблемный) — FRPC
Здесь нам нужен файл
frpc.toml(Client).- Отредактируйте конфиг:
mcedit frpc.toml - Вставьте следующее:
serverAddr = "<IP_SERVER_B>" serverPort = 7000 [auth] token = "секретный_токен_связи" # Должен совпадать с тем, что на "Сервер Б" [[proxies]] name = "ssh-tunnel" # Имя выбирайте любое, чтобы отличать по именам сервера type = "tcp" localIP = "127.0.0.1" localPort = 22 # Локальный SSH remotePort = 2222 # Порт, который откроется на "Сервер Б" для входаВнимание!
localPort = 22 Это для стандартных случаев.
Посмотрите, на каком порту работает ssh вашего сервера, и вставьте нужный номер порта.- Запуск:
./frpc -c frpc.toml
Шаг 4: Автоматизация (Systemd)
Чтобы всё работало само после перезагрузки, создадим сервисы.
На Сервере Б (Server):
Создай файл/etc/systemd/system/frps.service:[Unit] Description=FRP Server After=network.target [Service] Type=simple User=USER Restart=on-failure RestartSec=5s ExecStart=/home/USER/frp/frps -c /home/USER/frp/frps.toml [Install] WantedBy=multi-user.targetВместо USER вставьте имя пользователя, от которого запускается FRPS
На Сервере А1 (Client):
Создайте файл/etc/systemd/system/frpc.service:[Unit] Description=FRP Client After=network-online.target [Service] Type=simple User=USER ExecStart=/home/USER/frp/frpc -c /home/USER/frp/frpc.toml Restart=always RestartSec=10s [Install] WantedBy=multi-user.targetВместо USER вставьте имя пользователя, от которого запускается FRPC
Не забудьте прописать полные пути к бинарникам и конфигам! После этого:
sudo systemctl daemon-reload sudo systemctl enable --now frps # На сервере "Сервер Б"sudo systemctl daemon-reload sudo systemctl enable --now frpc # На сервере "Сервер А1"
Как пользоваться?
Теперь, чтобы попасть на Сервер А1, вам достаточно подключиться к Серверу Б на порт 2222:
ssh user_A1@IP_SERVER_B -p 2222Внимание!
Вводите пароль именно для сервера "Сервер А1"Почему FRP лучше Autossh в данном конкретном случае?
- Авто-переподключение: FRP гораздо «умнее» восстанавливает сессии при смене IP.
- Веб-панель: Вы всегда видите в браузере, подключен ли "Сервер А1" прямо сейчас.
- Масштабируемость: Захотите пробросить веб-сайт или базу данных — просто добавляете пару строк в
frpc.tomlбез перезапуска SSH-процессов.
Чтобы зайти в веб-интерфейс:
Откройте в браузере http://<IP_СЕРВЕРА_Б>:7500. Вы увидите в разделе "Proxies -> TCP", что туннель ssh-tunnel активен (Online). -
Разные вопросы и нюансы
1. Как часто серверы «опрашивают» основной?
FRP работает не совсем как «опрос» (poll), а как постоянное TCP-соединение.
- Принцип: Клиент (
frpc) устанавливает соединение с сервером (frps) при старте и удерживает его открытым. Это не «запрос-ответ», а «труба», которая всегда открыта. - Heartbeat (пульс): Чтобы соединение не разрывалось из-за бездействия или NAT-таймаутов, внутри FRP есть механизм heartbeat. По умолчанию он отправляет маленькие контрольные пакеты примерно каждые 30 секунд. Это минимальная нагрузка на сеть — доли килобайт.
- Настройка: Вы можете регулировать это в
frpc.tomlпараметромheartbeatInterval(в секундах). Если сеть очень нестабильная, можно поставить меньше, если всё хорошо — оставить по умолчанию.
2. Сколько серверов можно «повесить» на один основной?
Здесь всё зависит от ресурсов Сервера Б (Стабильного). FRP крайне эффективен, так как написан на Go.
- Оперативная память (RAM): Один клиент
frpcпотребляет очень мало (от 5 до 20 МБ в зависимости от количества прокси). Если у вас 1 ГБ ОЗУ на Сервере Б, вы легко можете держать сотни (200–500+) подключенных серверов. - Процессор (CPU): Пока туннели простаивают, нагрузка близка к нулю. Она вырастает только тогда, когда по туннелю идет реальный трафик (например, вы копируете файлы через SSH или передаёте данные).
- Сетевой канал (Bandwidth): Это узкое место. Если 50 серверов начнут одновременно качать гигабайты данных через Сервер Б, он станет "бутылочным горлышком".
Есть ли предел?
Технического лимита внутри FRP практически нет, но есть ограничения операционной системы (Linux):
- Лимит файлов (File Descriptors): Каждое соединение — это открытый файл. В Linux по умолчанию лимит обычно 1024, но его легко поднять в настройках
ulimitили через системные настройкиsysctl. - Суммарная пропускная способность: Один мощный сервер (например, с 2–4 ядрами и 4 ГБ ОЗУ) легко "переварит" 1000+ туннелей в режиме ожидания.
Итого:
- Нагрузка на сеть: Мизерная (контрольные пакеты раз в 30 секунд).
- Масштабирование: Можно цеплять сотни клиентов.
- Совет: Если планируете более 50–100 серверов, обязательно добавьте в настройки
[common]параметрmaxPoolCountна Сервере Б, чтобы управлять пулом соединений и не забить все порты.
Если планируете подключать целую «ферму» из десятков серверов, лучше заранее выделить отдельный конфиг для каждого или использовать динамическую конфигурацию (когда
frpsберет настройки из БД или отдельной папки), чтобы не раздувать один файл до бесконечности. - Принцип: Клиент (