Tunnel#

Added in version 1.12.0.

El módulo Tunnel (ngx_http_tunnel_module) gestiona solicitudes CONNECT de HTTP/1.1 y establece una conexión virtual de extremo a extremo entre el cliente y un servidor backend, lo que permite que Angie actúe como proxy de reenvío (forwarding proxy).

El acceso al túnel se controla con las directivas de acceso estándar: auth_basic, satisfy, y auth_delay.

Ejemplo de configuración#

http {

    map $host $allow_host {
        hostnames;

        example.org    1;
        *.example.org  1;
    }

    server {
        listen 8000;

        resolver 127.0.0.53;

        if ($allow_host != 1) {
            return 502;
        }

        tunnel_pass;
    }
}

Directivas#

tunnel_bind#

Sintaxis

tunnel_bind address [transparent] | off;

Predeterminado

Contexto

http, server, location

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

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

tunnel_bind $remote_addr transparent;

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

tunnel_buffer_size#

Sintaxis

tunnel_buffer_size size;

Predeterminado

tunnel_buffer_size 4k|8k;

Contexto

http, server, location

Establece el size del buffer usado para leer datos del servidor backend. También establece el size del buffer usado para leer datos del cliente.

tunnel_connect_timeout#

Sintaxis

tunnel_connect_timeout time;

Predeterminado

tunnel_connect_timeout 60s;

Contexto

http, server, location

Define un tiempo de espera para establecer una conexión con un servidor backend. Cabe señalar que este tiempo de espera normalmente no puede superar los 75 segundos.

tunnel_next_upstream#

Sintaxis

tunnel_next_upstream error | timeout | off ...;

Predeterminado

tunnel_next_upstream error timeout;

Contexto

http, server, location

Especifica en qué casos una solicitud debe pasarse al siguiente servidor:

error

se produjo un error al establecer una conexión con el servidor o al leer datos de este;

timeout

se produjo un tiempo de espera agotado al establecer una conexión con el servidor, al pasarle una solicitud o al leer datos de este;

off

deshabilita el paso de una solicitud al siguiente servidor.

Pasar una solicitud al siguiente servidor solo es posible si aún no se ha enviado nada a un cliente. Si se produce un error o un tiempo de espera agotado en medio de la transferencia de una respuesta, es imposible solucionarlo.

La directiva también define qué se considera un intento fallido de comunicación con un servidor. Los casos de error y timeout siempre se consideran intentos fallidos, incluso si no se especifican en la directiva.

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

tunnel_next_upstream_timeout#

Sintaxis

tunnel_next_upstream_timeout time;

Predeterminado

tunnel_next_upstream_timeout 0;

Contexto

http, server, location

Limita el tiempo durante el cual una solicitud puede pasarse al siguiente servidor. El valor 0 desactiva esta limitación.

tunnel_next_upstream_tries#

Sintaxis

tunnel_next_upstream_tries number;

Predeterminado

tunnel_next_upstream_tries 0;

Contexto

http, server, location

Limita el número de intentos posibles para pasar una solicitud al siguiente servidor. El valor 0 desactiva esta limitación.

tunnel_pass#

Sintaxis

tunnel_pass [address];

Predeterminado

Contexto

server, location, if in location

Habilita la gestión de solicitudes CONNECT y establece la dirección de un servidor backend. Por defecto, la address es $host:$request_port y se toma de la solicitud del cliente. En la mayoría de los casos, tunnel_pass no requiere configurar ningún argumento.

La dirección puede especificarse como un nombre de dominio o una dirección IP, y un puerto:

tunnel_pass localhost:9000;

o como una ruta de socket de dominio UNIX:

tunnel_pass unix:/tmp/backend.socket;

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

El valor del parámetro puede contener variables. En este caso, si una dirección se especifica como un nombre de dominio, el nombre se busca entre los grupos de servidores descritos y, si no se encuentra, se determina usando un resolver.

tunnel_read_timeout#

Sintaxis

tunnel_read_timeout time;

Predeterminado

tunnel_read_timeout 60s;

Contexto

http, server, location

Establece el tiempo de espera entre dos operaciones sucesivas de lectura o escritura en las conexiones del cliente o del servidor backend. Si no se transmiten datos dentro de este tiempo, la conexión se cierra.

tunnel_send_lowat#

Sintaxis

tunnel_send_lowat size;

Predeterminado

tunnel_send_lowat 0;

Contexto

http, server, location

Si la directiva se establece en un valor distinto de cero, Angie intentará minimizar el número de operaciones de envío en las conexiones salientes a un servidor backend usando ya sea el flag NOTE_LOWAT del método kqueue, o la opción de socket SO_SNDLOWAT, con el size especificado.

Esta directiva se ignora en Linux, Solaris y Windows.

tunnel_send_timeout#

Sintaxis

tunnel_send_timeout time;

Predeterminado

tunnel_send_timeout 60s;

Contexto

http, server, location

Establece un tiempo de espera para transmitir datos al servidor backend. El tiempo de espera se establece solo entre dos operaciones de escritura sucesivas, no para toda la transmisión. Si el servidor backend no recibe nada dentro de este tiempo, la conexión se cierra.

tunnel_socket_keepalive#

Sintaxis

tunnel_socket_keepalive on | off;

Predeterminado

tunnel_socket_keepalive off;

Contexto

http, server, location

Configura el comportamiento de "TCP keepalive" para las conexiones salientes a un servidor backend. Por defecto, para el socket están en vigor los ajustes del sistema operativo. Si la directiva se establece en el valor on, la opción de socket SO_KEEPALIVE se activa para el socket.