NAT Este documento tiene por objeto introducir al lector en los principios básicos de la traducción de direcciones de red para habilitar una conexión a Internet de una red privada a través de un servidor de red. En sistemas Windows se verá la Conexión compartida a Internet y el servicio Acceso remoto. En sistemas Linux se presentará detalladamente el sistema netfilter y su gestión a través de iptables para NAT. NAT by Rafael Lozano is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España License. Información técnica Nivel de usuario: Avanzado Escenario: La instalación y configuración de un servidor FTP se ha realizado y probado sobre dos redes locales virtuales independientes creadas en VirtualBox v4.2. En la primera se ha utilizado un servidor Windows Server 2012 y un cliente Windows 8 con la siguiente configuración: Hostname Máquina Virtual SO Conexiones de Red Hardware Red NAT Dinámica en 172.16.0.0/16 Red Interna red_windows Servidores Puerta de de Nombres Enlace Software adicional 192.168.20.1/24 172.16.0.1 Ninguno SeWiPr WS 2012 HD 30GB RAM 1,5GB 172.16.0.1 SeWiSe WS 2012 HD 30GB RAM 1,5GB 192.168.20.10/24 192.168.20.1 192.168.20.1 Ninguno reservada DHCP CW W8 HD 15GB RAM 1 GB Dinámica en 192.168.20.0/24 192.168.20.1 192.168.20.1 Ninguno En la siguiente red se ha empleado un servidor Lubuntu 13.04 y un cliente con el mismo sistema operativo, según la siguiente configuración Hostname Máquina Virtual SO Conexiones de Red Hardware Red NAT Red Interna red_linux Servidores Puerta de de Nombres Enlace Software adicional 172.16.0.1 Ninguno SeLiPr Lubuntu 13.04 HD 5GB Dinámica en RAM 512MB 172.16.0.0/16 192.168.21.1/24 172.16.0.1 SeLiSe Lubuntu 13.04 HD 5GB RAM 256 MB 192.168.21.10/24 192.168.21.1 192.168.21.1 Ninguno reservada DHCP CL Lubuntu 13.04 HD 5GB RAM 256 MB Dinámica en 192.168.21.0/24 192.168.21.1 192.168.21.1 Ninguno Para que los clientes de una red privada puedan acceder a Internet a través de un servidor NAT es necesario que los servidores DHCP estén configurados correctamente y funcionando para que los clientes puedan obtener una configuración de red. También, es fundamental que los servidores DNS estén habilitados como caché DNS, tal y como se vio en el capítulo dedicado a DNS. Así, los clientes podrán disponer de direccionamiento IP y resolución de nombres. Conocimientos previos: Es necesario tener conocimientos teóricos y prácticos de la configuración TCP/IP de una interfaz de red, en plataformas Windows y Linux. Para la parte de Linux se necesita saber el uso de un editor de texto plano, como nano o vi, además de los comandos básicos de Unix en gestión de archivos y directorios. Fecha del documento: Julio 2013 I Esquema de red: La conexión de red es la siguiente II Tabla de contenido Tabla de contenido 1. Introducción la traducción de direcciones de red.....................................................................1 1.1 Tipos de NAT.................................................................................................................................................3 2. NAT en Windows Server...................................................................................................................4 2.1 Conexión compartida a Internet..............................................................................................................5 2.2 Enrutamiento y acceso remoto................................................................................................................8 2.2.1 Servidor DHCP en Enrutamiento y acceso remoto.........................................................................11 2.2.2 Resolución de nombres en NAT........................................................................................................... 12 2.2.3 Conjunto de direcciones........................................................................................................................ 13 2.2.4 DNAT........................................................................................................................................................... 14 3. Iptables.............................................................................................................................................. 16 3.1 Flujo de paquetes......................................................................................................................................16 3.2 Sintaxis de iptables...................................................................................................................................18 3.2.1 Tablas.......................................................................................................................................................... 18 3.2.2 Comandos................................................................................................................................................. 18 3.2.3 Cadenas...................................................................................................................................................... 19 3.2.4 Reglas.......................................................................................................................................................... 20 3.3 NAT con iptables........................................................................................................................................24 3.3.1 Opciones específicas de iptables para NAT......................................................................................25 3.3.2 Activar el enrutamiento en el kernel................................................................................................... 25 3.3.3 Enmascaramiento IP............................................................................................................................... 26 3.3.4 SNAT............................................................................................................................................................ 26 3.3.5 DNAT........................................................................................................................................................... 27 3.3.6 Redirección................................................................................................................................................ 27 3.4 Script de inicio de servicio.......................................................................................................................28 4. Bibliografía........................................................................................................................................33 Índice I Rafael Lozano NAT NAT 1. Introducción la traducción de direcciones de red El número de usuarios en hogares y pequeños negocios que quiere usar Internet está en continuo incremento. Al principio, un usuario se conectaba a Internet mediante una línea teléfonica básica, lo que significa que estaba conectado durante un período de tiempo específico. Un ISP con un bloque de direcciones podía asignar dinámicamente una dirección a este usuario. Pero actualmente la situación es distinta. Los usuarios en hogares y pequeños negocios pueden estar conectados mediante una línea ADSL o un cable MODEM. Además, muchos no son felices con una dirección; pueden haber creado redes pequeñas con varios nodos y necesitan una dirección IP para cada uno. Con la escasez de direcciones, esto representa un serio problema. Una solución rápida para este problema es la traducción de direcciones de red (NAT). NAT permite a un usuario tener internamente un gran conjunto de direcciones y una dirección, o un conjunto de pequeñas direcciones, de cara al exterior. El tráfico interior puede usar el conjunto grande; el tráfico exterior el conjunto pequeño. Para separar las direcciones usadas dentro del hogar o el negocio y las usadas para Internet, las autoridades de Internet han reservado tres rangos de direcciones como direcciones privadas, como se muestra en la siguiente tabla. Clase A B C Dirección inicial 10.0.0.0/8 172.16.0.0/16 192.168.0.0/24 Dirección final 10.255.255.255/8 172.31.255.255/16 192.168.255.255/24 Nº de Hosts 224 = 16777216 216 x 16= 1048576 216 = 65536 Cualquier organización puede usar direcciones de estos conjuntos sin permiso de las autoridades de Internet. Todo el mundo sabe que estas direcciones reservadas son para redes privadas. Son únicas dentro de la organización, pero no globalmente. Ningún enrutador reenviará al exterior un paquete que tiene esta dirección como dirección de destino. La siguiente figura ilustra una red privada que tiene conexión a Internet a través de un Página 1 Rafael Lozano NAT dispositivo NAT. Figura 1.- NAT Como muestra la figura, la red privada usa direcciones privadas. El enrutador que conectará redes a la dirección global usa una dirección privada y una dirección global. La red privada es transparente al resto de Internet; el resto de Internet es sólo el enrutador NAT con la dirección 200.24.5.8. Todos los paquetes de salida pasan a través del enrutador NAT, que sustituye la dirección origen en el paquete con la dirección global NAT. Todos los paquetes de entrada pasan también a través del enrutador NAT, que sustituye la dirección destino en el paquete (la dirección global del enrutador NAT) con la dirección privada apropiada. La figura muestra un ejemplo de traducción de direcciones. Figura 2.- Traducción de direcciones La traducción de la dirección origen para los paquetes que salen es directa. Pero ¿cómo sabe el enrutador NAT la dirección destino para un paquete que llega de Internet? Puede haber decenas o cientos de direcciones privadas IP, cada una de las cuales pertenece a uno específico. El problema se resuelve si el enrutador NAT tiene una tabla de traducción. Figura 3.- Tabla de traducción En su forma más sencilla, cuando se tiene una sola dirección IP externa, la tabla de traducción tiene sólo dos columnas: la dirección privada y la dirección externa (dirección destino del paquete). Cuando el enrutador traduce la dirección origen del paquete que sale, también toma nota de la dirección destino, dónde va el paquete. Cuando llega la respuesta del destino, el enrutador usa la Página 2 Rafael Lozano NAT dirección origen del paquete (como la dirección externa) para hallar la dirección privada del paquete. La figura anterior muestra la idea. Obsérvese que las direcciones que cambian (son traducidas) se muestran en gris. Con esa estrategia, la comunicación siempre debe ser iniciada por la red privada. El mecanismo NAT descrito necesita que la red privada comience la comunicación. Como veremos, NAT se usa principalmente por los ISP que asignan una única dirección a un cliente. Sin embargo, el cliente puede ser miembro de una red privada que tiene muchas direcciones privadas. En este caso, la comunicación con Internet siempre es iniciada desde el lado del cliente, usando un programa cliente como HTTP o FTP para acceder al correspondiente programa servidor. 1.1 Tipos de NAT La traducción de direcciones de red es un término que habitualmente se refiere al cambio de la dirección IP origen de un paquete proveniente de la red privada y que antes de salir a Internet, o a una red más externa, es cambiada por la dirección IP de la interfaz de red por la que va a ser expedido. Sin embargo, podemos encontrarnos con los siguientes tipos de NAT ✔ Enmascaramiento.- En este caso la dirección IP origen de los paquetes de la red privada se cambia por la dirección IP de la interfaz de red del equipo NAT conectada a Internet o a una red más externa. Esta dirección IP está asignada dinámicamente. ✔ SNAT o NAT en el origen.- Similar al anterior, pero en este caso la dirección IP del equipo NAT está asignada estáticamente. ✔ DNAT o NAT en el destino. En este caso lo que se cambia en el paquete es la dirección de destino en lugar de la de origen. Esta traducción se emplea cuando un servicio que se está ejecutando en un equipo de la red privada quiere ser puesto a disposición de los usuarios de Internet. Para explicar mejor estos conceptos consideremos la siguiente red Figura 4.- Red con equipo NAT Disponemos de un servidor NAT que tiene dos tarjetas de red. La primera está conectada a Internet y tiene dirección IP 217.216.164.166, mientras que la segunda está conectada a la red privada 192.168.20.0/24. Todos los paquetes de los clientes de la red privada, cuya dirección origen está en 192.168.20.0/24, serán traducidos cambiando su dirección origen por la dirección IP de la tarjeta de red del equipo NAT por la que van a salir a Internet, en este caso, 217.216.164.166. Si esta dirección IP hubiera sido asignada dinámicamente, entonces estaríamos ante Página 3 Rafael Lozano NAT enmascaramiento. Pero si esta dirección IP estuviera asignada estáticamente sería un SNAT. Para explicar ahora DNAT supongamos que un PC de la red privada está ejecutando el servicio WWW y quisiéramos que los clientes que están conectados a Internet pudieran acceder a este servicio a través del equipo NAT. Estos clientes solamente tienen acceso al equipo NAT y para ellos es como si este equipo fuera el servidor web. Sin embargo, se puede configurar NAT para que todos los paquetes que le llegan destinados a él (dirección IP 217.216.166.164) y van dirigidos al servidor WWW (puerto TCP 80) se les cambie la dirección IP de destino por la 192.168.20.5 y posteriormente son reenviados al servidor web. La respuesta del servidor web será enviada al equipo NAT que volverá a hacer una traducción (enmascaramiento o SNAT) para posteriormente reexpedirla a su destino en Internet. 2. NAT en Windows Server Para configurar una conexión a Internet traducida, se puede usar uno de estos métodos. ✔ Compartir conexión a Internet de Conexiones de red en Windows XP, Windows Server 2003, Standard Edition o Enterprise Edition. ✔ Protocolo de enrutamiento NAT proporcionado con el servicio Acceso remoto en los servidores que ejecutan Windows Server. Tanto Compartir conexión a Internet como el servicio Acceso remoto suministran servicios de traducción, direccionamiento y resolución de nombres a los PC’s de la red privada. La característica Compartir conexión a Internet está diseñada para proporcionar una configuración sencilla y rápida, a fin de suministrar una conexión traducida a Internet para todos los equipos de la red privada. Sin embargo, una vez habilitada, no permite más configuración que la de los servicios y puertos de la red privada a los que se puede acceder desde fuera. El servicio Acceso remoto está diseñado para proporcionar la máxima flexibilidad en la configuración del servidor para proporcionar una conexión traducida a Internet. Este servicio dispone de una configuración más compleja, aunque la mayor parte de la misma se puede realizar mediante un asistente. Admite intervalos de direcciones IP de un ISP y la configuración del intervalo de direcciones IP asignadas a los PC’s de la red privada. En la tabla siguiente se resumen las características y capacidades de Compartir conexión a Internet y del servicio Acceso remoto. Conexión compartida a Internet Configuración con una única casilla de verificación Dirección IP pública única Intervalo fijo de direcciones para PC’s de la red privada Interfaz de red privada única Traducción de direcciones de red Configuración manual Varias direcciones IP públicas Intervalo configurable de direcciones para PC’s de la red privada Varias interfaces de red privada Además, existe la posibilidad de establecer un filtrado del tráfico que se intercambian la red privada y la red publica mediante un cortafuegos por filtrado IP. Página 4 Rafael Lozano NAT 2.1 Conexión compartida a Internet Con la característica Conexión compartida a Internet (ICS, Internet Connection Sharing) de Conexiones de red, se puede conectar la red privada a Internet. Al habilitar ICS en el servidor conectado a Internet, estamos proporcionando los siguientes servicios a los equipos de la red privada: ✔ Traducción de direcciones de red (NAT). ✔ Asignación de direcciones IP (DHCP) en la red privada 192.168.137.0/24 ✔ Resolución de nombres (Proxy DNS). Si se ha habilitado ICS en una conexión de red, aparecerá Compartido en el icono de Conexiones de red. Después de habilitar ICS los usuarios pueden acceder a Internet como si estuvieran conectados directamente al ISP. El equipo ICS se conecta al ISP y crea la conexión para que el usuario pueda tener a Internet. ICS se ha diseñado para su uso en un entorno doméstico o de oficina pequeña en el que la configuración de la red y la conexión a Internet se administran en el equipo en el que reside la conexión compartida. Se supone que ese equipo tiene la única conexión a Internet de la red, la única puerta de enlace a Internet y que ICS configura todas las direcciones de red internas. ICS requiere dos tarjetas de red para poder funcionar: una conexión pública y una conexión privada. La conexión privada conecta el equipo ICS a los equipos de la red privada. La conexión pública, que suele ser un módem ADSL, por cable o de acceso telefónico, conecta la red a Internet. Al habilitar ICS en la tarjeta de red que conecta a Internet seleccionará automáticamente la tarjeta de red conectada a la red privada, en el caso de que solamente haya una. Si hay dos o más conexiones a la red, debe realizar una de las acciones siguientes para habilitar ICS: 1. Seleccionar una conexión de red que será la parte privada de la conexión compartida a Internet. En este caso solamente los PC’s de la red privada conectada a la conexión de red seleccionada podrán acceder a Internet a través de la conexión compartida. 2. Si disponemos en nuestro sistema de varias tarjetas de red y queremos habilitar ICS para que todas las redes privadas conectadas a ellas puedan utilizar la conexión compartida a Internet deberemos previamente construir un puente de red para incluir todas las conexiones privadas de la red, de forma que el puente de red actúe como parte privada de la conexión compartida a Internet. Si se configura el puente de red para incluir todas las conexiones de la red, el puente de red se selecciona automáticamente como la conexión privada al habilitar ICS. Al habilitar ICS, el adaptador de red conectado a la red privada recibe una nueva configuración de dirección IP estática (192.168.137.1). En consecuencia, al habilitar ICS, las conexiones TCP/IP establecidas entre un equipo de la red privada y el equipo ICS se pierden y deben establecerse de nuevo. También, cuando se habilita ICS, ciertos protocolos, servicios, interfaces y rutas se configuran automáticamente. Una configuración importante es la conversión automática del equipo ICS en un servidor DHCP para la red privada. DHCP distribuye direcciones IP a los usuarios cuando inician los equipos. Página 5 Rafael Lozano NAT En la siguiente tabla se describe cada uno de los protocolos, servicios, interfaces y rutas que se configuran automáticamente al habilitar ICS. Elemento configurado Dirección IP 192.168.137.1 Servicio ICS Asignador DHCP Proxy DNS Acción Se configura con la máscara de subred 255.255.255.0 en el adaptador de LAN que está conectado a la red privada. Iniciada Se habilita con el intervalo predeterminado de 192.168.137.0 y la máscara de subred 255.255.255.0. Se asignan direcciones únicas en el intervalo comprendido entre 192.168.137.2 y 192.168.137.254 a los clientes de la red privada. Habilitado Para configurar ICS seguir los siguientes pasos: 1. En el equipo que actuará como NAT abrir Conexiones de red en Redes e Internet del Panel de Control. 2. Sobre la conexión de red que está conectada a Internet o a la red pública hacer clic con el botón derecho del ratón y seleccionar la opción Propiedades. 3. Hacer clic en la pestaña Uso compartido. 4. Activar la casilla Permitir que los usuarios de otras redes se conecten a través de la conesión a Internet de este equipo. Página 6 Rafael Lozano NAT Figura 5.- Habilitar ICS 5. Aparecerá un cuadro de dialogo que nos informa sobre la asignación de la dirección IP 192.168.137.1 a la tarjeta de red conectada a la red privada. Hacer clic en el botón Si. Figura 6.- Asignación dirección IP a la tarjeta de red privada A partir de ahora los PC's de la red privada pueden salir a Internet. Si arrancamos el cliente de Windows y obtenemos las propiedades de red vemos que ha obtenido una dirección IP y demás parámetros de red del servidor con la conexión compartida a Internet activada, y naturalmente, puede acceder a Internet a través de éste. Página 7 Rafael Lozano NAT Figura 7.- Configuración de la conexión de red en el cliente Como se puede apreciar en la figura anterior, el cliente ha obtenido una dirección IP en la subred 192.168.137.0/24 del servidor DHCP que incluye ICS. La puerta de enlace y el servidor DNS también son el servidor ICS. La característica ICS está disponible en todas las versiones de Windows, inclusive aquellas destinadas a PC's domésticos como Windows 7 y 8. En versiones server de Windows existe la posibilidad de que esté instalado y en funcionamiento los servicios DHCP y DNS, que sustituirían a sus homólogos incorporados en ICS. En este caso, solamente habría que configurar la conexión de red privada del servidor ICS con la dirección IP adecuada, en lugar de la 192.168.137.1 que automáticamente asigna Windows. 2.2 Enrutamiento y acceso remoto ICS es una solución para redes pequeñas en las que no hay funcionando un servidor que incluya los componentes necesarios para dar salida a Internet a los clientes de la red. Sin embargo, tiene unas limitaciones que impide su aplicación en redes corporativas mayores. En estos casos, es aconsejable utilizar el servicio de Enrutamiento y acceso remoto. Este servicio no solo se emplea para realizar traducción de direcciones entre dos redes. Esta es una de sus múltiples funciones. Además permite a los usuarios remotos acceder de forma segura a recursos compartidos de la red interna sin necesidad de conectarse a una red privada virtual (VPN). También incluye un enrutador software para regular el tráfico entre varios segmentos de red y acceso remoto a los equipos mediante redes privadas virtuales. Página 8 Rafael Lozano NAT En el caso que nos ocupa, se puede configurar una red privada de casa o de la oficina para compartir una única conexión a Internet. NAT consta de los siguientes componentes: ✔ Componente para la traducción.- El servidor con Enrutamiento y acceso remoto donde NAT está habilitado traduce las direcciones IP y los números de puerto TCP/UDP de los paquetes que se envían entre la red privada e Internet. ✔ Componente para el direccionamiento.- El equipo NAT proporciona configuración TCP/IP a los demás equipos de la red. Si no está instalado un servidor DHCP, puede utilizarse este componente. El componente de direccionamiento es un servidor DHCP simplificado que asigna una dirección IP, una máscara de subred, una puerta de enlace y la dirección IP de un servidor DNS. ✔ Componente para la resolución de nombres.- El equipo NAT se convierte en un servidor DNS para los demás equipos de la red privada. Cuando el equipo NAT recibe las peticiones de la resolución de nombres, las reenvía al servidor DNS que tiene configurado y devuelve las respuestas al equipo de la red privada. Para la instalación de este servicio hay que seguir los siguientes pasos: 1. Abrir Administrador del servidor. 2. En el Panel hacer clic en Agregar roles y características. 3. En Antes de comenzar hacer clic en el botón Siguiente. 4. En Tipo de instalación activar Instalación basada en características o roles y hacer clic en el botón Siguiente. 5. En Selección de servidor seleccionar el servidor y hacer clic en el botón Siguiente. 6. En Seleccionar roles de servidor activar Acceso remoto. 7. En el cuadro de diálogo Asistente para agregar roles y características nos informa de las herramientas necesarias para el servicio que se está instalando y haremos clic en el botón Agregar características. Posteriormente hacer clic en el botón Siguiente. 8. En Seleccionar características haremos clic en el botón Siguiente. 9. En Acceso remoto nos informa sobre la funcionalidad de este servicio. Hacer clic en el botón Siguiente. 10. En Seleccionar servicios de rol activar Enrutamiento. Posteriormente hacer clic en el botón Siguiente. 11. En Confirmar selecciones de instalación haremos clic en el botón Instalar. 12. Cuando acabe la instalación hacer clic en el botón Cerrar. Cuando termine de instalarse el servicio será necesario configurarlo como NAT. Antes de nada hay que deshabilitar ICS, en el caso de que estuviera habilitada, ya que ambos componentes ofrecen el mismo servicio. Tendremos que ir a la pestaña Uso compartido de las propiedades de la conexión de red externa y desactivar la casilla Permitir que los usuarios de otras redes se conecten a través de la Página 9 Rafael Lozano NAT conesión a Internet de este equipo. Posteriormente, para configurar el servicio de Enrutamiento y acceso remoto seguiremos los siguientes pasos: 1. Abrir Enrutamiento y acceso remoto en Herramientas de Administrador del servidor. 2. En el complemento de administración del servicio de enrutamiento y acceso remoto vemos que el servidor no está configurado y si lo seleccionamos aparece en el panel derecho un aviso al respecto. Hacemos clic con el botón derecho del ratón y seleccionamos Configurar y habilitar Enrutamiento y Acceso remoto. 3. En la pantalla de bienvenida hacemos clic en el botón Siguiente. 4. En Configuración debemos elegir la segunda opción Traducción de direcciones de red NAT. Posteriormente hacemos clic en el botón Siguiente. 5. Ahora debemos elegir la conexión de red por la que los clientes de la red privada se conectarán a Internet. En este caso es la conexión externa. La seleccionamos y hacemos clic en el botón Siguiente. 6. Hacer clic en el botón Finalizar. Figura 8.- Función NAT en la configuración de Enrutamiento y acceso remoto Página 10 Figura 9.- Conexión de red externa Rafael Lozano NAT Una vez configurado el servicio iremos al cliente y comprobaremos que puede navegar por Internet. 2.2.1 Servidor DHCP en Enrutamiento y acceso remoto El componente Enrutamiento y acceso remoto configurado para NAT incluye un sencillo servidor DHCP para el caso de que la red no disponga de uno y se desee habilitar el direccionamiento a los clientes de la red privada. De esta forma no será necesario tener que configurar estáticamente cada uno de estos clientes. Para configurarlo seguir los siguientes pasos: 1. Abrir el complemente Enrutamiento y acceso remoto en Herramientas de Administrador del servidor. 2. Desplegar el árbol de la consola hasta llegar a NAT en IPv4. Hacer clic con el botón derecho del ratón y seleccionar la opción Propiedades. 3. Hacer clic la ficha Asignación de direcciones y activar la casilla de verificación Asignar automáticamente direcciones IP usando el asignador DHCP. Figura 10.- Servidor DHCP en NAT 4. Para asignar direcciones IP a clientes DHCP en la red privada, en Dirección IP y Máscara, configurar el intervalo de direcciones IP. 5. Para excluir direcciones de la asignación a clientes DHCP en la red privada, hacer clic en el botón Excluir . Página 11 Rafael Lozano NAT 6. Por cada dirección IP a excluir hacer clic en el botón en Agregar y, a continuación, escribir la dirección IP. Deberemos tener presente dos cosas: ✔ No es necesario activar el servidor DHCP si ya tenemos instalado en el servidor el role DHCP. ✔ Si no tenemos instalado el role DHCP en el servidor y activamos el servidor DHCP en NAT, tendremos que asignar la primera dirección IP de la subred configurada a la conexión de red que conecta a la red privada. 2.2.2 Resolución de nombres en NAT Al igual que antes, podemos habilitar la resolución de nombres para los clientes de la red privada en el caso de que no tengamos ningún servidor DNS en esta red. En realidad, en el Enrutamiento y acceso remoto no se instala un servidor DNS, sino que todas las consultas procedentes de la red privada se reenvían al servidor DNS al que está conectado el servidor NAT y este se encarga de devolver el resultado al cliente que hizo la consulta originalmente. Para habilitar la resolución de nombres para la traducción de direcciones de red seguir los siguientes pasos: 1. Abrir el complemente Enrutamiento y acceso remoto en Herramientas de Administrador del servidor. 2. Desplegar el árbol de la consola hasta llegar a NAT en IPv4. Hacer clic con el botón derecho del ratón y seleccionar la opción Propiedades. Página 12 Rafael Lozano NAT Figura 11.- Resolución de nombres en NAT 3. Para la resolución de nombres de host en un servidor DNS, en la ficha Resolución de nombres, activar la casilla de verificación Clientes que usan el Sistema de nombres de dominio (DNS). Al igual que ocurría con el servidor DHCP, si tenemos instalado el role de servidor DNS no es necesario activar la resolución de nombres. 2.2.3 Conjunto de direcciones Supongamos que tenemos conectado nuestro equipo NAT a Internet y nuestro ISP nos ha asignado varias direcciones IP estáticas. En esta situación podemos configurar este conjunto de direcciones para que la traducción de la dirección origen en los paquetes que provienen de la red privada se haga alternativamente sobre estas direcciones públicas. Para crear un conjunto de direcciones IP estáticas 1. Abrir el complemente Enrutamiento y acceso remoto en Herramientas de Administrador del servidor. 2. Desplegar el árbol de la consola hasta llegar a NAT en IPv4. Hacer clic con el botón derecho del ratón sobre la interfaz de red conectada a Internet en el panel derecho y seleccionar la opción Propiedades. Página 13 Rafael Lozano NAT 3. Hacer clic en la ficha Conjunto de direcciones y, después, en el botón Agregar. Figura 12.- Conjunto de direcciones 4. En Dirección de inicio, escribir una dirección IP inicial y, a continuación, la máscara de red y una dirección IP final para el intervalo en Dirección final. 5. Hacer clic en el botón Aceptar, y repetir los pasos anteriores para tantos intervalos como se necesite agregar. También podemos hacer que los paquetes que provienen de PC's específicos de la red privada sean traducidos siempre con una dirección IP concreta del intervalo de direcciones. Para ello hacemos clic en el botón Reservas... y posteriormente hacemos clic en el botón Agregar para incluir un par dirección IP privada – direccion IP pública. 2.2.4 DNAT La interfaz de red externa o de Internet tiene habilitado el servidor de seguridad básico para impedir que los usuarios externos a la organización puedan acceder a servicios y aplicaciones de la red privada. Sin embargo, existe la posibilidad de que tengamos varios PC’s de nuestra red privada como servidores de diversos servicios, como un servidor web, ftp, correo electrónico, etc. Esto significa que los usuarios de Internet deben poder acceder a estos PC’s de la red privada y para ello es necesario modificar el servidor de seguridad básico para permitir el acceso. Página 14 Rafael Lozano NAT Esto se consigue haciendo un NAT del destino, en el que tenemos que redirigir la dirección IP del destino de los paquetes que llegan a nuestro servidor y desviarlas a las direcciones IP de cada PC de la red privada que están prestando estos servicios. Además, también podemos redireccionar puertos de las solicitudes para enviar estos paquetes a los puertos donde están escuchando las aplicaciones de estos servicios. Para configurar servicios y puertos seguir los siguientes pasos: 1. Abrir el complemente Enrutamiento y acceso remoto en Herramientas de Administrador del servidor. 2. Desplegar el árbol de la consola hasta llegar a NAT en IPv4. Hacer clic con el botón derecho del ratón sobre la interfaz de red conectada a Internet en el panel derecho y seleccionar la opción Propiedades. 3. Hacer clic en la ficha Servicios y puertos y realizar una de las acciones siguientes: a) Si el puerto está asociado a un servicio de red común, examinar la lista incluida en Servicios y seleccionarlo. Se abrirá el cuadro de diálogo Editar servicio y se tiene que introducir la dirección IP del PC de la red privada al que se enviará el paquete. Posteriormente hacer clic en el botón Aceptar. b) Si el puerto no está asociado a un servicio de red común, o no figura en la lista de Servicios, hacer clic en el botón Agregar… Introducir una descripción del servicio, el puerto de entrada, la dirección IP del PC de la red privada que se encarga de atender las solicitudes para este servicio y el puerto de salida. Posteriormente hacer clic en el botón Aceptar. Para deshabilitar un puerto que está asociado a un servicio de red común, examinar la lista incluida en Servicios y desactivar la casilla de verificación correspondiente. Para deshabilitar un puerto previamente agregado, examinar la lista incluida en Servicios y desactivar la casilla de verificación correspondiente al servicio que hemos agregado. Página 15 Rafael Lozano NAT Figura 13.- Servicios www redireccionado a 192.168.20.10 Para quitar un puerto previamente agregado, examine la lista incluida en Servicios, seleccione el servicio que se desea quitar y hacer clic en el botón Eliminar. 3. Iptables Netfilter es un framework disponible en el núcleo Linux que permite interceptar y manipular paquetes de red. Dicho framework permite realizar el manejo de paquetes en diferentes estados del procesamiento. El componente más popular construido sobre Netfilter es iptables, una herramienta de cortafuegos que permite no solamente filtrar paquetes, sino también realizar traducción de direcciones de red (NAT) para IPv4 o mantener registros de log. Iptables es el nombre de la herramienta mediante la cual el administrador puede definir políticas de manipulación de paquetes que circula por la red. Estas políticas se emplean para construir un cortafuegos por filtrado IP o configurar el NAT. No es un servicio, ni una aplicación. Iptables manipula los paquetes mediante reglas que residen en el núcleo del sistema operativo. 3.1 Flujo de paquetes Antes de construir un enrutador NAT es necesario saber y comprender como los paquetes recorren el sistema. El siguiente gráfico muestran los diferentes caminos que pueden recorrer un paquete que ha entrado en el sistema por una interfaz de red o se ha generado localmente. Página 16 Rafael Lozano NAT Figura 14.- Flujo de paquetes en un sistema En el gráfico anterior el sistema tiene dos interfaces de red, eth0 y eth1. El tráfico puede llegar y salir por ambas, pero para facilitar su compresión el gráfico representa tráfico que llega por eth0 y sale por eth1. Cuando un paquete llega por eth0 hay dos posibilidades en cuanto a su destino: 1. El paquete está dirigido al propio sistema. Entonces es un paquete de entrada (INPUT) y se entrega el proceso local al que está destinado. 2. El paquete no tiene como destino el sistema, sino que está transitando hacia otro a través de éste. El paquete es encaminado (FORWARD) por la interfaz eth1 y sale del sistema. 3. Además, un proceso local puede generar tráfico de salida. En este caso los paquetes generados localmente son de salida (OUTPUT) y es enviado al exterior a través de la interfaz eth1. Los mismo sería aplicable si el tráfico entrará por eth1 y saliera por eth0. En el diagrama anterior, los cuadros grises representan fases por las que tienen que pasar los paquetes que transitan por el sistema. Las fases INPUT, OUTPUT Y FORWARD se les conoce como cadenas o conjuntos de reglas por los que pasan los paquetes y que se emplean para construir un cortafuegos ya que permiten filtrar los paquetes que transitan por estas cadenas. Los dos primeros trabajan exclusivamente con paquetes con destino u origen en el servidor local. La cadena FORWARD se utiliza sólo para paquetes que vayan de una interfaz de red a otra. Los cuadros PREROUTING y POSTROUTING son cadenas que se emplean para NAT y enmascaramiento IP que nuestro objetivo principal. El funcionamiento básico de iptables es muy simple. Con este comando creamos reglas de filtrado que se asocian a las cadenas. Cada regla tiene dos componentes: criterio de la regla y acción u objetivo. El primero consiste en un conjunto de condiciones que el paquete tiene que cumplir para aplicarle el segundo. Estas condiciones generalmente hacen referencia a valores de la cabecera del paquete. Por ejemplo, que el paquete tenga un protocolo determinado (TCP, UDP, etc), que la dirección origen o destino sea una específica, que el puerto de origen o destino sean uno concreto, etc. Página 17 Rafael Lozano NAT Si el paquete cumple la regla se le aplica la acción. Esta puede ser desechar el paquete (caso de un cortafuegos), cambiar sus direcciones de origen o destino (caso del NAT) y algunas más que veremos mas adelante. Cuando un paquete entra en el sistema, irá pasando por las diferentes cadenas y se le aplicarán las reglas hasta que encuentre una que cumpla con sus condiciones. Entonces se realiza la acción u objetivo sobre el paquete y no se le aplica ninguna regla más en esa cadena. Pasaría a la siguiente. 3.2 Sintaxis de iptables La sintaxis de iptables es la siguiente: iptables [–t tabla] comando cadena especificación_de_regla [opciones] Esta sintaxis está muy simplificada ya que iptables cuenta con numerosas opciones. Para comprender como trabaja vamos a ver cada componente por separado. 3.2.1 Tablas El primer argumento de iptables consiste en indicar la tabla que se va a manipular. La arquitectura iptables agrupa en tablas las reglas de proceso de paquetes según su función (filtrado de paquetes, traducción de direcciones de red y otras modificaciones de paquetes). Estas tablas son: filter Esta tabla se emplea para el filtrado de paquetes. Establece políticas para los paquetes que entran en el sistema (INPUT), pasan a través del sistema con dirección a otros (FORWARD) y salen del sistema (OUTPUT). A menos que hagamos referencia explícitamente a otra tabla, iptables funcionará por defecto con las cadenas de esta tabla. Sus cadenas integradas son FORWARD, INPUT y OUTPUT mangle Se usa para la alteración especializada de paquetes, como quitarles sus opciones de IP. Sus cadenas integradas son FORWARD, INPUT, OUTPUT, POSTROUTING y PREROUTING. nat Esta tabla se emplea para el enmascaramiento de direcciones de red y la traducción de direcciones, normalmente basándose en las direcciones de origen y destino. Se verá en el siguiente apartado. 3.2.2 Comandos Cada ejecución de la utilidad iptables puede contener un comando, que realiza una operación en una tabla (y, en algunos casos, una cadena) determinada. Las opciones para especificar comandos son las siguientes: ­A, ­­append cadena regla Añade una regla a una cadena. ­D, ­­delete cadena [índice | regla] Elimina la regla que se encuentra en la posición índice o que cumple la regla de cadena. ­X, ­­delete­chain [cadena] Página 18 Rafael Lozano NAT Elimina la cadena definida por el usuario o todas las cadenas definidas por el usuario si no se especifica una. ­E, ­­rename­chain cadena nuevacadena Renombra cadena a nuevacadena. ­F, ­­flush [cadena] Desecha (elimina) todas las reglas de cadena (o de todas las cadenas, si no se especifica una cadena). ­I, ­­insert cadena [índice] regla Inserta regla en cadena, delante de la cadena o delante de la regla, en la posición índice. ­L, ­­list [cadena] Enumera las reglas de cadena (o de todas las cadenas, si no se especifica una cadena) ­N, ­­new­chain cadena Crea una nueva cadena definida por el usuario. ­P, ­­policy cadena objetivo Establece la política predeterminada de la cadena integrada para objetivo (sólo se aplica a las cadenas integradas y a los objetivos). ­R, ­­replace cadena índice regla Sustituye a la regla que se encuentra en la posición índice de cadena por la nueva regla. ­V, ­­version Muestra la versión de iptables. ­Z, ­­zero cadena Pone a cero los contadores de paquetes y bytes para cadena (o de todas las cadenas, si no se especifica una cadena). 3.2.3 Cadenas En la mayoría de los comandos hay que indicar una cadena donde se aplicará la regla. Una cadena es una lista de reglas agrupadas lógicamente. Cada regla de la cadena contiene una especificación o criterios que tienen que cumplir la cabecera del paquete IP para que se le aplique la regla. Los paquetes atraviesan cadenas, exponiéndose a las reglas de la cadena de uno en uno y en orden. Si el paquete no cumple los criterios de la regla, continúa hasta la siguiente regla de la cadena. Si un paquete llega a la última regla de la cadena y todavía no cumple ninguna, se le aplica la política por defecto de la cadena. La política por defecto de una cadena se usa para determinar el destino de los paquetes que llegan al final de la cadena sin que se los haya enviado a un destino determinado. Existen las siguientes cadenas predefinidas para aplicar a los filtros: ✔ INPUT (Cadena de ENTRADA) — Todos los paquetes destinados a este sistema atraviesan esta cadena. Página 19 Rafael Lozano NAT ✔ OUTPUT (Cadena de SALIDA) — Todos los paquetes creados por este sistema atraviesan esta cadena. ✔ FORWARD (Cadena de REDIRECCIÓN) — Todos los paquetes que pasan por este sistema para ser encaminados a su destino recorren esta cadena. Además, existen las dos siguientes cadenas para aplicar al NAT que son: ✔ PREROUTING (Cadena de PREENRUTAMIENTO) — Los paquetes entrantes pasan a través de esta cadena antes de que se consulte la tabla de encaminamiento local, principalmente para DNAT (destination-NAT o traducción de direcciones de red de destino) ✔ POSTROUTING (Cadena de POSTENRUTAMIENTO) — Los paquetes salientes pasan por esta cadena después de haberse tomado la decisión del encaminamiento, principalmente para SNAT (source-NAT o traducción de direcciones de red de origen) 3.2.4 Reglas Una regla iptables consta de uno o más criterios, para determinar a qué paquetes de red afectará, y una especificación de objetivo o acción, que determina cómo afectará a los paquetes de red. Todas las opciones del criterio de una regla deben cumplirse para que se considere que un paquete cumple una regla. El sistema mantiene contadores de paquetes y bytes para cada regla. Cada vez que un paquete llega a una regla y cumple los criterios de la regla, el contador de paquetes aumenta en uno y el contador de bytes se incrementa con el tamaño de ese paquete. Tanto la parte de criterio como la parte del objetivo o acción de la regla son opcionales. Si no hay un criterio, se considera que todos los paquetes concuerdan. Si no se especifica un objetivo, no se hace nada con los paquetes (el procesamiento continuará como si la regla no existiera, excepto que se actualizarán los contadores de paquetes y de bytes). El orden en el que se ponen las reglas de filtrado es determinante. Normalmente cuando hay que decidir que se hace con un paquete se va comparando con cada regla del cortafuegos hasta que se encuentra una cuyo criterio coincide, y se hace lo que dicte el objetivo de esta regla (aceptar o denegar); después de eso no se continuarán comprobando reglas para ese paquete. Este detalle es sumamente importante, porque si ponemos reglas muy permisivas entre las primeras del cortafuegos, puede que las siguientes no se apliquen y no sirvan de nada. Hay una amplia variedad de criterios disponibles para su uso con iptables, aunque algunas sólo están disponibles para núcleos con ciertas funciones. Las concordancias genéricas del Protocolo de Internet (IP) (como de protocolo u origen o dirección de destino) se pueden aplicar a cualquier paquete. Además de las criterios genéricos, iptables incluye muchos criterios especializados, disponibles mediante extensiones que se cargan dinámicamente (usamos la opción iptables ­m o ­­match para indicar a iptables que queremos usar una de estas opciones). Hay una extensión de criterio para ocuparse de una capa de red debajo de la capa IP La extensión de criterio mac busca concordancias basándose en las direcciones del Controlador de acceso a medios (MAC) Ethernet. Página 20 Rafael Lozano NAT Existen muchas opciones para construir el criterio de la regla. Donde se tenga que especificar una máscara de dirección puede hacerse con /N o con /N.N.N.N. Las direcciones también pueden ser nombres de hosts. Los puertos pueden ser números o nombres de servicios. También, el símbolo ! puede usarse con varias opciones para invertir el significado. Las opciones siguientes afectan a criterios del protocolo Ipv4: ­p, ­­protocol [!] protocolo Indica el protocolo del paquete. Si se antepone ! el protocolo del paquete será distinto al indicado. Se acepta all para indicar todos los protocolos. Los protocolos válidos son: tcp, udp, icmp y all ­s, ­­source [!] dirección Dirección origen. Puede ser un nombre de host, una dirección IP o una dirección de red con una máscara. Si no se indica la opción –s equivale a utilizar –s 0/0 que se corresponde con todas las direcciones. ­d, ­­destination [!] dirección Dirección destino. Iguales criterios que -s. ­i, ­­in­interface [!] nombre Nombre de la interfaz de entrada por la que el paquete se recibe (solo para cadena INPUT, PREROUTING y FORWARD). Puede aceptar ! para invertir el sentido. También acepta el sufijo + en el nombre de interfaz indicando todas las interfaces que comienzan por ese nombre. Esta opción se puede referir sólo a la interfaz de entrada, así que no se puede utilizar en la cadena OUTPUT ni en la POSTROUTING. ­o, ­­out­interface [!] nombre Nombre de interfaz de salida por la que el paquete va a salir (solo para cadenas OUTPUT, POSTROUTING y FORWARD). Parecido a -i, pero se aplica sólo a la interfaz de salida y sus correspondientes cadenas. Existen opciones para establecer criterios relacionados con el control de acceso al medio MAC Ethernet. Estas opciones se cargan con la extensión dinámica –m mac y son los siguientes: ­­mac­source [!] direccion El campo MAC origen de la trama Ethernet coincide con dirección. El formato de la dirección es XX:XX:XX:XX:XX:XX Solamente debemos usarlo con reglas de las cadenas PREROUTING, FORWARD o INPUT, y para paquetes que procedan de interfaces de red Ethernet. Las siguientes opciones se emplean para establecer criterios del protocolo TCP, por tanto tienen que ir con la opción –p tcp: ­sport, ­­source­port [!] puerto [:puerto] Especifica un puerto origen o un rango de ellos (los rangos se especifican utilizando - o : para separar el principio y el final del rango).También se puede utilizar con la extensión dinámica multipuerto con la opción –m multipor con la que se pueden enumerar hasta 15 puertos separados por comas. Los fragmentos de la regla pueden tener el siguiente aspecto: ­p tcp ­sport 0:1023 Página 21 Rafael Lozano NAT ­m multiport ­p tcp ­sport 25,110 ­dport, ­­destination­port [!] puerto [:puerto] Parecido al-sport, previo, pero especifica el puerto(s) destino. ­­tcp­flags [!] indicadores indicadores­activos Válido sólo con la opción -p tcp. Esta opción consulta a los indicadores enumerados en el primer argumento. Los indicadores del segundo argumento deben estar activos y el resto inactivo. Los indicadores posibles son: SYN, ACK, FIN, RST, URG, PSH, y ALL NONE. Si quiere examinar los indicadores SYN, ACK, RST y FIN, pero aceptar sólo aquellos con los indicadores SYN y ACK establecidos (respuesta a una conexión nueva) el fragmento de regla tendría este aspecto: ­p tcp ­­tcp­flags SYN,ACK,RST,FIN SYN,ACK [!] ­­syn. Válido sólo siguiendo a la opción -p tcp. Esto es equivalente a lo siguiente: ­­tcp­flags SYN,RST,ACK SYN Esta opción puede usarse para crear reglas que bloqueen las conexiones entrantes y permitan las conexiones salientes. ­­tcp­option [!] numero Válido si se ha establecido la opción número de TCP Las siguientes opciones se emplean para el protocolo UDP por lo que deberán ir acompañadas de la opción –p udp. ­sport, ­­source­port [!] puerto [:puerto] Especifica un puerto origen o un rango de ellos (los rangos se especifican utilizando - o : para separar el principio y el final del rango).También se puede utilizar con la opción de correspondencia multiport (multi-puerto, con la que se pueden enumerar hasta 15 puertos). ­dport, ­­destination­port [!] puerto [:puerto] Parecido al-sport, previo, pero especifica el puerto(s) destino. Por último, los siguientes criterios se aplican al protocolo ICMP, por lo que deberán estar acompañadas de la opción –p icmp. ­­icmp­type [!] tipo | codigo Concuerda con el tipo ICMP indicado o con el código de tipo ICMP. Existen muchos tipos ICMP válidos. Para obtener una lista de ellos se puede ejecutar el comando iptables –p icmp --help Los objetivos o destinos se usan para especificar la acción que se ha de realizar cuando un paquete cumple los criterios de las reglas y también para especificar las políticas por defecto de la cadena. Hay cuatro objetivos integrados en iptables y existen módulos de extensión que proporcionan más. Para especificar un objetivo hay que indicar su nombre con la opción –j como muestra la siguiente sintaxis Página 22 Rafael Lozano NAT ­j objetivo Objetivo de la regla (nombre de cadena definido por el usuario o valor especial), si lo hay. Valores especiales, ACCEPT, DROP, QUEUE o RETURN, terminan la cadena. El objetivo de una regla puede ser el nombre de una cadena definida por el usuario o uno de los destinos ya incorporados ACCEPT, DROP, QUEUE, o RETURN (aceptar, descartar, encolar o retornar, respectivamente). Cuando un destino es el nombre de una cadena definida por el usuario, al paquete se lo dirige a esa cadena para que sea procesado (tal como ocurre con una llamada a una subrutina en un lenguaje de programación). Si el paquete consigue atravesar la cadena definida por el usuario sin que ninguna de las reglas de esa cadena actúe sobre él, el procesamiento del paquete continúa donde había quedado en la cadena actual. Estos llamados entre cadenas se pueden anidar hasta cualquier nivel deseado. Existen los siguientes objetivos ya incorporados: ACCEPT Este destino hace se acepte el paquete. El significado de esto depende de cuál sea la cadena que realiza esta acción. De hecho, a un paquete que se acepta en la cadena INPUT se le permite ser recibido por la terminal (host), a un paquete que se acepta en la cadena OUTPUT se le permite abandonar el sistema y a un paquete que se lo acepta en la cadena FORWARD se le permite ser enrutado a través del sistema. DROP Este objetivo descarta el paquete sin ningún otro tipo de procesamiento. El paquete simplemente desaparece sin indicación de que fue descartado al ser entregado a la terminal de envío o a una aplicación. Esto se le refleja al que envía, a menudo, como un communication timeout (alcance del máximo tiempo de espera en la comunicación), lo que puede causar confusión (aunque el descarte de paquetes entrantes no deseados se considera a veces una buena política de seguridad, pues no da ni siquiera el indicio a un posible atacante de que la terminal existe). QUEUE Este destino hace que el paquete sea enviado a una cola en el espacio de usuario. Una aplicación puede usar la biblioteca libipq, también parte del proyecto netfilter/iptables, para alterar el paquete. Si no hay ninguna aplicación que lea la cola, este destino es equivalente a DROP. RETURN Hace que el paquete en cuestión deje de circular por la cadena en cuya regla se ejecutó el destino RETURN. Si dicha cadena es una cadena de usuario, el paquete continuará por la cadena superior como si nada hubiera pasado. Si por el contrario la cadena es una cadena principal (por ejemplo la cadena INPUT), al paquete se le aplicará la política por defecto de la cadena en cuestión (ACCEPT, DROP o similar). Hay muchos destinos de extensión disponibles. Algunos de los más comunes son: REJECT Este destino tiene el mismo efecto que 'DROP', salvo que envía un paquete de error a quien envió originalmente. Se usa principalmente en las cadenas INPUT y FORWARD de la tabla de filtrado. El tipo de paquete se puede controlar a través del parámetro '--reject-with'. Un paquete de rechazo puede indicar explícitamente que la conexión ha sido filtrada (un paquete ICMP filtrado administrativamente por conexión), aunque la mayoría de los usuarios prefieren que el paquete indique simplemente que la computadora no acepta ese tipo de conexión (tal paquete será un paquete tcp-reset para conexiones TCP denegadas, un icmpport-unreachable para sesiones UDP denegadas o un icmp-protocol-unreachable para Página 23 Rafael Lozano NAT paquetes no TCP y no UDP). Si el parámetro '--reject-with' no se especifica, el paquete de rechazo por defecto es siempre icmp-port-unreachable. LOG (bitácora) Este destino lleva un log o bitácora del paquete. Puede usarse en cualquier cadena en cualquier tabla, y muchas veces se usa para depuración (análisis de fallos, como ver la verificación de qué paquetes están siendo descartados). ULOG Este destino lleva un log o bitácora del paquete, pero no de la misma manera que el destino LOG. El destino LOG le envía información al log del núcleo, pero ULOG hace multidifusión de los paquetes que coinciden esta regla a través de un socket netlink, de manera que programas del espacio de usuario puedan recibir este paquete conectándose al socket. Los siguientes objetivos se emplean para NAT: DNAT Este destino hace que la dirección (y opcionalmente el puerto) de destino del paquete sean reescritos para traducción de dirección de red. Mediante la opción '--to-destination' debe indicarse el destino a usar. Esto es válido solamente en las cadenas OUTPUT y PREROUTING dentro de la tabla de nat. Esta decisión se recuerda para todos los paquetes futuros que pertenecen a la misma conexión y las respuestas tendrán su dirección y puerto de origen cambiados al original (es decir, la inversa de este paquete). SNAT Este destino hace que la dirección (y opcionalmente el puerto) de origen del paquete sean reescritos para traducción de dirección de red. Mediante la opción '--to-source' debe indicarse el origen a usar. Esto es válido solamente en la cadena POSTROUTING dentro de la tabla de nat y, como DNAT, se recuerda para todos los paquetes que pertenecen a la misma conexión. MASQUERADE Esta es una forma especial, restringida de SNAT para direcciones IP dinámicas, como las que proveen la mayoría de los proveedores de servicios de Internet (ISPs) para modems o línea de abonado digital (DSL). En vez de cambiar la regla de SNAT cada vez que la dirección IP cambia, se calcula la dirección IP de origen a la cual hacer NAT fijándose en la dirección IP de la interfaz de salida cuando un paquete coincide con esta regla. Adicionalmente, recuerda cuales conexiones usan MASQUERADE y si la dirección de la interfaz cambia (por ejemplo, por reconectarse al ISP), todas las conexiones que hacen NAT a la dirección vieja se olvidan. REDIRECT Este destino sólo es válido para la tabla NAT y las cadenas OUTPUT y PREROUTING. Es un caso especial del DNAT en el que se redirecciona el paquete a la dirección de la interfaz por la que entró. Su uso principal es para cambiar el puerto de destino. 3.3 NAT con iptables Linux realiza el NAT utilizando iptables, la cual también se emplea para filtrado de paquetes. Básicamente, le permite reescribir las cabeceras de los paquetes según pasan por las cadenas. Estas cabeceras pueden ser escritas según van saliendo del sistema (POSTROUTING) e implica el cambio de la dirección original del sistema que inicia la conexión por la dirección externa del servidor. Un servidor en Internet verá entonces una conexión que se origina en el sistema NAT Dado que la dirección original es la que se cambia, se denomina NAT del origen o SNAT. Página 24 Rafael Lozano NAT Una forma especializada de SNAT, el enmascaramiento de IP, se utiliza comúnmente para permitir que una red con direcciones IP privadas (direcciones IP no encaminables hacia Internet) sea capaz de acceder a Internet. Ambos mecanismos hacen lo mismo, y ambos se pueden utilizar con direcciones IP privadas. Sin embargo, el enmascaramiento de IP está reservado, generalmente, para direcciones IP dinámicas. Si no sabe qué dirección IP se le ha asignado cuando se conecta a su ISP, esto es probablemente lo que tiene, así que necesitará emplear enmascaramiento en lugar de SNAT. El otro tipo de NAT se llama NAT del destino o DNAT. Esta forma de alteración de la dirección se hace antes del encaminamiento y se usa para tomar una conexión inicial al sistema NAT y redirigirla a un sistema interno. En algunos círculos, a este mecanismo se le denomina reencaminamiento de puertos, porque el reencaminamiento generalmente se basa en el puerto inicial de conexión. Esto le permitiría tener sistemas independientes en su red de confianza capaces de manejar HTTP, FTP, correo, DNS y demás, pero aparentando que la máquina NAT es la que está haciendo todo el trabajo. Esta particular forma de alteración de direcciones requiere que disponga de una dirección IP encaminable. Si tiene que utilizar enmascaramiento de IP entonces no podrá utilizar DNAT. 3.3.1 Opciones específicas de iptables para NAT Cuando empleamos iptables para hacer NAT debemos emplear una serie de opciones que nos permitirán alterar las direcciones de origen o destino de los paquetes, en función del tipo de NAT que estemos haciendo. Para ello iptables contiene una serie de opciones que solamente se emplean para este propósito y se añaden al comando detrás de la especificación del objetivo. Son las siguientes: ­­to­source IP[­IP][:port][­port] Se emplea con el destino –j SNAT y la cadena POSTROUTING. Especifica la dirección IP y puerto al que se cambia la dirección de origen. Puede especificarse un rango de direcciones IP de forma que se cambiará la dirección de origen de los paquetes alternativamente con las direcciones especificadas en el rango. También se puede especificar un rango de puertos para indicar los que se permiten en las conexiones al exterior. ­­to­destination IP[­IP][:port][­port] Similar al anterior pero para el destino –j DNAT y la cadena PREROUTING. Especifica la dirección IP y puerto al que se cambia la dirección de destino. Puede especificarse un rango de direcciones IP de forma que se cambiará la dirección de origen de los paquetes alternativamente con las direcciones especificadas en el rango. También se puede especificar un rango de puertos para indicar los que se permiten en las conexiones al interior. ­­to­ports port[­port] Se emplea para el destino –j MASQUERADE y la cadena POSTROUTING o con el destino –j REDIRECT y la cadena PREROUTING o OUTPUT. Especifica el número de puerto al que se cambia el campo puerto de origen. 3.3.2 Activar el enrutamiento en el kernel Antes que nada, tenemos que asegurarnos de que el sistema tiene activado el IP forwarding (reencaminamiento de IP). Para hacerlo, en las distribuciones Debian/Ubuntu, se puede cambiar la variable net.ipv4.ip_forward en el fichero /etc/sysctl.conf de 0 a 1. También se puede incluir una línea como la que sigue en su archivo que contiene el script para construir el enrutamiento con NAT en /etc/init.d: Página 25 Rafael Lozano NAT echo 1 > /proc/sys/net/ipv4/ip forward Todas estas variantes hacen en el fondo lo mismo: cambiar la variable del kernel /proc/sys/net/ipv4/ip_forward a 1 para permitir pasar paquetes de una interfaz a otra. 3.3.3 Enmascaramiento IP Según este esquema los ordenadores de una red privada van a salir a Internet a través del servidor. Supongamos que tenemos una red privada 192.168.21.0/24 a la cual vamos a dar salida a Internet a través del servidor que tiene una dirección IP pública dinámica. El comando iptables que habría que ejecutar sería el siguiente: iptables ­t nat ­A POSTROUTING –s 192.168.21.0/24 ­j MASQUERADE Analicemos el comando anterior. Estamos añadiendo una regla a la cadena POSTROUTING en la tabla NAT. Todo el tráfico cuya dirección origen está en 192.168.21.0/24 será enmascarada su dirección origen con la dirección IP pública del servidor. Se podrían haber añadido más condiciones a la regla, pero en este caso solo necesitamos una: la dirección origen de los paquetes. Tal y como está puesta, tenemos la certeza de que los paquetes van a entrar por eth1, que es la interfaz de red conectada a la red privada, y saldrán por eth0 que es la interfaz de red conectada a la red pública. 3.3.4 SNAT El enmascaramiento IP visto en el apartado anterior es sólo un caso especial de NAT del origen. Si resulta que disponemos de una dirección IP pública y estática, no es necesario enmascaramiento, sino traducción de direcciones de la red origen (SNAT). Es más conveniente utilizar SNAT en lugar de enmascaramiento, siempre que sea posible debido a alguna de las características que trae SNAT. Supongamos la misma red anterior, pero la interfaz eth1 tiene una dirección IP estática 209.127.112.150. Para realizar el SNAT hay que ejecutar el siguiente comando iptables: iptables ­t nat ­A POSTROUTING –s 192.168.21.0/24 ­o eth0 ­j SNAT ­­to­ source 209.127.112.150 La línea anterior dice que puede utilizar la tabla NAT ( ­t nat) y añadirse al final de la cadena POSTROUTING (post-encaminamiento). Va a utilizar la interfaz de salida eth0 (ésta es la interfaz conectada a Internet) y cambiar la dirección de origen del sistema de procedencia ( ­j SNAT) a la dirección IP pública 209.127.112.150 ( ­­to­source 209.127.112.150). Nótese que hemos tenido que añadir la opción ­o eth0, porque si tuvieramos otra tarjeta de red por la que algunos paquetes pudieran salir se les asignaría una dirección IP que no corresponde a esa tarjeta. Así nos aseguramos que a los paquetes que se les cambia la dirección de origen tendrán la dirección IP de su correspondiente tarjeta de red. Este sencillo ejemplo lleva a cabo exactamente la misma función que el ejemplo de MASQUERADE anterior, pero se necesita saber la dirección IP, por tanto, esto no funciona con direcciones IP asignadas dinámicamente. Para poder continuar con los ejemplos, asumamos que disponemos de seis direcciones IP utilizables, y queremos usar cuatro de ellas en el NAT El siguiente ejemplo muestra cómo utilizar iptables para hacer que parezca que los mensajes vienen de una cualquiera de las cuatro direcciones: Página 26 Rafael Lozano NAT iptables ­t nat ­A POSTROUTING ­o eth0 ­j SNAT ­­to­source 209.127.112.150­209.127.112.153 La diferencia entre este ejemplo y el anterior de esta sección, está en la dirección indicada en ­­to­source. Cada conexión que salga utilizará el siguiente número IP Cuando se llegue al último número IP, iptables volverá a utilizar las direcciones desde el primer número. Asumamos también que hay usuarios díscolos en la red, que se han estado conectando a puertos no estándar de fuera de la misma, presumiblemente para actividades no autorizadas (como un chat IRC). Queremos permitirles utilizar sólo los puertos estándar del sistema operativo. Podemos hacer esto también especificando un rango de puertos: iptables ­t nat ­A POSTROUTING ­p tcp ­o eth0 ­j SNAT –to­source 209.127.112.150:0­1023 Ahora las conexiones TCP de salida destinadas a los puertos 0-1023 pasarán a través del NAT. Será necesario añadir una regla UDP porque DNS utiliza el puerto 53 de UDP para la mayoría de las consultas, pero las consultas grandes y las transferencias de zona, utilizarán el puerto TCP 53. 3.3.5 DNAT Complementando la NAT del origen está la NAT del destino (DNAT). Este trabajo de traducción funciona al revés. DNAT da la posibilidad de utilizar direcciones públicas para funciones como servidor FTP, servidor web, servidor de correo, y demás, sin poner en gran riesgo a esos sistemas. Tras un cortafuegos están mejor protegidos. Supongamos a modo de ejemplo que un ordenador de la red privada con dirección IP 192.168.21.50 está ejecutando un servidor web y queremos que los usuarios conectados en Internet accedan a ese servidor web. La regla iptables necesaria sería la siguiente: iptables ­t nat ­A PREROUTING ­p tcp ­­dport 80 ­i eth0 ­j DNAT ­­to­ destination 192.168.21.50:80 Esta regla iptables hará una NAT de preencaminamiento. Esto permite que el cambio de dirección de destino se aplique antes de que el paquete llegue a la tabla de encaminamiento del kernel. Los únicos paquetes que se modifican son los paquetes TCP destinados al puerto 80 (donde está nuestro servidor http) y que entren por eth0 (la tarjeta conectada a Internet). Nuestra regla de NAT del destino (DNAT) dice que hay que redirigir todo el tráfico de esta interfaz en el puerto 80 al puerto 80, asociado a la dirección 192.168.21.50. 3.3.6 Redirección Hay un caso especial del NAT del destino (DNAT) llamado redirección, en el cual por conveniencia se cambia la dirección de destino del paquete a la propia dirección de la interfaz por la que entró. Por ejemplo, supongamos que todas las peticiones al servidor web que tenemos en nuestro servidor queremos desviarlas del puerto 80 al 3128 que es el puerto en el que opera un servidor proxy caché Squid. Tendríamos que escribir el siguiente comando iptables ­t nat ­A PREROUTING ­i eth1 ­p tcp ­­dport 80 ­j REDIRECT ­­to­ports 3128 iptables ­t nat ­A PREROUTING ­i eth1 ­p tcp ­­dport 443 ­j REDIRECT ­­to­port 3128 Página 27 Rafael Lozano NAT 3.4 Script de inicio de servicio Activando el enrutamiento y creando las reglas para hacer el NAT conseguimos que los clientes de una red privada salgan a Internet. No hace falta decir, que esto no es suficiente, ya que los clientes necesitan tener un servidor DHCP para obtener sus parámetros de red y un servidor DNS para resolver consultas. Sin embargo, tanto la activación del enrutamiento como las reglas NAT se mantendrán mientras el PC que actúa como servidor esté encendido. Si este PC se reinicia, el enrutamiento en el kernel vuelve a desactivarse ya que el sistema de archivos /proc contiene una imagen del núcleo en ejecución, y cuando se reinicia se crea otra nueva. Con las reglas iptables ocurre algo parecido ya que estas también se mantienen en el núcleo. Por tanto tenemos que buscar un método que permite mantener el enrutamiento y las reglas NAT cuando el servidor se reinicia. La mejor opción es crear un script de inicio de servicio y guardarlo en /etc/init.d. Posteriormente tendremos que crear los enlaces simbólicos a este script para que se ejecute en los niveles de ejecución adecuados. El script que se muestra a continuación cumple los siguientes requisitos: 1. Permite su ejecución durante el inicio del sistema en los niveles de ejecución 2, 3, 4 y 5 (multiusuario con soporte de red) y se para en los niveles de ejecución 0 (apagado del sistema), 1 (monousuario sin soporte de red) y 6 (reinicio del sistema). 2. El script tendŕá un estilo LSB (Linux Standard Base)1 con una cabecera la configuración de los niveles de ejecución. La cabecera puede tener el siguiente aspecto (solo se incluyen los campos necesarios). ### BEGIN INIT INFO # Provides: activar_nat # Default­Start: 2 3 4 5 # Default­Stop: 0 1 6 # Short­Description: Activación del enrutamiento y las reglas NAT # Description: Este script se emplea para permitir la salida a # Internet de los clientes de una red privada ### END INIT INFO 3. Asumimos que este script se ajusta para permitir la salida a Internet de los PCs de la red interna a través del servidor tal y como se muestra en la figura del esquema de red al principio de este documento. Nos circunscribimos a la red Linux. 4. Para ilustrar el uso del NAT en el destino, suponemos que en el servidor secundario (SeLiSe) tiene un servidor web y se desea permitir su acceso desde la red externa. 5. Ya que el script se ejecuta al inicio sin intervención del usuario, consideramos adecuado que los mensajes de información o error que se produzcan deberían almacenarse en el log del sistema /var/log/syslog. Para ello se emplearán comandos logger. El script /etc/init.d/activar_nat es el siguiente: #!/bin/bash ### BEGIN INIT INFO 1 Para conocer con detalle el formato de la cabecera LSB se puede consultar https://wiki.debian.org/LSBInitScripts. Página 28 Rafael Lozano NAT # Provides: activar_nat # Default­Start: 2 3 4 5 # Default­Stop: 0 1 6 # Short­Description: Activación del enrutamiento y las reglas NAT # Description: Este script se emplea para permitir la salida a # Internet de los clientes de una red privada ### END INIT INFO function error() { echo "Error en la invocación del servicio" echo "Sintaxis: $0 start|stop|restart|status|force­reload" } function muestra_estado() { echo "Estado del NAT" ENRUTAMIENTO=$(cat /proc/sys/net/ipv4/ip_forward) if [ "$ENRUTAMIENTO" = "0" ]; then echo "El enrutamiento está desactivado" else echo "El enrutamiento está activado" fi echo "Reglas NAT" iptables ­t nat ­L } function activa_nat() { # ACTIVAR EL ENRUTAMIENTO ######################################## logger ­s ­t "INFO" "Activando el enrutamiento" echo 1 > /proc/sys/net/ipv4/ip_forward logger ­s ­t "INFO" "Enrutamiento activado" ################################################################## # REGLAS NAT ##################################################### logger ­s ­t "INFO" "Creando la regla NAT" # Enmascaramiento. La tarjeta eth0 tiene configuración dinámica iptables ­t nat ­A POSTROUTING ­s 192.168.21.0/24 ­j MASQUERADE # NAT estático. Si la tarjeta de red eth0 tuviera configuración # estática resultaría habría que utilizar esta regla. iptables ­t nat ­A POSTROUTING \ ­s 192.168.21.0/24 ­j SNAT ­­to­source 172.16.0.6 logger ­s ­t "INFO" "Regla NAT creada" #NAT en el destino. #Las peticiones WWW desde fuera se redirigen SeLiSe (192.168.21.10) logger ­s ­t "INFO" "Activando el DNAT para el servicio WWW" iptables ­t nat ­A PREROUTING \ ­i eth0 ­p tcp ­­dport 80 \ ­j DNAT ­­to­destination 192.168.21.10:80 Página 29 Rafael Lozano NAT logger ­s ­t "INFO" "Servicio WWW con destino a SELISE" } function desactiva_nat() { logger ­s ­t "INFO" "Desactivando el enrutamiento" echo 0 > /proc/sys/net/ipv4/ip_forward logger ­s ­t "INFO" "Enrutamiento desactivado" logger ­s ­t "INFO" "Borrando la regla NAT" iptables ­t nat ­F logger ­s ­t "INFO" "Reglas NAT borradas" } clear case "$1" in start) # Activamos enrutamiento y NAT activa_nat ;; stop) # Desactivamos el enrutamiento y el NAT desactiva_nat ;; restart|force­reload) # Reinicio del enrutamiento y el NAT desactiva_nat activa_nat ;; status) # Muestra el estado del enrutamiento muestra_estado ;; *) # Error de sintaxis error ;; esac Como se puede observar un script de inicio de servicio recibe un parámetro start cuando se inicia en los niveles de ejecución 2, 3, 4 y 5. Por tanto se ejecuta la función activa_nat. Por el contrario recibe un parámetro stop cuando se entra en los niveles de ejecución 0, 1 y 6, lo cual provoca que se ejecute la función desactiva_nat. Debemos añadir permisos de ejecución al script. chmod a+x /etc/init.d/activar_nat Por último, creamos los enlaces simbólicos al script anterior. Página 30 Rafael Lozano NAT update­rc.d activar_nat defaults Página 31 Rafael Lozano NAT 4. Bibliografía FOROUZAN, B. A., Transmisión de Datos y redes de comunicaciones – 4ª Edición. 2007 McGraw-Hill, ISBN 978-84-481-5617-6 VATUS, T., DAWSON, T., N. PURDY, G. Linux – Guía para administradores de redes. 2005 Anaya Multimedia – O'reilly, ISBN 84-415-1868-8 Página 33