ЧИТАЙТЕ | 中文文档
frp — это проект с открытым исходным кодом, постоянное развитие которого стало возможным исключительно благодаря поддержке наших замечательных спонсоров. Если вы хотите присоединиться к ним, пожалуйста, рассмотрите возможность спонсирования разработки frp.
frp — это быстрый обратный прокси-сервер, который позволяет предоставить доступ к Интернету локальному серверу, расположенному за NAT или брандмауэром. В настоящее время он поддерживает TCP и UDP , а также протоколы HTTP и HTTPS , что позволяет перенаправлять запросы внутренним службам через имя домена.
frp также предлагает режим подключения P2P.
Статус разработки
О версии 2
Архитектура
Пример использования
Доступ к вашему компьютеру в сети LAN через SSH
Несколько служб SSH, использующих один и тот же порт
Доступ к внутренним веб-службам с помощью пользовательских доменов в локальной сети
Пересылать запросы DNS-запросов
Переадресация доменного сокета Unix
Предоставьте простой файловый сервер HTTP
Включите HTTPS для локальной службы HTTP(S)
Предоставьте свой сервис конфиденциально
P2P-режим
Функции
HTTP X-перенаправление-для
Прокси-протокол
Для каждого прокси
ТЛС
Аутентификация токена
Аутентификация OIDC
Прометей
Файлы конфигурации
Использование переменных среды
Разделение конфигураций на разные файлы
Панель управления сервером
Пользовательский интерфейс администратора клиента
Монитор
Аутентификация клиента
Шифрование и сжатие
Конфигурация frpc с горячей перезагрузкой
Получить статус прокси от клиента
Разрешение только определенных портов на сервере
Повторное использование портов
Ограничение пропускной способности
Мультиплексирование TCP-потоков
Поддержка протокола KCP
Поддержка протокола QUIC
Пул соединений
Балансировка нагрузки
Проверка работоспособности службы
Переписывание заголовка хоста HTTP
Установка других заголовков HTTP
Получите настоящий IP
Требовать базовую аутентификацию HTTP (пароль) для веб-служб
Пользовательские имена поддоменов
URL-маршрутизация
Мультиплексирование TCP-портов
Подключение к frps через ПРОКСИ
Сопоставление диапазона портов
Клиентские плагины
Плагины управления сервером
SSH-туннельный шлюз
Связанные проекты
Содействие
Пожертвование
Спонсоры GitHub
PayPal
frp в настоящее время находится в стадии разработки. Вы можете попробовать последнюю версию выпуска в master
ветке или использовать ветку dev
для доступа к версии, которая в настоящее время находится в разработке.
В настоящее время мы работаем над версией 2 и пытаемся выполнить некоторый рефакторинг и улучшения кода. Однако обратите внимание, что он не будет совместим с версией 1.
Мы перейдем с версии 0 на версию 1 в подходящее время и будем принимать только исправления ошибок и улучшения, а не запросы на крупные функции.
Сложность и сложность версии v2 намного выше, чем ожидалось. Я могу работать над его разработкой только в разрозненные периоды времени, а постоянные перерывы существенно снижают производительность. Учитывая эту ситуацию, мы продолжим оптимизировать и совершенствовать текущую версию, пока у нас не появится больше свободного времени для капитального ремонта версии.
Концепция v2 основана на моем многолетнем опыте и размышлениях в облачной области, особенно в K8s и ServiceMesh. Его ядром является модернизированный четырехслойный и семислойный прокси, аналогичный envoy. Этот прокси сам по себе обладает высокой масштабируемостью и не только способен реализовать функциональность проникновения во внутреннюю сеть, но также применим к различным другим доменам. Основываясь на этом хорошо масштабируемом ядре, мы стремимся реализовать все возможности frp v1, а также элегантно реализовать функции, которые ранее были недоступны или трудно реализовать. Кроме того, мы будем поддерживать эффективные возможности разработки и итерации.
Кроме того, я предполагаю, что frp сам по себе станет высокорасширяемой системой и платформой, подобно тому, как мы можем предоставить ряд возможностей расширения на основе K8s. В K8s мы можем настроить разработку в соответствии с потребностями предприятия, используя такие функции, как CRD, режим контроллера, веб-перехватчик, CSI и CNI. В frp v1 мы представили концепцию серверных плагинов, которая реализовала некоторую базовую расширяемость. Однако он основан на простом протоколе HTTP и требует от пользователей запускать независимые процессы и управлять ими самостоятельно. Этот подход далек от гибкости и удобства, а требования реального мира сильно различаются. Нереалистично ожидать, что некоммерческий проект с открытым исходным кодом, поддерживаемый несколькими людьми, сможет удовлетворить потребности каждого.
Наконец, мы признаем, что текущий дизайн таких модулей, как управление конфигурацией, проверка разрешений, управление сертификатами и управление API, недостаточно современен. Хотя мы можем провести некоторые оптимизации в версии v1, обеспечение совместимости остается сложной проблемой, решение которой требует значительных усилий.
Мы искренне ценим вашу поддержку frp.
Для начала загрузите последнюю версию программы для вашей операционной системы и архитектуры со страницы «Выпуск».
Затем поместите двоичный файл frps
и файл конфигурации сервера на сервер A, который имеет общедоступный IP-адрес.
Наконец, поместите двоичный файл frpc
и файл конфигурации клиента на сервер B, который расположен в локальной сети, к которой нет прямого доступа из общедоступного Интернета.
Некоторые антивирусы неправильно помечают frpc как вредоносное ПО и удаляют его. Это связано с тем, что frp является сетевым инструментом, способным создавать обратные прокси. Антивирусы иногда помечают обратные прокси-серверы из-за их способности обходить ограничения портов брандмауэра. Если вы используете антивирус, вам может потребоваться внести в белый список/исключить frpc в настройках антивируса, чтобы избежать случайного карантина/удаления. Дополнительные сведения см. в выпуске 3637.
Измените frps.toml
на сервере A, установив bindPort
для подключения клиентов frp:
# frps.tomlbindPort = 7000
Запускаем frps
на сервере А:
./frps -c ./frps.toml
Измените frpc.toml
на сервере B и установите в поле serverAddr
общедоступный IP-адрес вашего сервера frps:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[proxies]]name = "ssh"type = "tcp"localIP = "127.0.0.1"localPort = 22remotePort = 6000
Обратите внимание, что localPort
(прослушиваемый на клиенте) и remotePort
(открытый на сервере) используются для входящего и исходящего трафика системы frp, а serverPort
используется для связи между frps и frpc.
Запустите frpc
на сервере B:
./frpc -c ./frpc.toml
Чтобы получить доступ к серверу B с другого компьютера через сервер A через SSH (при условии, что имя пользователя — test
), используйте следующую команду:
ssh -oPort=6000 test@xxxx
В этом примере реализовано несколько служб SSH, предоставляемых через один и тот же порт, с использованием прокси-сервера типа tcpmux. Аналогичным образом, если клиент поддерживает метод подключения прокси-сервера HTTP Connect, таким образом можно обеспечить повторное использование портов.
Разверните frps на машине с общедоступным IP-адресом и измените файл frps.toml. Вот упрощенная конфигурация:
BindPort = 7000tcpmuxHTTPConnectPort = 5002
Разверните frpc на внутренней машине A со следующей конфигурацией:
serverAddr = "xxxx"serverPort = 7000[[proxies]]name = "ssh1"type = "tcpmux"multiplexer = "httpconnect"customDomains = ["machine-a.example.com"]localIP = "127.0.0.1"localPort = 22
Разверните еще один frpc на внутренней машине B со следующей конфигурацией:
serverAddr = "xxxx"serverPort = 7000[[proxies]]name = "ssh2"type = "tcpmux"multiplexer = "httpconnect"customDomains = ["machine-b.example.com"]localIP = "127.0.0.1"localPort = 22
Чтобы получить доступ к внутренней машине A с помощью SSH ProxyCommand, предполагая, что имя пользователя «test»:
ssh -o 'proxycommand socat - PROXY:xxxx:%h:%p,proxyport=5002' [email protected]
Единственная разница для доступа к внутренней машине B — это имя домена, при условии, что имя пользователя — «test»:
ssh -o 'proxycommand socat - PROXY:xxxx:%h:%p,proxyport=5002' [email protected]
Иногда нам нужно предоставить доступ к локальному веб-сервису за сетью NAT другим людям в целях тестирования с нашим собственным доменным именем.
К сожалению, мы не можем преобразовать доменное имя в локальный IP-адрес. Однако мы можем использовать frp для предоставления доступа к службе HTTP(S).
Измените frps.toml
и установите HTTP-порт для vhost на 8080:
# frps.tomlbindPort = 7000vhostHTTPPort = 8080
Если вы хотите настроить https-прокси, вам необходимо настроить vhostHTTPSPort
.
Запускаем frps
:
./frps -c ./frps.toml
Измените frpc.toml
и задайте serverAddr
IP-адрес удаленного сервера frps. Укажите localPort
вашего веб-сервиса:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[proxies]]name = "web"type = "http"localPort = 80customDomains = ["www.example.com"]
Запускаем frpc
:
./frpc -c ./frpc.toml
Сопоставьте запись A www.example.com
либо с общедоступным IP-адресом удаленного сервера frps, либо с записью CNAME, указывающей на ваш исходный домен.
Посетите местный веб-сервис, используя URL http://www.example.com:8080
.
Измените frps.toml
:
# frps.tomlbindPort = 7000
Запускаем frps
:
./frps -c ./frps.toml
Измените frpc.toml
и задайте serverAddr
IP-адрес удаленного сервера frps. Перенаправить запросы DNS-запросов на общедоступный DNS-сервер Google 8.8.8.8:53
:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[proxies]]name = "dns"type = "udp"localIP = "8.8.8.8"localPort = 53remotePort = 6000
Запускаем фрпк:
./frpc -c ./frpc.toml
Проверьте разрешение DNS с помощью команды dig
:
dig @xxxx -p 6000 www.google.com
Предоставьте сокет домена Unix (например, сокет демона Docker) как TCP.
Настройте frps
как указано выше.
Запустите frpc
со следующей конфигурацией:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[proxies]]name = "unix_domain_socket"type = "tcp"remotePort = 6000[proxies.plugin]type = "unix_domain_socket"unixPath = "/var/run/docker.sock "
Проверьте конфигурацию, получив версию Docker с помощью curl
:
curl http://xxxx:6000/version
Предоставьте простой файловый сервер HTTP для доступа к файлам, хранящимся в локальной сети, из общедоступного Интернета.
Настройте frps
, как описано выше, затем:
Запустите frpc
со следующей конфигурацией:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[proxies]]name = "test_static_file"type = "tcp"remotePort = 6000[proxies.plugin]type = "static_file"localPath = "/tmp/files"stripPrefix = " static"httpUser = "abc"httpPassword = "abc"
Посетите http://xxxx:6000/static/
в своем браузере и укажите правильное имя пользователя и пароль для просмотра файлов в /tmp/files
на компьютере frpc
.
Вы можете заменить плагин https2https
и указать localAddr
на конечную точку HTTPS.
Запустите frpc
со следующей конфигурацией:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[proxies]]name = "test_https2http"type = "https"customDomains = ["test.example.com"] [proxies.plugin]type = "https2http"localAddr = "127.0.0.1:80"crtPath = "./server.crt"keyPath = "./server.key"hostHeaderRewrite = "127.0.0.1"requestHeaders.set.x- откуда-где = "фрп"
Посетите https://test.example.com
.
Чтобы снизить риски, связанные с предоставлением определенных услуг непосредственно общедоступной сети, режим STCP (секретный TCP) требует использования предварительного ключа для доступа к службе от других клиентов.
Настройте frps
так же, как указано выше.
Запустите frpc
на машине B со следующей конфигурацией. Этот пример предназначен для предоставления доступа к службе SSH (порт 22). Обратите внимание на поле secretKey
для предварительного ключа и на то, что поле remotePort
здесь удалено:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[proxies]]name = "secret_ssh"type = "stcp"secretKey = "abcdefg"localIP = "127.0.0.1"localPort = 22
Запустите другой frpc
(обычно на другом компьютере C) со следующей конфигурацией для доступа к службе SSH с помощью ключа безопасности (поле secretKey
):
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[visitors]]name = "secret_ssh_visitor"type = "stcp"serverName = "secret_ssh"secretKey = "abcdefg"bindAddr = "127.0.0.1"bindPort = 6000
На машине C подключитесь к SSH на машине B, используя следующую команду:
ssh -oPort=6000 127.0.0.1
xtcp предназначен для передачи больших объемов данных напрямую между клиентами. Сервер frps по-прежнему необходим, поскольку P2P здесь относится только к фактической передаче данных.
Обратите внимание, что он может работать не со всеми типами устройств NAT. Возможно, вы захотите вернуться к stcp, если xtcp не работает.
Запустите frpc
на машине B и откройте порт SSH. Обратите внимание, что поле remotePort
удалено:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000# настройте новый сервер оглушения, если сервер по умолчанию недоступен. # natHoleStunServer = "xxx"[[proxies]]name = "p2p_ssh"type = "xtcp"secretKey = " abcdefg"localIP = "127.0.0.1"localPort = 22
Запустите другой frpc
(обычно на другом компьютере C) с конфигурацией для подключения к SSH в режиме P2P:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000# настройте новый сервер оглушения, если сервер по умолчанию недоступен. # natHoleStunServer = "xxx"[[visitors]]name = "p2p_ssh_visitor"type = "xtcp"serverName = " p2p_ssh"secretKey = "abcdefg"bindAddr = "127.0.0.1"bindPort = 6000#, когда требуется автоматическое сохранение туннеля, установите для него значение truekeepTunnelOpen = false
На машине C подключитесь к SSH на машине B, используя следующую команду:
ssh -oPort=6000 127.0.0.1
Начиная с версии 0.52.0, мы поддерживаем конфигурацию TOML, YAML и JSON. Обратите внимание, что INI устарел и будет удален в будущих выпусках. Новые функции будут доступны только в форматах TOML, YAML или JSON. Пользователи, которым нужны эти новые функции, должны соответствующим образом изменить формат конфигурации.
Прочтите полные примеры файлов конфигурации, чтобы узнать еще больше функций, не описанных здесь.
В примерах используется формат TOML, но вы все равно можете использовать YAML или JSON.
Эти файлы конфигурации предназначены только для справки. Пожалуйста, не используйте эту конфигурацию напрямую для запуска программы, так как с ней могут возникнуть различные проблемы.
Полный файл конфигурации frps (Сервер)
Полный файл конфигурации для frpc (клиента)
На переменные среды можно ссылаться в файле конфигурации, используя стандартный формат Go:
# frpc.tomlserverAddr = "{{ .Envs.FRP_SERVER_ADDR }}"serverPort = 7000[[proxies]]name = "ssh"type = "tcp"localIP = "127.0.0.1"localPort = 22remotePort = "{{ .Envs. FRP_SSH_REMOTE_PORT }}"
С помощью приведенной выше конфигурации переменные можно передавать в программу frpc
следующим образом:
export FRP_SERVER_ADDR=x.x.x.x export FRP_SSH_REMOTE_PORT=6000 ./frpc -c ./frpc.toml
frpc
отобразит шаблон файла конфигурации, используя переменные среды ОС. Не забудьте добавить к ссылке префикс .Envs
.
Вы можете разделить несколько конфигураций прокси-сервера на разные файлы и включить их в основной файл.
# frpc.tomlserverAddr = "xxxx"serverPort = 7000includes = ["./confd/*.toml"]
# ./confd/test.toml[[прокси]]name = "ssh"type = "tcp"localIP = "127.0.0.1"localPort = 22remotePort = 6000
Проверьте статус frp и статистику прокси с помощью Dashboard.
Настройте порт для информационной панели, чтобы включить эту функцию:
# Значение по умолчанию — 127.0.0.1. Измените его на 0.0.0.0, если вы хотите получить к нему доступ из общедоступной сети.webServer.addr = "0.0.0.0"webServer.port = 7500# Имя пользователя и пароль панели управления являются необязательнымиwebServer.user = "admin"webServer.password = " админ"
Затем посетите http://[serverAddr]:7500
чтобы увидеть панель управления, где имя пользователя и пароль — admin
.
Кроме того, вы можете использовать порт HTTPS, используя подстановочный знак вашего домена или обычный сертификат SSL:
webServer.port = 7500# имя пользователя и пароль панели управления являются необязательнымиwebServer.user = "admin"webServer.password = "admin"webServer.tls.certFile = "server.crt"webServer.tls.keyFile = "server.key"
Затем посетите https://[serverAddr]:7500
чтобы увидеть панель мониторинга в безопасном соединении HTTPS с именем пользователя и паролем admin
.
Пользовательский интерфейс администратора клиента помогает проверять конфигурацию frpc и управлять ею.
Настройте адрес для пользовательского интерфейса администратора, чтобы включить эту функцию:
webServer.addr = "127.0.0.1"webServer.port = 7400webServer.user = "admin"webServer.password = "admin"
Затем посетите http://127.0.0.1:7400
чтобы увидеть пользовательский интерфейс администратора, где имя пользователя и пароль — admin
.
Когда веб-сервер включен, frps сохраняет данные монитора в кеше в течение 7 дней. Оно будет очищено после перезапуска процесса.
Прометей также поддерживается.
Сначала включите панель мониторинга, затем настройте enablePrometheus = true
в frps.toml
.
http://{dashboard_addr}/metrics
предоставит данные монитора Prometheus.
Существует 2 метода аутентификации для аутентификации frpc с помощью frps.
Вы можете решить, какой из них использовать, настроив auth.method
в frpc.toml
и frps.toml
, по умолчанию используется токен.
При настройке auth.additionalScopes = ["HeartBeats"]
настроенный метод аутентификации будет использоваться для добавления и проверки аутентификации при каждом такте между frpc и frps.
Настройка auth.additionalScopes = ["NewWorkConns"]
будет делать то же самое для каждого нового рабочего соединения между frpc и frps.
При указании auth.method = "token"
в frpc.toml
и frps.toml
будет использоваться аутентификация на основе токена.
Обязательно укажите один и тот же auth.token
в frps.toml
и frpc.toml
чтобы frpc прошел проверку frps.
При указании auth.method = "oidc"
в frpc.toml
и frps.toml
будет использоваться аутентификация на основе OIDC.
OIDC означает OpenID Connect, а используемый поток называется предоставлением учетных данных клиента.
Чтобы использовать этот тип аутентификации, настройте frpc.toml
и frps.toml
следующим образом:
# frps.tomlauth.method = "oidc"auth.oidc.issuer = "https://example-oidc-issuer.com/"auth.oidc.audience = "https://oidc-audience.com/.default"
# frpc.tomlauth.method = "oidc"auth.oidc.clientID = "98692467-37de-409a-9fac-bb2585826f18" # Заменить клиентом OIDC IDauth.oidc.clientSecret = "oidc_secret"auth.oidc.audience = "https: //oidc-audience.com/.default"auth.oidc.tokenEndpointURL = "https://example-oidc-endpoint.com/oauth2/v2.0/token"
По умолчанию функции отключены. Вы можете включить шифрование и/или сжатие:
# frpc.toml[[proxies]]name = "ssh"type = "tcp"localPort = 22remotePort = 6000transport.useEncryption = truetransport.useCompression = true
Начиная с версии 0.50.0, значение по умолчанию для transport.tls.enable
и transport.tls.disableCustomTLSFirstByte
было изменено на true, а tls включен по умолчанию.
Для мультиплексирования портов frp отправляет первый байт 0x17
для установления соединения TLS. Это вступит в силу только в том случае, если для transport.tls.disableCustomTLSFirstByte
установлено значение false.
Чтобы заставить frps
принимать только соединения TLS, настройте transport.tls.force = true
в frps.toml
. Это необязательно.
Настройки TLS frpc
:
Transport.tls.enable = truetransport.tls.certFile = "certificate.crt"transport.tls.keyFile = "certificate.key"transport.tls.trustedCaFile = "ca.crt"
Настройки TLS frps
:
Transport.tls.force = truetransport.tls.certFile = "certificate.crt"transport.tls.keyFile = "certificate.key"transport.tls.trustedCaFile = "ca.crt"
Вам понадобится корневой сертификат CA и хотя бы один сертификат SSL/TLS . Он может быть самозаверяющим или обычным (например, Let's Encrypt или другого поставщика сертификатов SSL/TLS).
Если вы используете frp
через IP-адрес, а не имя хоста, обязательно установите соответствующий IP-адрес в области «Альтернативное имя субъекта» (SAN) при создании сертификатов SSL/TLS.
Приведен пример:
Подготовьте файл конфигурации openssl. Он существует по адресу /etc/pki/tls/openssl.cnf
в системе Linux и /System/Library/OpenSSL/openssl.cnf
в MacOS, и вы можете скопировать его в текущий путь, например cp /etc/pki/tls/openssl.cnf ./my-openssl.cnf
. Если нет, вы можете создать его самостоятельно, например:
cat > my-openssl.cnf << EOF [ ca ] default_ca = CA_default [ CA_default ] x509_extensions = usr_cert [ req ] default_bits = 2048 default_md = sha256 default_keyfile = privkey.pem distinguished_name = req_distinguished_name attributes = req_attributes x509_extensions = v3_ca string_mask = utf8only [ req_distinguished_name ] [ req_attributes ] [ usr_cert ] basicConstraints = CA:FALSE nsComment = "OpenSSL Generated Certificate" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer [ v3_ca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = CA:true EOF
построить сертификаты CA:
openssl genrsa -out ca.key 2048 openssl req -x509 -new -nodes -key ca.key -subj "/CN=example.ca.com" -days 5000 -out ca.crt
создать сертификаты frps:
openssl genrsa -out server.key 2048 openssl req -new -sha256 -key server.key -subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN=server.com" -reqexts SAN -config <(cat my-openssl.cnf <(printf "n[SAN]nsubjectAltName=DNS:localhost,IP:127.0.0.1,DNS:example.server.com")) -out server.csr openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile <(printf "subjectAltName=DNS:localhost,IP:127.0.0.1,DNS:example.server.com") -out server.crt
построить сертификаты frpc:
openssl genrsa -out client.key 2048 openssl req -new -sha256 -key client.key -subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN=client.com" -reqexts SAN -config <(cat my-openssl.cnf <(printf "n[SAN]nsubjectAltName=DNS:client.com,DNS:example.client.com")) -out client.csr openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile <(printf "subjectAltName=DNS:client.com,DNS:example.client.com") -out client.crt
Поля webServer
необходимы для включения HTTP API:
# frpc.tomlwebServer.addr = "127.0.0.1"webServer.port = 7400
Затем запустите команду frpc reload -c ./frpc.toml
и подождите около 10 секунд, чтобы frpc
мог создать, обновить или удалить прокси.
Обратите внимание, что глобальные параметры клиента не будут изменены, кроме «старта».
Вы можете запустить команду frpc verify -c ./frpc.toml
перед перезагрузкой, чтобы проверить наличие ошибок конфигурации.
Используйте frpc status -c ./frpc.toml
чтобы получить статус всех прокси. Поля webServer
необходимы для включения HTTP API.
allowPorts
в frps.toml
используется, чтобы избежать злоупотребления портами:
# frps.tomlallowPorts = [ { начало = 2000, конец = 3000 }, { сингл = 3001 }, { одиночный = 3003 }, { начало = 4000, конец = 50000 } ]
vhostHTTPPort
и vhostHTTPSPort
во frps могут использовать один и тот же порт с bindPort
. frps определит протокол соединения и обработает его соответствующим образом.
На что вам нужно обратить внимание, так это на то, что если вы хотите настроить vhostHTTPSPort
bindPort
на один и тот же порт, вам необходимо сначала установить transport.tls.disableCustomTLSFirstByte
значение false.
В будущем мы хотели бы попытаться разрешить нескольким прокси-серверам связывать один и тот же удаленный порт с разными протоколами.
# frpc.toml[[прокси]]name = "ssh"type = "tcp"localPort = 22remotePort = 6000transport.bandwidthLimit = "1MB"
Установите transport.bandwidthLimit
в конфигурации каждого прокси-сервера, чтобы включить эту функцию. Поддерживаемые единицы измерения: MB
и KB
.
Задайте для transport.bandwidthLimitMode
значение client
или server
, чтобы ограничить пропускную способность на стороне клиента или сервера. По умолчанию — client
.
frp поддерживает мультиплексирование потоков TCP, начиная с версии 0.10.0, как и мультиплексирование HTTP2, и в этом случае все логические соединения с одним и тем же frpc мультиплексируются в одно TCP-соединение.
Вы можете отключить эту функцию, изменив frps.toml
и frpc.toml
:
# frps.toml и frpc.toml должны быть одинаковымиtransport.tcpMux = false
KCP — это быстрый и надежный протокол, который позволяет добиться эффекта передачи, заключающегося в сокращении средней задержки на 30–40 % и максимальной задержки в три раза, за счет увеличения потери полосы пропускания на 10 – 20 %. чем TCP.
Режим KCP использует UDP в качестве основного транспорта. Использование KCP во frp:
Включите KCP во frps:
# frps.tomlbindPort = 7000# Укажите UDP-порт для KCP.kcpBindPort = 7000
Номер kcpBindPort
может совпадать с bindPort
, поскольку bindPort
указывает TCP-порт.
Настройте frpc.toml
для использования KCP для подключения к frps:
# frpc.tomlserverAddr = "xxxx"# То же, что и 'kcpBindPort' в frps.tomlserverPort = 7000transport.protocol = "kcp"
QUIC — это новый мультиплексный транспорт, построенный на основе UDP.
Использование QUIC во frp:
Включите QUIC во frps:
# frps.tomlbindPort = 7000# Укажите UDP-порт для QUIC.quicBindPort = 7000
Номер quicBindPort
может совпадать с bindPort
, поскольку bindPort
указывает TCP-порт.
Настройте frpc.toml
для использования QUIC для подключения к frps:
# frpc.tomlserverAddr = "xxxx"# То же, что и 'quicBindPort' в frps.tomlserverPort = 7000transport.protocol = "quic"
По умолчанию frps создает новое соединение frpc с серверной службой по запросу пользователя. Благодаря пулу соединений frps сохраняет определенное количество предварительно установленных соединений, сокращая время, необходимое для установления соединения.
Эта функция подходит для большого количества коротких соединений.
Настройте ограничение количества пулов, которое может использовать каждый прокси-сервер, в frps.toml
:
# frps.tomltransport.maxPoolCount = 5
Включите и укажите количество пулов соединений:
# frpc.tomltransport.poolCount = 1
Балансировка нагрузки поддерживается group
.
Сейчас эта функция доступна только для типов tcp
, http
, tcpmux
.
# frpc.toml[[proxies]]name = "test1"type = "tcp"localPort = 8080remotePort = 80loadBalancer.group = "web"loadBalancer.groupKey = "123"[[proxies]]name = "test2"type = " tcp"localPort = 8081remotePort = 80loadBalancer.group = "web"loadBalancer.groupKey = "123"
loadBalancer.groupKey
используется для аутентификации.
Подключения к порту 80 будут распределяться между прокси в одной группе случайным образом.
Для типа tcp
remotePort
в той же группе должен быть одинаковым.
Для типа http
, customDomains
, subdomain
locations
должны быть одинаковыми.
Функция проверки работоспособности может помочь вам достичь высокой доступности с помощью балансировки нагрузки.
Добавьте healthCheck.type = "tcp"
или healthCheck.type = "http"
чтобы включить проверку работоспособности.
При проверке работоспособности типа tcp сервисный порт будет проверен (TCPing):
# frpc.toml[[proxies]]name = "test1"type = "tcp"localPort = 22remotePort = 6000# Включить проверку работоспособности TCPhealthCheck.type = "tcp"# Тайм-аут TCP SecondShealthCheck.timeoutSeconds = 3# Если проверка работоспособности не удалась 3 раза подряд прокси будет удаляться из frpshealthCheck.maxFailed=3# Проверка работоспособности каждые 10 секундshealthCheck.intervalSeconds=10
При типе проверки работоспособности http в службу будет отправлен HTTP-запрос и ожидается ответ HTTP 2xx OK:
# frpc.toml[[proxies]]name = "web"type = "http"localIP = "127.0.0.1"localPort = 80customDomains = ["test.example.com"]# Включить проверку работоспособности HTTPhealthCheck.type = "http" # frpc отправит запрос GET в '/status'# и ожидает ответ HTTP 2xx OKhealthCheck.path = "/status"healthCheck.timeoutSeconds = 3healthCheck.maxFailed = 3healthCheck.intervalSeconds = 10
По умолчанию frp вообще не изменяет туннелированные HTTP-запросы, поскольку это побайтовое копирование.
Однако, говоря о веб-серверах и HTTP-запросах, ваш веб-сервер может полагаться на HTTP-заголовок Host
для определения веб-сайта, к которому нужно получить доступ. frp может перезаписать заголовок Host
при пересылке HTTP-запросов с помощью поля hostHeaderRewrite
:
# frpc.toml[[proxies]]name = "web"type = "http"localPort = 80customDomains = ["test.example.com"]hostHeaderRewrite = "dev.example.com"
Заголовок HTTP-запроса будет перезаписан на Host
Host: dev.example.com
, когда он достигнет фактического веб-сервера, хотя запрос от браузера, вероятно, будет иметь Host: test.example.com
.
Как и в случае с Host
, вы можете переопределить другие заголовки HTTP-запросов и ответов с помощью прокси-сервера типа http
.
# frpc.toml[[proxies]]name = "web"type = "http"localPort = 80customDomains = ["test.example.com"]hostHeaderRewrite = "dev.example.com"requestHeaders.set.x-from-where = "frp"responseHeaders.set.foo = "бар"
В этом примере он установит заголовок x-from-where: frp
в HTTP-запросе и foo: bar
в HTTP-ответе.
Эта функция предназначена для http
-прокси или прокси-серверов с включенными плагинами https2http
и https2https
.
Вы можете получить реальный IP-адрес пользователя из заголовков HTTP-запроса X-Forwarded-For
.
frp поддерживает протокол прокси для отправки реального IP-адреса пользователя локальным службам. Он поддерживает все типы, кроме UDP.
Вот пример для https-сервиса:
# frpc.toml[[proxies]]name = "web"type = "https"localPort = 443customDomains = ["test.example.com"]# теперь поддерживаются v1 и v2transport.proxyProtocolVersion = "v2"
Вы можете включить поддержку прокси-протокола в nginx, чтобы предоставить реальный IP-адрес пользователя в HTTP-заголовке X-Real-IP
, а затем прочитать заголовок X-Real-IP
в своем веб-сервисе для получения реального IP-адреса.
Любой, кто сможет угадать URL-адрес вашего туннеля, сможет получить доступ к вашему локальному веб-серверу, если вы не защитите его паролем.
Это обеспечивает обязательную базовую аутентификацию HTTP для всех запросов с именем пользователя и паролем, указанными в файле конфигурации frpc.
Его можно включить только в том случае, если тип прокси — http.
# frpc.toml[[прокси]]name = "web"type = "http"localPort = 80customDomains = ["test.example.com"]httpUser = "abc"httpPassword = "abc"
Посетите http://test.example.com
в браузере, и теперь вам будет предложено ввести имя пользователя и пароль.
Удобно использовать настройку subdomain
для типов http и https, когда много людей используют один сервер frps.
# frps.tomlsubDomainHost = "frps.com"
Разрешите *.frps.com
IP-адресу сервера frps. Обычно это называется DNS-записью с подстановочными знаками.
# frpc.toml[[прокси]]name = "web"type = "http"localPort = 80subdomain = "test"
Теперь вы можете посетить свой веб-сервис на test.frps.com
.
Обратите внимание: если subdomainHost
не пуст, customDomains
не должен быть субдоменом subdomainHost
.
frp поддерживает пересылку HTTP-запросов к различным серверным веб-службам посредством маршрутизации URL-адресов.
locations
указывает префикс URL-адреса, используемого для маршрутизации. frps сначала ищет наиболее конкретное местоположение префикса, заданное литеральными строками, независимо от порядка в списке.
# frpc.toml[[proxies]]name = "web01"type = "http"localPort = 80customDomains = ["web.example.com"]locations = ["/"] [[proxies]]name = "web02"type = "http"localPort = 81customDomains = ["web.example.com"]locations = ["/news", "/about"]
HTTP-запросы с префиксом URL-адреса /news
или /about
будут перенаправлены на web02 , а другие запросы — на web01 .
frp поддерживает получение TCP-сокетов, направленных на разные прокси-серверы, на один порт frps, аналогично vhostHTTPPort
и vhostHTTPSPort
.
Единственный поддерживаемый метод мультиплексирования портов TCP, доступный на данный момент, — это туннель httpconnect
— HTTP CONNECT.
Если в frps для tcpmuxHTTPConnectPort
установлено значение, отличное от 0, frps будет прослушивать этот порт для запросов HTTP CONNECT.
Хост запроса HTTP CONNECT будет использоваться для сопоставления прокси во frps. Прокси-хосты можно настроить во frpc, настроив customDomains
и/или subdomain
под прокси tcpmux
, когда multiplexer = "httpconnect"
.
Например:
# frps.tomlbindPort = 7000tcpmuxHTTPConnectPort = 1337
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[proxies]]name = "proxy1"type = "tcpmux"multiplexer = "httpconnect"customDomains = ["test1"]localPort = 80[[proxies]]name = "proxy2 "type = "tcpmux"multiplexer = "httpconnect"customDomains = ["test2"]localPort = 8080
В приведенной выше конфигурации с frps можно связаться через порт 1337 с помощью заголовка HTTP CONNECT, например:
CONNECT test1 HTTP/1.1rnrn
и соединение будет перенаправлено на proxy1
.
frpc может подключаться к frps через прокси-сервер, если вы установили переменную среды ОС HTTP_PROXY
или если в файле frpc.toml установлен transport.proxyURL
.
Это работает только тогда, когда протокол TCP.
# frpc.tomlserverAddr = "xxxx"serverPort = 7000transport.proxyURL = "http://user:[email protected]:8080"
Добавлено в версии 0.56.0
Мы можем использовать синтаксис диапазона шаблона Go в сочетании со встроенной функцией parseNumberRangePair
для достижения сопоставления диапазона портов.
Следующий пример при запуске создаст 8 прокси-серверов с именами test-6000, test-6001 ... test-6007
, каждый из которых сопоставляет удаленный порт с локальным портом.
{{- range $_, $v := parseNumberRangePair "6000-6006,6007" "6000-6006,6007" }} [[proxies]] name = "tcp-{{ $v.First }}" type = "tcp" localPort = {{ $v.First }} remotePort = {{ $v.Second }} {{- end }}
По умолчанию frpc пересылает запросы только на локальные порты TCP или UDP.
Плагины используются для предоставления богатых функций. Существуют встроенные плагины, такие как unix_domain_socket
, http_proxy
, socks5
, static_file
, http2https
, https2http
, https2https
, и вы можете увидеть примеры использования.
Использование плагина http_proxy :
# frpc.toml[[proxies]]name = "http_proxy"type = "tcp"remotePort = 6000[proxies.plugin]type = "http_proxy"httpUser = "abc"httpPassword = "abc"
httpUser
и httpPassword
— это параметры конфигурации, используемые в плагине http_proxy
.
Прочтите документ.
Дополнительные плагины можно найти в gofrp/plugin.
добавлено в версии 0.53.0
frp поддерживает прослушивание порта SSH на стороне frps и обеспечивает проксирование протокола TCP через протокол SSH -R, не полагаясь на frpc.
# frps.tomlsshTunnelGateway.bindPort = 2200
При запуске ./frps -c frps.toml
файл закрытого ключа с именем .autogen_ssh_key
будет автоматически создан в текущем рабочем каталоге. Этот сгенерированный файл закрытого ключа будет использоваться SSH-сервером во frps.
Выполнение команды
ssh -R :80:127.0.0.1:8080 v0@{адрес frp} -p 2200 tcp --proxy_name "test-tcp" --remote_port 9090
устанавливает прокси-сервер на frps, который перенаправляет локальную службу 8080 на порт 9090.
frp (через SSH) (Ctrl+C для выхода) Пользователь: Имя прокси: test-tcp Тип: TCP Удаленный адрес: :9090
Это эквивалентно:
frpc tcp --proxy_name "test-tcp" --local_ip 127.0.0.1 --local_port 8080 --remote_port 9090
Пожалуйста, обратитесь к этому документу для получения дополнительной информации.
gofrp/plugin — репозиторий плагинов frp, содержащий множество плагинов, реализованных на основе механизма расширения frp и отвечающих потребностям настройки в различных сценариях.
gofrp/tiny-frpc — облегченная версия клиента frp (минимум около 3,5 МБ), реализованная с использованием протокола ssh, поддерживающая некоторые наиболее часто используемые функции, подходящая для устройств с ограниченными ресурсами.
Хотите принять участие? Мы хотели бы помочь вам!
Взгляните на наш список проблем и рассмотрите возможность отправки запроса на включение в ветку разработки .
Если вы хотите добавить новую функцию, сначала создайте задачу, чтобы описать новую функцию, а также подход к ее реализации. Как только предложение будет принято, создайте реализацию новых функций и отправьте ее в виде запроса на включение.
Извините за мой плохой английский. Приветствуются улучшения этого документа, даже исправления некоторых опечаток.
Если у вас есть отличные идеи, отправьте электронное письмо по адресу [email protected].
Примечание. Мы предпочитаем, чтобы вы давали свои советы по вопросам, чтобы другие, у кого тот же вопрос, могли быстро найти его, и нам не нужно было отвечать на них повторно.
Если frp вам очень помогает, вы можете поддержать нас:
Поддержите нас спонсоры Github.
Вы можете разместить логотип вашей компании в файле README этого проекта.
Пожертвуйте деньги через PayPal на мой счет [email protected] .