Proxy#

Permite hacer proxy de flujos de datos sobre TCP, UDP y sockets de dominio UNIX.

Ejemplo de configuración#

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;
}

Directivas#

proxy_bind#

Sintaxis

proxy_bind dirección [transparent] | off;

Predeterminado

—

Contexto

stream, server

Hace que las conexiones salientes a un servidor proxy se originen desde la dirección IP local especificada. El valor del parámetro puede contener variables. El valor especial off cancela el efecto de la directiva proxy_bind heredada del nivel de configuración anterior, lo que permite que el sistema asigne automáticamente la dirección IP local.

En Angie, la dirección se evalúa una sola vez al inicializar la sesión, antes de seleccionar un servidor proxy. En Angie PRO, la evaluación se realiza tras cada selección de servidor proxy (incluidos los reintentos), por lo que la dirección de enlace puede depender del servidor seleccionado; por ejemplo, mediante la variable $upstream_current_addr. Si el valor evaluado está vacío, no se realiza ningún enlace.

El parámetro transparent permite que las conexiones salientes a un servidor proxy se originen desde una dirección IP no local, por ejemplo, desde la dirección IP real de un cliente:

proxy_bind $remote_addr transparent;

Para que este parámetro funcione, los procesos worker de Angie normalmente deben ejecutarse con privilegios de superusuario. En Linux no es necesario: si se especifica el parámetro transparent, los procesos worker heredan la capacidad CAP_NET_RAW del proceso maestro.

Nota

También debe configurarse la tabla de enrutamiento del kernel para interceptar el tráfico de red desde el servidor proxy.

proxy_buffer_size#

Sintaxis

proxy_buffer_size tamaño;

Predeterminado

proxy_buffer_size 16k;

Contexto

stream, server

Establece el tamaño del buffer usado para leer datos desde el servidor proxy. También establece el tamaño del buffer usado para leer datos desde el cliente.

proxy_connect_timeout#

Sintaxis

proxy_connect_timeout tiempo;

Predeterminado

proxy_connect_timeout 60s;

Contexto

stream, server

Define un tiempo de espera para establecer una conexión con un servidor proxy.

proxy_connection_drop#

Sintaxis

proxy_connection_drop tiempo | on | off;

Predeterminado

proxy_connection_drop off;

Contexto

stream, server

Habilita la finalización de todas las sesiones hacia el servidor proxy después de que haya sido eliminado del grupo o marcado como permanentemente no disponible por un proceso reresolve o por el comando API DELETE.

Una sesión se termina cuando se procesa el siguiente evento de lectura o escritura tanto para el cliente como para el servidor proxy.

Configurar tiempo habilita un tiempo de espera de finalización de sesión; con on, las sesiones se cierran inmediatamente.

proxy_download_rate#

Sintaxis

proxy_download_rate velocidad;

Predeterminado

proxy_download_rate 0;

Contexto

stream, server

Limita la velocidad de lectura de datos desde el servidor proxy. La velocidad se especifica en bytes por segundo.

0

desactiva la limitación de velocidad

Nota

El límite se establece por conexión, por lo que si Angie abre dos conexiones simultáneamente al servidor proxy, la velocidad total será el doble del límite especificado.

El valor del parámetro puede contener variables. Puede resultar útil en casos donde la velocidad deba limitarse según una condición determinada:

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

proxy_download_rate $rate;

proxy_half_close#

Sintaxis

proxy_half_close on | off;

Predeterminado

proxy_half_close off;

Contexto

stream, server

Habilita o deshabilita el cierre independiente de cada dirección de una conexión TCP ("TCP half-close"). Si está habilitado, el proxy sobre TCP se mantendrá hasta que ambas partes cierren la conexión.

proxy_next_upstream#

Sintaxis

proxy_next_upstream on | off;

Predeterminado

proxy_next_upstream on;

Contexto

stream, server

Cuando no se puede establecer una conexión con el servidor proxy, determina si la conexión del cliente se pasará al siguiente servidor en el grupo upstream.

El paso de una conexión al siguiente servidor puede limitarse mediante el número de intentos y por tiempo.

proxy_next_upstream_timeout#

Sintaxis

proxy_next_upstream_timeout tiempo;

Predeterminado

proxy_next_upstream_timeout 0;

Contexto

stream, server

Limita el tiempo permitido para pasar una conexión al siguiente servidor.

0

desactiva esta limitación

proxy_next_upstream_tries#

Sintaxis

proxy_next_upstream_tries número;

Predeterminado

proxy_next_upstream_tries 0;

Contexto

stream, server

Limita el número de intentos posibles para pasar una conexión al siguiente servidor.

0

desactiva esta limitación

proxy_pass#

Sintaxis

proxy_pass dirección;

Predeterminado

—

Contexto

server

Establece la dirección de un servidor proxy. La dirección puede especificarse como un nombre de dominio o dirección IP, y un puerto:

proxy_pass localhost:12345;

o como una ruta de socket de dominio UNIX:

proxy_pass unix:/tmp/stream.socket;

Si un nombre de dominio se resuelve en varias direcciones, todas se usarán en modo round-robin. Además, una dirección puede especificarse como un grupo de servidores.

Si el grupo referenciado es sin puerto (PRO), es decir, sus servidores se definen sin puerto, el puerto se añade al nombre del grupo:

proxy_pass backend:8443;

El sufijo de puerto es obligatorio para un grupo sin puerto y no se permite en un grupo cuyos servidores ya definen puertos. Con una dirección estática, incumplir cualquiera de las dos reglas es un error de configuración. En Angie PRO, con una dirección establecida mediante variables, el incumplimiento se detecta solo en tiempo de ejecución, cuando Angie registra un error y cierra la sesión.

La dirección también puede especificarse mediante variables (junto con el sufijo de puerto, si se permite):

proxy_pass $upstream;

En este caso, el nombre del servidor se busca entre los grupos de servidores descritos y, si no se encuentra, se determina usando un resolver.

proxy_protocol#

Sintaxis

proxy_protocol on | off;

Predeterminado

proxy_protocol off;

Contexto

stream, server

Habilita el protocolo PROXY para conexiones a un servidor proxy.

proxy_protocol_tlv#

Added in version 1.11.0.

Sintaxis

proxy_protocol_tlv nombre valor;

Predeterminado

—

Contexto

stream, server

Añade un TLV a la cabecera del protocolo PROXY v2 enviada a un servidor proxy. El valor puede contener variables. El nombre puede ser un nombre de tipo TLV o su valor numérico; en este último caso, el valor se especifica en hexadecimal y debe comenzar con 0x. Para TLVs SSL, use el prefijo ssl_; el nombre especial ssl_verify establece el campo verify del TLV SSL. La directiva se usa solo con proxy_protocol_version establecido en 2.

proxy_protocol_version#

Sintaxis

proxy_protocol_version 1 | 2;

Predeterminado

proxy_protocol_version 1;

Contexto

stream, server

Establece la versión del protocolo PROXY usada para conexiones a un servidor proxy. La configuración es efectiva cuando proxy_protocol está habilitado. La versión 2 permite enviar TLVs configurados por la directiva proxy_protocol_tlv.

proxy_requests#

Sintaxis

proxy_requests número;

Predeterminado

proxy_requests 0;

Contexto

stream, server

Establece el número de datagramas de cliente en el que se elimina el enlace entre un cliente y una sesión de flujo UDP existente. Después de recibir el número especificado de datagramas, el siguiente datagrama del mismo cliente inicia una nueva sesión. La sesión termina cuando todos los datagramas del cliente se transmiten a un servidor proxy y se recibe el número esperado de respuestas, o cuando alcanza un tiempo de espera.

proxy_responses#

Sintaxis

proxy_responses número;

Predeterminado

—

Contexto

stream, server

Establece el número de datagramas esperados desde el servidor proxy en respuesta a un datagrama de cliente si se usa el protocolo UDP. El número sirve como pista para la finalización de la sesión. Por defecto, el número de datagramas no está limitado.

Si se especifica el valor cero, no se espera respuesta. Sin embargo, si se recibe una respuesta y la sesión aún no ha terminado, la respuesta será procesada.

proxy_socket_keepalive#

Sintaxis

proxy_socket_keepalive on | off;

Predeterminado

proxy_socket_keepalive off;

Contexto

stream, server

Configura el comportamiento de "TCP keepalive" para conexiones salientes a un servidor proxy.

off

Por defecto, se aplican los ajustes del sistema operativo para el socket.

on

La opción de socket SO_KEEPALIVE está activada para el socket.

proxy_ssl#

Sintaxis

proxy_ssl on | off;

Predeterminado

proxy_ssl off;

Contexto

stream, server

Habilita el protocolo SSL/TLS para conexiones a un servidor proxy.

proxy_ssl_alpn#

Sintaxis

proxy_ssl_alpn protocolo ...;

Predeterminado

—

Contexto

stream, server

Especifica la lista de protocolos que se anuncian mediante la extensión ALPN al establecer una conexión con el servidor proxiado, por ejemplo:

proxy_ssl_alpn h2 http/1.1;

El valor del parámetro puede contener variables.

proxy_ssl_certificate#

Sintaxis

proxy_ssl_certificate archivo [archivo] | data:certificado;

Predeterminado

—

Contexto

stream, server

Especifica el certificado en formato PEM utilizado para la autenticación en un servidor proxy.

El valor se interpreta como en la directiva ssl_certificate del módulo HTTP SSL: una ruta de archivo, o el texto PEM del certificado tras el prefijo data:. El valor puede contener variables; se evalúan cada vez que Angie establece una conexión con el servidor proxy, por lo que están disponibles todas las variables de la sesión. Si el valor evaluado del certificado está vacío, no se envía ningún certificado de cliente. Para evitar cargar certificados en cada conexión, habilite proxy_ssl_certificate_cache.

Cuando proxy_ssl_ntls está habilitado, la directiva acepta dos argumentos en lugar de uno:

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_cache#

Sintaxis

proxy_ssl_certificate_cache off;

proxy_ssl_certificate_cache max=N [inactive=time] [valid=time];

Predeterminado

proxy_ssl_certificate_cache off;

Contexto

stream, server

Define una caché que almacena certificados SSL y claves secretas especificados usando variables.

La directiva admite los siguientes parámetros:

  • max — establece el número máximo de elementos en la caché. Cuando la caché se desborda, se eliminan los elementos menos utilizados recientemente (LRU).

  • inactive — define el tiempo tras el cual un elemento se elimina si no ha sido accedido durante ese tiempo, incluso si todavía está dentro de su período valid; cada acceso reinicia este temporizador. El valor predeterminado es 10 segundos.

  • valid — define el tiempo durante el cual un elemento en caché se reutiliza sin comprobaciones. El valor predeterminado es 60 segundos. Pasado este período, un elemento cargado desde un archivo se recarga solo si el archivo ha cambiado, y una clave cargada con el prefijo engine: o store: se vuelve a cargar; un elemento especificado con el prefijo data: sigue siendo válido.

  • off — desactiva la caché.

Las claves protegidas por una frase de contraseña (véase proxy_ssl_password_file) no se almacenan en caché.

Ejemplo:

proxy_ssl_certificate       /etc/angie/ssl/$ssl_server_name.crt;
proxy_ssl_certificate_key   /etc/angie/ssl/$ssl_server_name.key;
proxy_ssl_certificate_cache max=1000 inactive=20s valid=1m;

proxy_ssl_certificate_key#

Sintaxis

proxy_ssl_certificate_key archivo [archivo] | data:clave | engine:nombre:id | store:uri;

Predeterminado

—

Contexto

stream, server

Especifica la clave secreta en formato PEM utilizada para la autenticación en un servidor proxy.

El valor, incluidos los prefijos engine: y store:, se interpreta como en la directiva ssl_certificate_key del módulo HTTP SSL, y las variables en él funcionan como se describe en proxy_ssl_certificate. Una clave protegida por una frase de contraseña se descifra con las frases de contraseña de proxy_ssl_password_file.

Cuando proxy_ssl_ntls está habilitado, la directiva acepta dos argumentos en lugar de uno:

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#

Sintaxis

proxy_ssl_ciphers cifras;

Predeterminado

proxy_ssl_ciphers DEFAULT;

Contexto

stream, server

Especifica las cifras habilitadas para las solicitudes a un servidor proxy. Las cifras se especifican en el formato reconocido por la biblioteca OpenSSL.

La lista de cifras depende de la versión de OpenSSL instalada. La lista completa puede visualizarse usando el comando openssl ciphers.

Advertencia

Con OpenSSL, la directiva proxy_ssl_ciphers no configura las cifras de TLS 1.3; en su lugar, configúrelos con el comando Ciphersuites de la directiva proxy_ssl_conf_command. La directiva proxy_ssl_ciphers ignora los nombres de cifras TLS 1.3 de su valor, por lo que dichos nombres no restringen las conexiones TLS 1.3. Si el valor consta únicamente de tales nombres, por ejemplo TLS_AES_128_GCM_SHA256, la configuración no se carga y se produce el error no cipher match.

  • En LibreSSL, las cifras TLS 1.3 pueden configurarse usando proxy_ssl_ciphers.

  • En BoringSSL, las cifras TLS 1.3 no pueden configurarse en absoluto.

proxy_ssl_conf_command#

Sintaxis

proxy_ssl_conf_command nombre valor;

Predeterminado

—

Contexto

stream, server

Establece comandos de configuración arbitrarios de OpenSSL al establecer una conexión con el servidor proxy.

Nota

La directiva es compatible cuando se utiliza OpenSSL 1.0.2 o superior. El comando Ciphersuites, que configura las cifras de TLS 1.3, requiere OpenSSL 1.1.1 o superior.

Se pueden especificar varias directivas proxy_ssl_conf_command en el mismo nivel. Estas directivas se heredan del nivel de configuración anterior si y solo si no se definen directivas proxy_ssl_conf_command en el nivel actual.

Advertencia

Tenga en cuenta que configurar OpenSSL directamente puede provocar un comportamiento inesperado.

proxy_ssl_crl#

Sintaxis

proxy_ssl_crl archivo;

Predeterminado

—

Contexto

stream, server

Especifica un archivo con certificados revocados (CRL) en formato PEM usado para verificar el certificado del servidor proxy.

proxy_ssl_keylog_file#

Sintaxis

proxy_ssl_keylog_file archivo;

Predeterminado

—

Contexto

stream, server

Especifica un archivo para registrar las claves SSL/TLS de las conexiones con los servidores proxiados en el contexto, con el formato SSLKEYLOGFILE que usan herramientas como Wireshark para descifrar el tráfico TLS capturado.

La directiva no debe usarse con LibreSSL.

Advertencia

El archivo contiene material de claves TLS sensible que permite descifrar el tráfico capturado de las conexiones correspondientes. Use esta directiva solo para depuración o análisis de protocolo, restrinja el acceso al archivo y elimínelo cuando ya no sea necesario.

proxy_ssl_name#

Sintaxis

proxy_ssl_name nombre;

Predeterminado

proxy_ssl_name host de proxy_pass;

Contexto

stream, server

Permite sobrescribir el nombre de servidor usado para verificar el certificado del servidor proxy y para ser enviado a través de SNI al establecer una conexión con el servidor proxy. El nombre del servidor también puede especificarse usando variables.

Por defecto, se utiliza el nombre de host de la dirección especificada en la directiva proxy_pass.

proxy_ssl_ntls#

Sintaxis

proxy_ssl_ntls on | off;

Predeterminado

proxy_ssl_ntls off;

Contexto

stream, server

Habilita el soporte del lado cliente para NTLS al usar la biblioteca 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;
}

Nota

Angie debe compilarse con el parámetro de configuración --with-ntls y una biblioteca SSL con soporte NTLS:

$ ./configure --with-openssl=../Tongsuo-8.3.0 \
              --with-openssl-opt=enable-ntls  \
              --with-ntls

proxy_ssl_password_file#

Sintaxis

proxy_ssl_password_file archivo;

Predeterminado

—

Contexto

stream, server

Especifica un archivo con contraseñas para claves secretas donde cada contraseña se especifica en una línea separada. Las contraseñas se prueban en orden al cargar la clave.

proxy_ssl_protocols#

Sintaxis

proxy_ssl_protocols SSLv2 | SSLv3 | TLSv1 | TLSv1.1 | TLSv1.2 | TLSv1.3 ...;

Predeterminado

proxy_ssl_protocols TLSv1.2 TLSv1.3;

Contexto

stream, server

Habilita los protocolos especificados para las solicitudes a un servidor proxy.

proxy_ssl_server_name#

Sintaxis

proxy_ssl_server_name on | off;

Predeterminado

proxy_ssl_server_name off;

Contexto

stream, server

Habilita o deshabilita el envío del nombre de servidor especificado por la directiva proxy_ssl_name a través de la extensión TLS Server Name Indication (SNI, RFC 6066) al establecer una conexión con el servidor proxy.

proxy_ssl_session_reuse#

Sintaxis

proxy_ssl_session_reuse on | off;

Predeterminado

proxy_ssl_session_reuse on;

Contexto

stream, server

Determina si las sesiones SSL pueden reutilizarse al trabajar con el servidor proxy. Si en los registros aparece el error SSL3_GET_FINISHED:digest check failed, pruebe a desactivar la reutilización de sesiones.

proxy_ssl_trusted_certificate#

Sintaxis

proxy_ssl_trusted_certificate archivo;

Predeterminado

—

Contexto

stream, server

Especifica un archivo con certificados de CA confiables en formato PEM utilizado para verificar el certificado del servidor proxy.

proxy_ssl_verify#

Sintaxis

proxy_ssl_verify on | off;

Predeterminado

proxy_ssl_verify off;

Contexto

stream, server

Habilita o deshabilita la verificación del certificado del servidor proxy.

proxy_ssl_verify_depth#

Sintaxis

proxy_ssl_verify_depth número;

Predeterminado

proxy_ssl_verify_depth 1;

Contexto

stream, server

Establece la profundidad de verificación en la cadena de certificados del servidor proxy.

proxy_timeout#

Sintaxis

proxy_timeout tiempo;

Predeterminado

proxy_timeout 10m;

Contexto

stream, server

Establece un tiempo de espera entre dos operaciones consecutivas de lectura o escritura en conexiones del cliente o del servidor proxy. Si no se transmite ningún dato durante este tiempo, la conexión se cierra.

proxy_upload_rate#

Sintaxis

proxy_upload_rate tasa;

Predeterminado

proxy_upload_rate 0;

Contexto

stream, server

Limita la velocidad de lectura de datos desde el cliente. La tasa se especifica en bytes por segundo.

0

desactiva la limitación de velocidad

Nota

El límite se establece por conexión, por lo que si el cliente abre simultáneamente dos conexiones, la velocidad total será el doble del límite especificado.

El valor del parámetro puede contener variables. Esto puede ser útil en casos donde la tasa deba limitarse en función de una condición específica:

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

proxy_upload_rate $rate;