Модуль stream_proxy
#
Позволяет проксировать потоки данных по TCP, UDP и UNIX-сокетам.
Пример конфигурации#
server {
listen 127.0.0.1:12345;
proxy_pass 127.0.0.1:8080;
}
server {
listen 12345;
proxy_connect_timeout 1s;
proxy_timeout 1m;
proxy_pass example.com:12345;
}
server {
listen 53 udp reuseport;
proxy_timeout 20s;
proxy_pass dns.example.com:53;
}
server {
listen [::1]:12345;
proxy_pass unix:/tmp/stream.socket;
}
Директивы#
proxy_bind#
- Синтаксис:
proxy_bind
адрес [transparent] | off;- Умолчание:
—
- Контекст:
stream, server
Задаёт локальный IP-адрес, который будет использоваться в исходящих соединениях с проксируемым сервером. В значении параметра допустимо использование переменных. Специальное значение off
отменяет действие унаследованной с предыдущего уровня конфигурации директивы proxy_bind, позволяя системе самостоятельно выбирать локальный IP-адрес.
Параметр transparent
позволяет задать нелокальный IP-aдрес, который будет использоваться в исходящих соединениях с проксируемым сервером, например, реальный IP-адрес клиента:
proxy_bind $remote_addr transparent;
Для работы параметра обычно требуется запустить рабочие процессы Angie с привилегиями суперпользователя. В Linux этого не требуется, так как если указан параметр transparent, то рабочие процессы наследуют capability CAP_NET_RAW из главного процесса.
Важно
Необходимо настроить таблицу маршрутизации ядра для перехвата сетевого трафика с проксируемого сервера.
proxy_buffer_size#
- Синтаксис:
proxy_buffer_size
размер;- Умолчание:
proxy_buffer_size 16k;
- Контекст:
stream, server
Задаёт размер буфера, в который будут читаться данные, получаемые от проксируемого сервера. Также задаёт размер буфера, в который будут читаться данные, получаемые от клиента.
proxy_connect_timeout#
- Синтаксис:
proxy_connect_timeout
время;- Умолчание:
proxy_connect_timeout 60s;
- Контекст:
stream, server
Задаёт таймаут для установления соединения с проксируемым сервером.
proxy_download_rate#
- Синтаксис:
proxy_download_rate
скорость;- Умолчание:
proxy_download_rate 0;
- Контекст:
stream, server
Ограничивает скорость чтения данных от проксируемого сервера. Скорость
задаётся в байтах в секунду.
|
отключает ограничение скорости |
Примечание
Ограничение устанавливается на соединение, поэтому, если Angie одновременно откроет два соединения к проксируемому серверу, суммарная скорость будет вдвое выше заданного ограничения.
В значении параметра можно использовать переменные. Это может быть полезно в случаях, когда скорость нужно ограничивать в зависимости от какого-либо условия:
map $slow $rate {
1 4k;
2 8k;
}
proxy_download_rate $rate
proxy_half_close#
- Синтаксис:
proxy_half_close
on | off;- Умолчание:
proxy_half_close off;
- Контекст:
stream, server
Разрешает или запрещает независимое закрытие каждой из сторон проксируемого соединения TCP («TCP half-close»). Если разрешено, то проксирование по TCP будет продолжаться, пока обе стороны не закроют соединение.
proxy_next_upstream#
- Синтаксис:
proxy_next_upstream
on | off;- Умолчание:
proxy_next_upstream on;
- Контекст:
stream, server
При невозможности установить соединение с проксируемым сервером определяет, будет ли клиентское соединение передано следующему серверу.
Передача соединения следующему серверу может быть ограничена по количеству попыток и по времени.
proxy_next_upstream_timeout#
- Синтаксис:
proxy_next_upstream_timeout
время;- Умолчание:
proxy_next_upstream_timeout 0;
- Контекст:
stream, server
Ограничивает время, в течение которого возможна передача запроса следующему серверу.
|
отключает это ограничение |
proxy_next_upstream_tries#
- Синтаксис:
proxy_next_upstream_tries
число;- Умолчание:
proxy_next_upstream_tries 0;
- Контекст:
stream, server
Ограничивает число допустимых попыток для передачи запроса следующему серверу.
|
отключает это ограничение |
proxy_pass#
- Синтаксис:
proxy_pass
адрес;- Умолчание:
—
- Контекст:
server
Задаёт адрес проксируемого сервера. Адрес
может быть указан в виде доменного имени или IP-адреса, и порта:
proxy_pass localhost:12345;
или в виде пути UNIX-сокета:
proxy_pass unix:/tmp/stream.socket;
Если доменному имени соответствует несколько адресов, то все они будут использоваться по очереди (round-robin). Кроме того, в качестве адреса можно указать группу серверов.
Адрес можно также задать с помощью переменных:
proxy_pass $upstream;
В этом случае имя сервера ищется среди описанных групп серверов и если не найдено, то определяется с помощью resolver’а.
proxy_protocol#
- Синтаксис:
proxy_protocol
on | off;- Умолчание:
proxy_protocol off;
- Контекст:
stream, server
Включает протокол PROXY для соединений с проксируемым сервером.
proxy_requests#
- Синтаксис:
proxy_requests
число;- Умолчание:
proxy_requests 0;
- Контекст:
stream, server
Задаёт число датаграмм, полученных от клиента, по достижении которого удаляется привязка между клиентом и существующей UDP-сессией. После получения указанного количества датаграмм следующая датаграмма, полученная от того же клиента, начинает новую сессию. Cессия завершится после отправки всех принятых датаграмм на проксируемый сервер и получения указанного количества ответов или после таймаута.
proxy_responses#
- Синтаксис:
proxy_responses
число;- Умолчание:
—
- Контекст:
stream, server
Задаёт количество датаграмм, ожидаемых от проксируемого сервера в ответ на датаграмму клиента в случае, если используется протокол UDP. Задаваемое число cлужит подсказкой для завершения сессии. По умолчанию количество датаграмм не ограничено.
Если указано нулевое значение, то ответ не ожидается. Однако если ответ получен и сессия ещё не завершилась, то ответ будет обработан.
proxy_socket_keepalive#
- Синтаксис:
proxy_socket_keepalive
on | off;- Умолчание:
proxy_socket_keepalive off;
- Контекст:
stream, server
Конфигурирует поведение «TCP keepalive» для исходящих соединений к проксируемому серверу.
|
По умолчанию для сокета действуют настройки операционной системы. |
|
для сокета включается параметр SO_KEEPALIVE |
proxy_ssl#
- Синтаксис:
proxy_ssl
on | off;- Умолчание:
proxy_ssl off;
- Контекст:
stream, server
Включает протоколы SSL/TLS для соединений с проксируемым сервером.
proxy_ssl_certificate#
- Синтаксис:
proxy_ssl_certificate
файл [файл];- Умолчание:
—
- Контекст:
stream, server
Задаёт файл с сертификатом в формате PEM для аутентификации на проксируемом сервере. В имени файла можно использовать переменные.
Добавлено в версии 1.2.0.
При включённом proxy_ssl_ntls директива принимает два аргумента вместо одного:
server {
proxy_ssl_ntls on;
proxy_ssl_certificate sign.crt enc.crt;
proxy_ssl_certificate_key sign.key enc.key;
proxy_ssl_ciphers "ECC-SM2-WITH-SM4-SM3:ECDHE-SM2-WITH-SM4-SM3:RSA";
proxy_pass backend:12345;
}
proxy_ssl_certificate_key#
- Синтаксис:
proxy_ssl_certificate_key
файл [файл];- Умолчание:
—
- Контекст:
stream, server
Задаёт файл с секретным ключом в формате PEM для аутентификации на проксируемом сервере. В имени файла можно использовать переменные.
Добавлено в версии 1.2.0.
При включённом proxy_ssl_ntls директива принимает два аргумента вместо одного:
server {
proxy_ssl_ntls on;
proxy_ssl_certificate sign.crt enc.crt;
proxy_ssl_certificate_key sign.key enc.key;
proxy_ssl_ciphers "ECC-SM2-WITH-SM4-SM3:ECDHE-SM2-WITH-SM4-SM3:RSA";
proxy_pass backend:12345;
}
proxy_ssl_ciphers#
- Синтаксис:
proxy_ssl_ciphers
шифры;- Умолчание:
proxy_ssl_ciphers DEFAULT;
- Контекст:
stream, server
Описывает разрешённые шифры для запросов к проксируемому серверу. Шифры задаются в формате, поддерживаемом библиотекой OpenSSL.
Полный список можно посмотреть с помощью команды «openssl ciphers».
proxy_ssl_conf_command#
- Синтаксис:
proxy_ssl_conf_command
имя значение;- Умолчание:
—
- Контекст:
stream, server
Задаёт произвольные конфигурационные команды OpenSSL при установлении соединения с проксируемым сервером.
Важно
Директива поддерживается при использовании OpenSSL 1.0.2 и выше.
На одном уровне может быть указано несколько директив proxy_ssl_conf_command. Директивы наследуются с предыдущего уровня конфигурации при условии, что на данном уровне не описаны свои директивы proxy_ssl_conf_command.
Осторожно
Следует учитывать, что изменение настроек OpenSSL напрямую может привести к неожиданному поведению.
proxy_ssl_crl#
- Синтаксис:
proxy_ssl_crl
файл;- Умолчание:
—
- Контекст:
stream, server
Указывает файл с отозванными сертификатами (CRL) в формате PEM, используемыми при проверке сертификата проксируемого сервера.
proxy_ssl_name#
- Синтаксис:
proxy_ssl_name
имя;- Умолчание:
proxy_ssl_name
хост изproxy_pass;
- Контекст:
stream, server
Позволяет переопределить имя сервера, используемое при проверке сертификата проксируемого сервера, а также для передачи его через SNI при установлении соединения с проксируемым сервером. Имя сервера можно также задать с помощью переменных.
По умолчанию используется имя хоста из адреса, заданного директивой proxy_pass.
proxy_ssl_ntls#
Добавлено в версии 1.2.0.
- Синтаксис:
proxy_ssl_ntls
on | off;- Умолчание:
proxy_ssl_ntls off;
- Контекст:
stream, server
Включает клиентскую поддержку NTLS при использовании TLS библиотеки TongSuo.
server {
proxy_ssl_ntls on;
proxy_ssl_certificate sign.crt enc.crt;
proxy_ssl_certificate_key sign.key enc.key;
proxy_ssl_ciphers "ECC-SM2-WITH-SM4-SM3:ECDHE-SM2-WITH-SM4-SM3:RSA";
proxy_pass backend:12345;
}
Важно
Angie необходимо собрать с использованием параметра конфигурации –with-ntls, с соответствующей SSL библиотекой с поддержкой NTLS
./configure --with-openssl=../Tongsuo-8.3.0 \
--with-openssl-opt=enable-ntls \
--with-ntls
proxy_ssl_password_file#
- Синтаксис:
proxy_ssl_password_file
файл;- Умолчание:
—
- Контекст:
stream, server
Задаёт файл с паролями от секретных ключей, где каждый пароль указан на отдельной строке. Пароли применяются по очереди в момент загрузки ключа.
proxy_ssl_protocols#
- Синтаксис:
proxy_ssl_protocols
[SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];- Умолчание:
proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
- Контекст:
stream, server
Изменено в версии 1.2.0: Параметр TLSv1.3
добавлен к используемым по умолчанию.
Разрешает указанные протоколы для соединений с проксируемым сервером.
proxy_ssl_server_name#
- Синтаксис:
proxy_ssl_server_name
on | off;- Умолчание:
proxy_ssl_server_name off;
- Контекст:
stream, server
Разрешает или запрещает передачу имени сервера через расширение Server Name Indication протокола TLS (SNI, RFC 6066) при установлении соединения с проксируемым сервером.
proxy_ssl_session_reuse#
- Синтаксис:
proxy_ssl_session_reuse
on | off;- Умолчание:
proxy_ssl_session_reuse on;
- Контекст:
stream, server
Определяет, использовать ли повторно SSL-сессии при работе с проксируемым сервером. Если в логах появляются ошибки «SSL3_GET_FINISHED:digest check failed», то можно попробовать выключить повторное использование сессий.
proxy_ssl_trusted_certificate#
- Синтаксис:
proxy_ssl_trusted_certificate
файл;- Умолчание:
—
- Контекст:
stream, server
Задаёт файл с доверенными сертификатами CA в формате PEM, используемыми при проверке сертификата проксируемого HTTPS-сервера.
proxy_ssl_verify#
- Синтаксис:
proxy_ssl_verify
on | off;- Умолчание:
proxy_ssl_verify off;
- Контекст:
stream, server
Разрешает или запрещает проверку сертификата проксируемого сервера.
proxy_ssl_verify_depth#
- Синтаксис:
proxy_ssl_verify_depth
число;- Умолчание:
proxy_ssl_verify_depth 1;
- Контекст:
stream, server
Устанавливает глубину проверки в цепочке сертификатов проксируемого сервера.
proxy_timeout#
- Синтаксис:
proxy_timeout
время;- Умолчание:
proxy_timeout 10m;
- Контекст:
stream, server
Задаёт таймаут между двумя идущими подряд операциями чтения или записи на клиентском соединении или соединении с проксируемым сервером. Если по истечении этого времени данные не передавались, соединение закрывается.
proxy_upload_rate#
- Синтаксис:
proxy_upload_rate
скорость;- Умолчание:
proxy_upload_rate 0;
- Контекст:
stream, server
Ограничивает скорость чтения данных от клиента. Скорость задаётся в байтах в секунду.
|
отключает ограничение скорости |
Примечание
Ограничение устанавливается на соединение, поэтому, если клиент одновременно откроет два соединения, суммарная скорость будет вдвое выше заданного ограничения.
В значении параметра можно использовать переменные. Это может быть полезно в случаях, когда скорость нужно ограничивать в зависимости от какого-либо условия:
proxy_upload_rate $rate;
map $slow $rate {
1 4k;
2 8k;
}
proxy_upload_rate $rate;