README | Документация на китайском
frp — это высокопроизводительное приложение для проксирования через внутреннюю сеть, поддерживающее протоколы tcp, udp, http и https.
frp всё ещё находится на ранней стадии разработки и не прошёл полного тестирования и проверки, поэтому не рекомендуется использовать его в производственной среде.
ветка master используется для выпуска стабильных версий, а ветка dev используется для разработки. Вы можете попробовать скачать последнюю версию для тестирования.
Текущий протокол взаимодействия может изменяться в любое время, и не гарантируется обратная совместимость. При обновлении до новой версии необходимо учитывать объявления и одновременно обновлять как серверную, так и клиентскую части.
В зависимости от операционной системы и архитектуры, скачайте последнюю версию программы с Release страницы.Установите frps и frps.ini на машину с публичным IP-адресом.
Установите frpc и frpc.ini на машину, находящуюся в локальной сети.
# frps.ini
[common]
bind_port = 7000
./frps -c ./frps.ini
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
./frpc -c ./frpc.ini
ssh -oPort=6000 test@x.x.x.x
Иногда требуется, чтобы другие люди могли получить доступ к веб-сервису, который вы разместили в локальной сети, через доменное имя. Однако, поскольку ваша локальная машина не имеет публичного IP-адреса, вы не можете привязать доменное имя к вашей локальной машине. С помощью frp вы можете реализовать эту функцию. В следующем примере показано, как это сделать для HTTP-сервиса. Для HTTPS-сервиса конфигурация аналогична, только vhost_http_port заменяется на vhost_https_port, а type устанавливается в https.
# frps.ini
[common]
bind_port = 7000
vhost_http_port = 8080
```2. Запустите frps:
`./frps -c ./frps.ini`
3. Измените файл frpc.ini, предполагая, что IP-адрес сервера frps равен x.x.x.x, local_port соответствует порту веб-сервиса на вашей локальной машине, и привяжите пользовательский домен `www.yourdomain.com`:
```ini
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
[web]
type = http
local_port = 80
custom_domains = www.yourdomain.com
./frpc -c ./frpc.ini
Разрешите доменное имя www.yourdomain.com
типа A на IP x.x.x.x
. Если сервер уже имеет соответствующее доменное имя, вы также можете разрешить запись CNAME на оригинальное доменное имя сервера.
Для доступа к веб-сервису, находящемуся на внутренней сети, используйте браузер для доступа по адресу http://www.yourdomain.com:8080
.
Запросы DNS обычно используют протокол UDP, frp поддерживает перенаправление внутренних сервисов UDP, конфигурация похожа на конфигурацию TCP.
# frps.ini
[common]
bind_port = 7000
./frps -c ./frps.ini
x.x.x.x
, перенаправьте запросы на UDP-сервер DNS Google 8.8.8.8
на порт 53:# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
[dns]
type = udp
local_ip = 8.8.8.8
local_port = 53
remote_port = 6000
./frpc -c ./frpc.ini
www.google.com
. dig @x.x.x.x -p 6000 www.google.com
Перенаправление Unix-доменных сокетов через TCP-порт (например, для связи с демоном Docker).
Шаги по развертыванию frps такие же, как и выше.
unix_domain_socket
, конфигурация:# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
[unix_domain_socket]
type = tcp
remote_port = 6000
plugin = unix_domain_socket
plugin_unix_path = /var/run/docker.sock
curl http://x.x.x.x:6000/version
Используя плагин static_file
, можно предоставить простой доступ к файлам через HTTP.
Шаги по развертыванию frps такие же, как и выше.
static_file
, конфигурация:# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
[test_static_file]
type = tcp
remote_port = 6000
plugin = static_file
# Файловая директория для доступа
plugin_local_path = /tmp/file
# Префикс, который будет удален из URL-адреса
plugin_strip_prefix = static
plugin_http_user = abc
plugin_http_passwd = abc
/tmp/file
, через браузер используйте адрес http://x.x.x.x:6000/static/
. Это потребует ввода заранее установленного имени пользователя и пароля.Для некоторых сервисов прямое подключение к ним из интернета может представлять угрозу безопасности.Использование типа прокси stcp (secret tcp) позволяет избежать доступа к сервису для всех, кто не запустил дополнительный frpc.
В следующем примере создается прокси для SSH-сервиса, доступ к которому возможен только для вас.
Установка frps аналогична предыдущим шагам.
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
[secret_ssh]
type = stcp
# Только пользователи с одинаковым sk могут получить доступ к сервису
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
[secret_ssh_visitor]
type = stcp
# Роль посетителя для stcp
role = visitor
# Имя прокси stcp, к которому вы хотите получить доступ
server_name = secret_ssh
sk = abcdefg
# Привязка локального порта для доступа к SSH-сервису
bind_addr = 127.0.0.1
bind_port = 6000
ssh -oPort=6000 test@127.0.0.1
Frp предлагает новый тип прокси xtcp для сценариев, где требуется передача большого объема данных без прохождения через сервер.
Использование похоже на stcp, требуется запуск frpc на обоих концах для установления прямого соединения.На данный момент этот тип находится в начальной стадии разработки и не может проксировать все типы NAT-устройств, поэтому вероятность успешного подключения низкая. В случае неудачи попробуйте использовать метод stcp.
bind_udp_port = 7001
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
[p2p_ssh]
type = xtcp
# Только пользователи с одинаковым sk могут получить доступ к сервису
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
[p2p_ssh_visitor]
type = xtcp
# Пользователь-посетитель
role = visitor
# Имя xtcp-агента, к которому нужно получить доступ
server_name = p2p_ssh
sk = abcdefg
# Бинд локального порта для доступа к SSH-сервису
bind_addr = 127.0.0.1
bind_port = 6000
ssh -oPort=6000 test@127.0.0.1
frpc включает встроенные плагины http proxy и socks5, которые позволяют другим машинам использовать сеть frpc для доступа к интернету.
Шаги по развертыванию frps аналогичны.
[common] server_addr = x.x.x.x server_port = 7000
[http_proxy] type = tcp remote_port = 6000 plugin = http_proxy
2. Установите в браузере http или socks5 прокси-адрес `x.x.x.x:6000`, чтобы использовать сеть frpc для доступа к интернету.
## Описание функций
### Конфигурационные файлы
Так как frp поддерживает множество функций и конфигурационных параметров, не все из которых описаны в документации, можно найти полные примеры конфигурационных файлов.
[Полный конфигурационный файл для frps](./conf/frps_full.ini)
[Полный конфигурационный файл для frpc](./conf/frpc_full.ini)
### Панель управления
Просмотр состояния frp и статистики прокси-соединений через браузер.
Необходимо указать порт для панели управления в frps.ini, чтобы включить эту функцию:
```ini
[common]
dashboard_port = 7500
# имя пользователя и пароль для панели управления, по умолчанию оба — admin
dashboard_user = admin
dashboard_pwd = admin
Откройте браузер и перейдите по адресу http://[server_addr]:7500
для доступа к панели управления, имя пользователя и пароль по умолчанию — admin
.
С версии v0.10.0 все конфигурации прокси-соединений полностью находятся на клиентской стороне (то есть в режиме привилегий в предыдущих версиях), аутентификация проходит успешно, если параметр token
в конфигурации common совпадает на серверной и клиентской сторонах.Важно отметить, что время на машине с frpc и машине с frps не должно отличаться более чем на 15 минут, так как временные метки используются для шифрования и аутентификации, чтобы предотвратить использование захваченных сообщений другими пользователями.
Это время ожидания можно изменить в конфигурационном файле с помощью параметра authentication_timeout
, измеряется в секундах, значение по умолчанию — 900 (15 минут). Если значение установлено в 0, frps не будет проверять временные метки сообщений аутентификации на соответствие времени ожидания.
Эти функции по умолчанию отключены и должны быть включены в конфигурационном файле frpc.ini для конкретного прокси-сервера. Сжатие данных выполняется с использованием алгоритма snappy:
# frpc.ini
[ssh]
type = tcp
local_port = 22
remote_port = 6000
use_encryption = true
use_compression = true
Если внутренняя сеть компании использует брандмауэр, который блокирует определенные протоколы, такие как SSH, то установка параметра use_encryption = true
позволит шифровать данные между frpc и frps, что предотвратит перехват трафика.
Если передаваемые данные имеют большой объем, то установка параметра use_compression = true
позволит сжать данные перед отправкой, что уменьшит сетевой трафик между frpc и frps и увеличит скорость передачи данных, но это также увеличит нагрузку на процессор.### Горячая загрузка конфигурационных файлов клиентом
При изменении конфигурации прокси-сервера в frpc.ini, можно использовать команду frpc reload
для динамической загрузки конфигурационного файла. Обновление обычно завершается в течение 10 секунд.
Для использования этой функции необходимо включить порт admin в frpc.ini для предоставления API-сервиса. Конфигурация выглядит следующим образом:
# frpc.ini
[common]
admin_addr = 127.0.0.1
admin_port = 7400
Затем выполните команду перезагрузки:
frpc reload -c ./frpc.ini
После некоторого времени клиент будет обновлять, создавать или удалять прокси-серверы в соответствии с новыми параметрами.
Важно отметить, что параметры в разделе [common], кроме start, в настоящее время не могут быть изменены.
Клиент frpc поддерживает просмотр состояния прокси-сервера с помощью команды frpc status -c ./frpc.ini
. Эта функция требует настройки порта admin в frpc.ini.
Для предотвращения злоупотребления портами можно вручную указать разрешенные порты в конфигурационном файле frps.ini с помощью параметра allow_ports
:
# frps.ini
[common]
allow_ports = 2000-3000, 3001, 3003, 4000-50000
Параметр allow_ports
позволяет указать конкретный порт или диапазон портов, разделенных запятыми, диапазоны портов разделены дефисом.### Многоканальное использование TCP
С версии v0.10.0 поддерживается многоканальное использование TCP между клиентом и сервером, что позволяет использовать одно соединение для нескольких пользовательских запросов, что снижает задержку подключения и уменьшает использование файловых дескрипторов, что позволяет frp поддерживать большее количество одновременных соединений.
Эта функция включена по умолчанию, но может быть отключена в конфигурационных файлах frps.ini и frpc.ini. Эти параметры должны быть одинаковыми на стороне сервера и клиента.
# frps.ini и frpc.ini
[common]
tcp_mux = false
С версии v0.12.0 поддерживается выбор протокола связи KCP, что значительно повышает эффективность передачи данных в условиях слабого интернет-соединения, однако увеличивает расход трафика.
Включение поддержки протокола KCP:
# frps.ini
[common]
bind_port = 7000
# KCP использует UDP-порт, который может совпадать с bind_port
kcp_bind_port = 7000
# frpc.ini
[common]
server_addr = x.x.x.x
# server_port должен совпадать с kcp_bind_port в frps.ini
server_port = 7000
protocol = kcp
```3. Используйте frp так же, как и раньше, но убедитесь, что доступен UDP-порт на соответствующих машинах.
### Подключение к пулу
По умолчанию, когда пользователь запрашивает соединение, frps запрашивает frpc для установления соединения с сервером. Если для определенного агента включен пул соединений, frp предварительно устанавливает определенное количество соединений с сервером. При каждом запросе пользователя из пула соединений выбирается одно соединение для связи с пользователем, что позволяет избежать ожидания установления соединения с сервером и передачи управления между frpc и frps.
Эта функция особенно полезна при множестве коротких соединений.
1. В файле frps.ini можно установить максимальное количество соединений в пуле для каждого агента, чтобы избежать перегрузки ресурсов. Клиентская конфигурация, превышающая это значение, будет автоматически скорректирована:
```ini
# frps.ini
[common]
max_pool_count = 5
# frpc.ini
[common]
pool_count = 1
[web] type = http local_port = 80 custom_domains = test.yourdomain.com host_header_rewrite = dev.yourdomain.com
Изначально поле `Host` в HTTP-запросе `test.yourdomain.com` будет заменено на `dev.yourdomain.com` при передаче на сервер.
### Получение настоящего IP-адреса пользователя
В настоящее время данная функция поддерживается только для прокси-серверов типа **http**. Настоящий IP-адрес пользователя можно получить из заголовков запроса `X-Forwarded-For` и `X-Real-IP`.
**Важно отметить, что в настоящий момент эти заголовки добавляются только в первом HTTP-запросе каждого соединения пользователя.**
### Защита вашего веб-сервиса паролем
Все клиенты используют общий порт HTTP-сервера frps, поэтому любой, кто знает ваш домен и URL, может получить доступ к вашему веб-сервису, развернутому в локальной сети. Однако в некоторых случаях требуется ограничить доступ только определенным пользователям.
Функция HTTP Basic Auth позволяет защищать ваш веб-сервис паролем, требуя от пользователей ввода имени пользователя и пароля для доступа к сервису.
Эта функция доступна только для прокси-серверов типа http и требует указания имени пользователя и пароля в конфигурации прокси frpc.
```ini
# frpc.ini
[web]
type = http
local_port = 80
custom_domains = test.yourdomain.com
http_user = abc
http_passwd = abc
При доступе через браузер по адресу http://test.yourdomain.com
потребуется ввести имя пользователя и пароль, указанные в конфигурации.
При использовании одного frps несколькими пользователями одновременно, использование вторичных доменов может быть удобнее.
Для включения этой функции необходимо настроить параметр `subdomain_host` в конфигурационном файле frps. Затем в конфигурации прокси frpc типа http и https можно указать параметр `subdomain`, а не `custom_domains`.
Для использования вторичных доменов необходимо настроить DNS-запись для `*.{subdomain_host}` на IP-адрес сервера frps. Затем пользователи могут указывать свои вторичные домены через параметр `subdomain` и использовать `{subdomain}.{subdomain_host}` для доступа к своим веб-сервисам.
```ini
# frps.ini
[common]
subdomain_host = frps.com
Настройте DNS-запись для *.frps.com
на IP-адрес сервера frps.
# frpc.ini
[web]
type = http
local_port = 80
subdomain = test
После успешного запуска frps и frpc, вы сможете получить доступ к веб-сервису в локальной сети по адресу test.frps.com
.
Важно отметить, что если в конфигурации frps указан параметр subdomain_host
, то в параметре custom_domains
не должны указываться поддомены или универсальные домены, относящиеся к subdomain_host
.
В одном прокси типа http или https параметры custom_domains
и subdomain
могут быть указаны одновременно.
locations
в конфигурационном файле (в настоящее время поддерживаются только максимальные префиксные совпадения, регулярные выражения будут поддерживаться в будущем). Например, если вы зададите locations = /news
, то все запросы, начинающиеся с /news
, будут перенаправлены на этот сервис.```ini[web01] type = http local_port = 80 custom_domains = web.yourdomain.com locations = /
[web02] type = http local_port = 81 custom_domains = web.yourdomain.com locations = /news,/about
После настройки конфигурации, все URL-запросы, начинающиеся с `/news` и `/about`, будут перенаправлены на `web02`, а все остальные запросы — на `web01`.
### Подключение через прокси к frps
В среде, где доступ к интернету возможен только через прокси, frpc поддерживает использование HTTP PROXY для связи с frps.
Эта функция может быть настроена через системную переменную окружения `HTTP_PROXY` или через параметр `http_proxy` в конфигурационном файле frpc.
Эта функция работает только при `protocol = tcp`.
```ini
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
http_proxy = http://user:pwd@192.168.1.128:8080
В конфигурационном файле frpc можно указать отображение нескольких портов, в настоящее время поддерживаются только типы tcp и udp.
Эта функция реализуется с помощью метки range:
, клиентская сторона анализирует конфигурацию внутри этой метки и разбивает её на несколько прокси, каждый из которых имеет имя, окончательное числом.
Например, чтобы отобразить локальные порты 6000-6005 и 6007 (всего 6 портов), можно использовать следующую конфигурацию:
# frpc.ini
[range:test_tcp]
type = tcp
local_ip = 127.0.0.1
local_port = 6000-6006,6007
remote_port = 6000-6006,6007
После успешного подключения будет создано 6 прокси, названных test_tcp_0
, test_tcp_1
... test_tcp_5
.
По умолчанию frpc перенаправляет запросы только на локальные TCP или UDP порты.
Режим плагинов предназначен для предоставления более разнообразных функций на клиентской стороне. Встроенные плагины включают `unix_domain_socket`, `http_proxy`, `socks5`, `static_file`. Подробные примеры использования см. в разделе [Примеры использования](#примеры-использования).
Плагин указывается через параметр `plugin`, конфигурационные параметры плагина начинаются с `plugin_`. После использования плагина параметры `local_ip` и `local_port` больше не требуются.
Пример использования плагина `http_proxy`:
```ini
# frpc.ini
[http_proxy]
type = tcp
remote_port = 6000
plugin = http_proxy
plugin_http_user = abc
plugin_http_passwd = abc
Параметры plugin_http_user
и plugin_http_passwd
являются опциональными параметрами конфигурации плагина http_proxy
.
В плане развития на будущие версии включены следующие функции и улучшения, порядок следования не имеет значения. Если у вас есть предложения по другим функциям, пожалуйста, оставьте их в разделе issues.
frp — это бесплатный и открытый проект, и мы приветствуем вклады в его развитие от любого желающего.* При возникновении проблем во время использования, пожалуйста, сообщите об этом в разделе issues.
Внимание: для вопросов, связанных с проектом, рекомендуется оставлять их в разделе issues, чтобы другие пользователи с аналогичными проблемами могли быстро найти решение, а также чтобы избежать повторного ответа на одни и те же вопросы.
Если вы считаете, что frp помог вам, мы будем рады вашему донату для поддержки долгосрочного развития проекта.
frp общение: 606194980 (QQ группа)
### Донат через PayPal
Рекомендуется для пользователей из-за рубежа использовать PayPal для доната на мой аккаунт fatedier@gmail.com.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )