.. _proxies: Proxies ======= Un :dfn:`proxy` es una máquina que hace de intermediario en la comunicación entre cliente y servidor. Estas comunicaciones se establecen con protocolos de capa de aplicación y, en consecuencia, los *proxies* interceptan y gestionan tráfico de aplicación. Tipos ----- Citaremos dos clasificaciones: - Atendiendo al lado de la comunicación (cliente o servidor) para el que intermedie: :dfn:`Proxy directo` (generalmente *proxy* a secas) Es aquel que captura las peticiones de los clientes concretos de una red hacia todos los servidores (generalmente en internet y de un tipo específico). .. image:: files/proxy.png :dfn:`Proxy inverso`, Es aquel que captura las peticiones de todos los potenciales clientes dirigidas a los servidores para los que intermedia. La diferencia, pues, entre éstos y los normales es que mientras los *proxies* a secas intermedian entre un conjunto limitado de clientes (los de la red local) y cualquier servidor web, los *proxies* inversos intermedian entre cualquier cliente y el conjunto limitado de servidores web para los que actúa de intermediario. .. image:: files/proxyinverso.png .. warning:: El *proxy* inverso no tiene por qué encontrarse en la misma red local del servidor (o los servidores) web como el gráfico da a entender. Sí es la situación habitual cuando el *proxy* es gestionado por la misma organización que el servidor *web*, pero no lo es en absoluto si se contrata el servicio (p.e. el servicio `cloudflare `_). - Atendiendo al efecto de su presencia, los proxies se dividen en :dfn:`proxy explícito`, que es aquel que deja notas su presencia, y :dfn:`proxy transparente` es aquel cuya presencia pasa desapercibida. Ahora bien, un *proxy* puede ser explícito o transparente para el cliente, para el servidor o para ambos. Por lo general: * Cuando se trata de un *proxy directo*, un *proxy* se entiende **transparente**, cuando los clientes no notan su presencia, esto es, cuando creen comunicarse directamente con los servidores a los intentan acceder. De hecho, que un *proxy* sea **explícito** implica configurar los propios clientes para obligarlos a pasar por el *proxy*. * En caso de un *proxy inverso*, un *proxy* es **transparente** cuando el servidor para el que media cree recibir las peticiones directamente de los clientes, esto es, los paquetes entrantes tienen por |IP| de origen la del cliente y no la del *proxy*. .. image:: files/proxytransparente.png .. _proxies-freq: *Proxies* frecuentes -------------------- :dfn:`Proxy DNS`, que es aquel *proxy directo* que se encarga de obtener de un servidor |DNS| las resoluciones de nombres solicitadas por sus clientes y cachearlas a fin de acelerar las solicitudes posteriores. :ref:`dnsmasq ` es un ejemplo de *proxy* de este tipo. :dfn:`Proxy ARP` Es aquel que captura las peticiones |ARP| de las máquinas de una subred sobre máquinas de otra subred, enviando su propia dirección |MAC| a fin de que estas dirijan hacia él los paquetes para las máquinas de la otra subred. .. image:: files/proxyarp.png En la figura la máquina *192.168.0.200/23* entiende que la subred *192.168.1.0/24* forma parte de su red, así que al intentar conectar con una máquina de esa subred enviará una petición |ARP|, no el paquete directamente a una puerta de enlace. :dfn:`Proxy web` Es aquel *proxy* especializado en la intermediación de peticiones |HTTP| y |HTTP|\ s. Dependiendo de si actúa como *proxy directo* o *proxy inverso*, cumple distintas funciones: * Como *proxy directo* puede: - Establecer permisos u horarios de acceso, cuotas o anchos de banda según los usuarios que se definan. - Filtrar contenidos bien porque la organización los considere inapropiados, bien porque se consideran *spam* o *publicidad intrusiva*. - Cachear contenido a fin de acelerar las respuestas y ahorrar ancho de banda. Las dos últimas tareas exigen vigilar el tráfico circulante, lo cual es posible sólo cuando no está cifrado, esto es, cuando el tráfico es |HTTP|. Cuando el tráfico es, en cambio, |HTTP|\ s la información es inaccesible y en principio, no hay forma de llevar a cabo estas dos tareas. Sin embargo, la :ref:`extensión SNI ` de |TLS| envía, al menos, el nombre de dominio sin cifrar durante la fase de negociación, lo cual posibilita las labores de filtrado, siempre que éste se base exclusivamente en el nombre del dominio. .. note:: Como alternativa de filtrado a través del nombre de dominio, pueden usarse los :ref:`sumideros DNS `. * Como *proxy inverso* puede: - Si son varios los servidores de respaldo, balancear la carga entre todos ellos. - Absorber el tráfico excesivo (p,e, ataques |DoS|). - Cachear selectivamente páginas para agilizar las respuestas, lo cual, si el tráfico es |HTTP|\ s, implica trasladar el punto extremo de la conexión cifrada al propio *proxy*. Cachean tanto contenido estático (lo cual ahorra ancho de banda al servidor y evita que tenga que atender la petición) como contenido dinámico, lo cual libera al servidor de tener que regenerar constantemente las mismas páginas. En este último caso, el cacheo debe ser muy cuidadoso ya que se corre el riesgo de entregar información obsoleta. .. _dpi: :dfn:`Proxy DPI` Es aquel *proxy* directo que se encarga de inspeccionar a fondo los paquetes que pasan por él con el fin de encontrar algún incumplimiento en la política predefinida, habilitar una :ref:`calidad de servicio ` o por mera intención estadística. Reciben el nombre |DPI| (inspección profunda de paquetes, en castellano), precisamente por esa causa, donde *profunda* o *a fondo* implica el análisis de metainformación de capa 7 o incluso el contenido. En cierta medida, un proxy *web* directo es una herramienta de este tipo, aunque centrada exclusivamente en el protocolo |HTTP|. Por ejemplo, si la política de una organización es que hacia el puerto **443** sólo puede establecerse comunicaciones web cifradas seguras, la herramienta |DPI| se encargará de: - Desechar cualquier tráfico que no sea |TLS|. - Rechazar cualquier conexión en la que el certificado no sea válido (caducado, autofirmado, etc.). .. _socks: :dfn:`Proxy SOCKS` Es un servicio cliente-servidor que canaliza una conexión |TCP| o |UDP|\ [#]_ realizada en la parte cliente hasta la parte servidor, a fin de que ésta realice la conexión, reciba la respuesta y la entregue a la parte cliente. :ref:`OpenSSH ` actúa como *proxy* SOCKS al realizar :ref:`túneles dinámicos `. En ese mismo epígrafe se propuso :command:`tsocks` como cliente. .. rubric:: Contenidos .. toctree:: :glob: :maxdepth: 2 [0-9]* .. rubric:: Notas al pie .. [#] |UDP| sólo a partir de la versión 5 del protocolo. .. |ARP| replace:: :abbr:`ARP (Address Resolution Protocol)` .. |MAC| replace:: :abbr:`MAC (Media Access Control)` .. |SNI| replace:: :abbr:`SNI (Server Name Indication)` .. |DoS| replace:: :abbr:`DoS (Deny of Service)` .. |TLS| replace:: :abbr:`TLS (Transport Layer Security)` .. |UDP| replace:: :abbr:`UDP (User Datagram Protocol)` .. |TCP| replace:: :abbr:`TCP (Transmission Control Protocol)` .. |DPI| replace:: :abbr:`DPI (Deep Packet Inspection)`