Модуль 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

Ограничивает скорость чтения данных от проксируемого сервера. $1 задается в байтах в секунду.

0

отключает ограничение скорости

Примечание

Ограничение устанавливается на соединение, поэтому, если 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

Ограничивает время, в течение которого возможна передача запроса следующему серверу.

0

отключает это ограничение

proxy_next_upstream_tries#

Синтаксис:

proxy_next_upstream_tries число;

Умолчание:

proxy_next_upstream_tries 0;

Контекст:

stream, server

Ограничивает число допустимых попыток для передачи запроса следующему серверу.

0

отключает это ограничение

proxy_pass#

Синтаксис:

proxy_pass адрес;

Умолчание:

Контекст:

server

Задает адрес проксируемого сервера. $1 может быть указан в виде доменного имени или 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» для исходящих соединений к проксируемому серверу.

""

По умолчанию для сокета действуют настройки операционной системы.

on

для сокета включается параметр 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

Разрешает или запрещает передачу имени сервера, заданного директивой proxy_ssl_name, через расширение 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

Ограничивает скорость чтения данных от клиента. Скорость задается в байтах в секунду.

0

отключает ограничение скорости

Примечание

Ограничение устанавливается на соединение, поэтому, если клиент одновременно откроет два соединения, суммарная скорость будет вдвое выше заданного ограничения.

В значении параметра можно использовать переменные. Это может быть полезно в случаях, когда скорость нужно ограничивать в зависимости от какого-либо условия:

proxy_upload_rate $rate;

map $slow $rate {
    1     4k;
    2     8k;
}

proxy_upload_rate $rate;