Mostrando entradas con la etiqueta IP Forward. Mostrar todas las entradas
Mostrando entradas con la etiqueta IP Forward. Mostrar todas las entradas

martes, 22 de abril de 2014

IPTABLES

¿Qué es iptables?

iptables es un cortafuegos por defecto que viene preinstalado en la práctica mayoría de las distribuciones Linux a partir de la versión 2.4 del núcleo. Es una herramienta que gestiona las conexiones que entran, vienen o pasan por el sistema operativo. Por tanto, es considerado un firewall muy versátil que puede ser utilizado para gestionar todas las conexiones que se hagan en el ordenador.

iptables tiene soporte tanto para el protocolo IPv4 como para el protocolo IPv6. Para diferenciar cuál es cual, IPv4 usa el comando iptables y IPv6 utiliza el comando ip6tables.

¿Qué puede hacer iptables?

Para definir correctamente todas las reglas de las que nos provee iptables, haremos una pequeña introducción sobre los tipos de órdenes que maneja el cortafuegos. (Entre paréntesis viene la opción que usa cada tipo)

Tipo de paquetes de datos (- A)
  • INPUT: Paquetes que llegan a nuestra máquina
  • OUTPUT: Paquetes que salen de nuestra máquina
  • FORWARD: Paquetes que pasan por nuestra máquina
Interfaces por las que entran o salen los paquetes (-i = input, -o = output)

- eth0, eth1, wlan0, ppp0... toda interfaz que tenga un sistema Linux

 IP origen y destino de los paquetes (-s = source, -d = destination)

Puede ser una IP concreta o un rango de direcciones IP acompañado de su CIDR. Ejemplos:

- 192.168.1.33 (concreta)
- 172.16.1.0/24 (rango de IP)

Protocolo de los paquetes (-p = protocol)
  • TCP,
  • UDP
  • ICMP
Haciendo enrutamiento con la tabla NAT (-t NAT)

- PREROUTING (Filtrar antes de enrutar)
- POSTROUTING (Filtrar después de enrutar)

 ¿Cómo se usa iptables? ¿Qué configuraciones puedo hacer en el mismo?

iptables es utilizado, en su amplia mayoría de casos, para filtrar las conexiones que se realizan en ordenadores Linux que son utilizados como servidores y routeres entre redes. iptables puede:
  • Denegar o aceptar conexiones:

    • Parcialmente, desactivando y activando algunos puertos o protocolos, el tráfico ICMP de ping.

    • Totalmente, habilitando o deshabilitando el acceso a equipos con una determinada dirección de red, subred, o dirección física MAC, y dando acceso total a todo, o quitándolo.
  • Utilizar tablas NAT de enrutamiento para enrutar entre dos interfaces de red enchufadas en el sistema Linux. (NOTA: debes activar el ipforward del sistema para conseguir que funcione)

  • Si se dispone de la aplicación de red Wireshark se puede monitorizar y listar aún mejor las entradas y salidas de iptables, además de que la propia aplicación dispone de tablas de listado.
iptables se utiliza mediante línea de comandos en su amplia mayoría. Como el compendio de ejecución de iptables es un poco extenso, voy a realizar la explicación de la mejor forma que se puede: Con ejemplos prácticos

  • Firewall de un ordenador o servidor.
  • Un modelo "global" de router y firewall. (O bien, podéis ir a la entrada de usar un CentOS como router y observar algunos ejemplos ya realizados para ver cómo se usa)

El modelo básico para hacer cualquier configuración es:
  • Borramos las anteriores reglas y ponemos todo el iptables a 0: Antes de realizar ninguna instrucción, lo recomendable es borrar toda la configuración anterior de iptables, para que no interfieran antiguas restricciones con las nuevas.

  • Si nuestro ordenador va a ser router entre redes, configurar la NAT: Configuraremos las tablas NAT de cero para que no haya ningún problema en la implementación.
  • Abrir o cerrar puertos y protocolos específicos: Para "rizar más el rizo" en la configuración, en caso de que necesitemos hacerlo.

Ejemplos de uso de iptables

-------------------------------------------------------------------------------------------------------------------------------------

Como Firewall en un solo ordenador/servidor:

El escenario será el siguiente:

Tenemos un servidor, por el cual debido a recientes implementaciones (Como un servidor FTP o un servicio HTTP) queremos que el resto de ordenadores se conecten al mismo. Sin embargo, queremos también que no se tenga libre albedrío y queremos cerrar y abrir una serie de puertos.

Para este ejemplo, tenemos implementado un servidor HTTP y un FTP, y queremos rechazar las conexiones por TELNET y aceptar solamente las que entran por SSH. La red será 192.168.1.0/24 y nuestro servidor tiene como IP la primera del rango.Además, no queremos que un determinado ordenador se conecte, y como va todo el rato cambiando direcciones IP para sortear el baneo, hay que cerrarlo directamente por su dirección física, que es 01:23:45:ab:cd:ef

Para configurar correctamente el iptables, haremos los dos primeros pasos del modelo: Borrado de las reglas anteriores e implementación de las que queramos poner:

1. Borrado de las reglas anteriores


Borra las anteriores reglas de iptables.

# iptables -F

Igual que la anterior, pero más rematada.

# iptables -X

Pone el contador de paquetes totales del iptables a cero.

# iptables -Z

2. Establecemos las políticas de denegación y aceptación de puertos y servicios.

Comenzamos con aceptar los tipos de paquetes que manejará el firewall, que son de entrada y de salida.

# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT

Aceptamos la entrada de localhost.

# iptables -A INPUT -i lo -j ACCEPT

Comenzamos primeramente cerrando todos los puertos establecidos (Del 1 al 1024)

# iptables -A INPUT -i eth0 -p tcp --dport 1:1024 -j DROP
# iptables -A INPUT -i eth0 -p udp --dport 1:1024 -j DROP

 Ahora establecemos las políticas de entrada.

# iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 20 -j ACCEPT
# iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 21 -j ACCEPT
# iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
# iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT

De forma auxiliar, también aceptamos los puertos esenciales para la conexión (DHCP y DNS)


DNS:

# iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 53 -j ACCEPT
# iptables -A INPUT -s 192.168.1.0/24 -p udp --dport 53 -j ACCEPT

DHCP:

# iptables -A OUTPUT -s 192.168.1.0/24 -p udp --dport 67 -j ACCEPT

# iptables -A INPUT -s 192.168.1.0/24 -p udp --dport 68 -j ACCEPT 

Rechazamos el puerto de Telnet.

# iptables -A INPUT -i eth0 -p udp --dport 23 -j ACCEPT

Y para acabar, rechazamos la dirección física de ordenador tan molesto:

# iptables -A INPUT -m mac --mac-address 01:23:45:ab:cd:ef -j DROP

Por último, guardamos la configuración:


# iptables-save

-------------------------------------------------------------------------------------------------------------------------------------

Como Firewall principal entre dos redes.

El escenario actual será siguiente:

Tenemos un ordenador con un sistema Linux que sirve de firewall. El mismo sistema tiene 3 interfaces referentes a:
  • eth0: Internet, salida directa.
  • eth1: Una red que contenga X ordenadores y que necesita Internet.
    Dirección de red: 192.168.0.0/24
    Dirección IP en la interfaz: 192.168.0.1/24
  • eth2: Un DMZ (Red desmilitarizada, con acceso total)
    Dirección de red: 192.168.1.0/24
    Dirección IP en la interfaz: 192.168.1.1/24
Queremos que en la interfaz eth1 se acepte el tráfico HTTP y HTTPS, además de otros como el puerto de Telnet y SSH. Rechazaremos el puerto 6680 en la misma red.

En eth2 queremos que se tenga acceso total, debido a su forma de ser una red desmilitarizada.

Para configurar correctamente el iptables, seguiremos un orden concreto: Borramos anteriores reglas, iniciamos la NAT y filtramos todo.

1. Borrado de las reglas definidas.

Borra las anteriores reglas de iptables.

# iptables -F

Igual que la anterior, pero más rematada.

# iptables -X

Borra las reglas establecidas en la tabla NAT.

# iptables -t NAT -F

 Pone el contador de paquetes totales del iptables a cero.

# iptables -Z

2. Inicializamos las políticas de filtrado

# iptables -P INPUT ACCEPT
# iptables -P FORWARD ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P PREROUTING ACCEPT

# iptables -P POSTROUTING ACCEPT 

Aceptamos el tráfico de localhost, para que no nos dé error.


# iptables -A input -i lo -j ACCEPT 


3. Iniciamos NAT

Después de poner el ip forward a 1, debemos implementar la siguiente regla:

# iptables -t NAT -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
# iptables -t NAT -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

(A partir de aquí no tocaremos más la red 192.168.1.0/24, ya que lo que quería era acceso total)

4. Establecemos el resto de reglas de filtrado y denegación.

Primeramente rechazamos el tráfico de ambas redes al mismo firewall (para evitar que alguien toquetee)

# iptables -A INPUT -s 192.168.0.0/24 -i eth1 -j REJECT
# iptables -A INPUT -s 192.168.1.0/24 -i eth2 -j REJECT

En la red 192.168.0.0:

Aceptar el tráfico de HTTP y HTTPS.

# iptables -A FORWARD -s 192.168.1.0/4 -p tcp --dport 80 -j ACCEPT

# iptables -A FORWARD -s 192.168.1.0/4 -p tcp --dport 443 -j ACCEPT


Aceptar el tráfico de Telnet y SSH.


# iptables -A FORWARD -s 192.168.1.0/4 -p tcp --dport 22 -j ACCEPT
# iptables -A FORWARD -s 192.168.1.0/4 -p udp --dport 23 -j ACCEPT

Rechazamos el tráfico del puerto 6680.

# iptables -A FORWARD -s 192.168.1.0/4 -p tcp --dport 6680 -j DROP
# iptables -A FORWARD -s 192.168.1.0/4 -p udp --dport 6680 -j DROP  

Después de realizar todas estas reglas, salvamos.

# iptables-save
-------------------------------------------------------------------------------------------------------------------------------------


Fuentes:
Experiencia propia.
Redes de Área local, aplicaciones y servicios Linux. Ministerio de Educación (Material docente)
Diversas entradas ya hechas de aquí manejando iptables.

jueves, 8 de diciembre de 2011

Utilizar un sistema operativo CentOS como router en una red local.

CentOS (Comunnity enterprise Operating System) es un sistema operativo de código libre, basado en el núcleo Red Hat, pero con código liberado. CentOS es la alternativa gratuíta a Red Hat, y por ello, suele tener bastante tirón para implementarlo como servidor en una pequeña o mediana red. CentOS puede ser usado también como servidor LAMP, servidor de correo, servidor DHCP, DNS, y un largo etcétera.


CentOS puede ser usado también como un router, usando dos tarjetas de red, una hacia la red de área local y otra al exterior(Internet)

Para empezar esta entrada, nos centraremos primero en una situación "de la vida real":

Imaginemos que tenemos una red de área local de por ejemplo tres o cuatro ordenadores, todos conectados por un switch, y queremos usar un ordenador ajeno a esos como servidor, para administrar a esos ordenadores direcciones IP y servicios de red cualesquiera. El ordenador servidor se usará como router, y también como firewall, filtrando las conexiones, rechazando algunas y aceptando otros puertos, para así tener control absoluto sobre las conexiones.

Configuración del servidor:

  • El servidor tiene para esta administración dos interfaces: eth0 y eth1
    • eth0 para local.
    • eth1 para salida a Internet.
  • La configuración del firewall de la red se administrará mediante iptables
  • El método para enrutar los paquetes será NAT.
Éste esquema se da en bastantes empresas a nivel pequeño y mediano. La diferencia es que nosotros usaremos CentOS, mientras que en una empresa es más probable usar un Windows Server (No tengo nada contra WS, pero resulta más eficiente el uso de Linux para administración de servidores. Más control)

Una vez planteado todo, lo iremos montando poco a poco.

El esquema a seguir será el siguiente:

  1. Instalaremos un servidor DHCP y configuraremos las opciones del mismo.
  2. Configurar las interfaces eth0 y eth1 para su funcionamiento.
  3. Enrutar los paquetes entre las dos conexiones (IP Forward y NAT)
  4. Establecer las políticas de filtrado (iptables)
Sugerencia: Recomiendo usar CentOS en runlevel 3 (Línea de comandos). Ganaremos rapidez en el servidor al omitir el entorno gráfico.

Nota: Todos los comandos deben ser ejecutados como Superuser (root).

1. Instalación del servidor DHCP y configuración del mismo.

En primer lugar, hay que descargar de los repositorios de CentOS el servidor DHCP. El paquete actual a fecha de hoy es dhcp-3.0.5-29.el5_7.1. Para instalarlo, en la línea de comandos, escribimos

# yum install dhcp

El ordenador buscará en los repositorios de CentOS el paquete solicitado. Una vez lo tenga, lo bajará a nuestro ordenador, lo configurará y lo intentará inicializar sin éxito, debido a que no tiene una configuración predefinida todavía.


Una vez tenemos bajado el servidor DHCP, vamos a proceder a configurarlo.

En primer lugar, tenemos que tener fijada cuál va a ser nuestra política de administración de las direcciones IP, así como del rango de direcciones disponible, máscara de subred, puerta de enlace y servidor DNS. Como será un servidor único, no usaremos política de alquiler de direcciones.

El archivo de configuración a editar se encuentra en /etc y se llama dhcpd.conf. Si lo ejecutamos con nano y vim, nos saldrá que el archivo de configuración de muestra se encuentra en /usr/share/doc/dhcp-3.0.5/dhcpd.conf.sample. Para evitar posibles fallos y autorizaciones erróneas, introduciremos nuestro propio dhcpd.conf sin copiar el archivo de muestra.

Como ejemplo, vamos a usar la subred 172.16.1.0,  máscara de subred 255.255.255.0, puerta de enlace la 172.16.1.1, DNS el 8.8.8.8. La administración de direcciones IP va de la 20 a la 30.

El archivo quedaría así:


# /etc/dhcpd.conf
ddns-update-style none;
ignore client-updates;

subnet 172.16.1.0 netmask 255.255.255.0 {

option routers 172.16.1.1;
option subnet-mask 255.255.255.0;
option domain-name-servers 8.8.8.8;

range dynamic-bootp 172.16.1.20 172.16.1.30;
}



Guardamos el archivo. Ahora tenemos configurado correctamente todas las opciones que requería nuestro servidor. Seguimos sin poder ejecutar el servicio debido a que no hemos configurado la dirección IP del interfaz a usar, pero lo arreglamos enseguida.

PD: Las dos primeras líneas (ddns-update-style y ignore client-updates) vienen a decir que no queremos actualizaciones dns e ignoraremos las peticiones de clientes queriendo renovar su dirección IP local.

(Corrección hecha por el usuario Juan Ortega. Comentario más abajo. Gracias por la ayuda)
Si tenemos un equipo al que le queremos dar una IP fija, añadimos la siguiente línea:

host (nombre máquina abreviado) {
option host-name (nombre máquina completo);
hardware ethernet (dirección mac);
fixed-address (dirección ip que le damos);
}

El nombre abreviado o completo de máquina lo pueden poner como quieran.

Nota: la dirección IP que le demos debe estar en la subred o subredes del servidor DHCP que definan.

2. Configurar las interfaces eth0 y eth1

Las interfaces eth0 y eth1, por lo general, tendrán diferente rango de direcciones IP:

  • eth0: Deberá llevar la dirección que pusimos en option-routers, ya que CentOS es nuestro servidor y puerta de enlace para la red local.
     
    • Bloque de direcciones a usar:
      • Dirección IP: 172.16.1.1
      • Máscara de subred: 255.255.255.0
      • No requiere de gateway ni DNS.
  • eth1: A gusto del consumidor. Yo utilizaré un modelo DHCP, ya que usaremos CentOS solo para enrutar la red local y servir como filtro y eth1 se conectaría a un router ADSL, pero si necesita ser implementado como red fija, especificaré donde proceda.

En CentOS, las configuraciones de las interfaces de red no se hacen por ifconfig de forma general. En su lugar, lo haremos más eficiente.

Hay dos modos:

  • Usando la Utilidad de configuración en modo texto (setup). Se ejecuta poniendo en la línea de comandos  # setup. Es más fácil de manejar.
  • Editando los archivos de configuración. Se encuentran en /etc/sysconfig/network-scripts/ y su nombre es ifcfg-ethx, donde x es el número de conexión
Setup es una sencilla herramienta semigráfica que mediante un menú intuitivo nos permite configurar las interfaces fácilmente.

La edición de los ficheros de configuración se puede realizar utilizando Vim o Nano, el que más rabia os dé.

El fichero de configuración será algo así para eth0:

# (Controlador del adaptador de red)


DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
HWADDR=(Dirección MAC del adaptador)
IPADDR=172.16.1.1
NETMASK=255.255.255.0

Para el fichero eth1, algo tal que así:


# (Controlador del adaptador de red)


DEVICE=eth1
BOOTPROTO=dhcp
ONBOOT=yes
HWADDR=(Dirección MAC del adaptador)

Si queremos especificar un gateway en cualquiera de los dos adaptadores, se añadirá GATEWAY=(Dirección del gateway). Si queremos añadir un servidor DNS, debemos cambiar el archivo de configuración ubicado en /etc/resolv.conf, y en las líneas que proceden escribir.

nameserver (dirección DNS)


Una vez modificados los valores de los ficheros de configuración y del Setup, debemos reiniciar el servicio para que la configuración tenga efecto. Para ello, escribimos:

# service network restart

Una vez realizamos la siguiente acción, la dirección de las dos interfaces se cambiará a la que hayamos configurado en el Setup o los ifcfg. Acto seguido, procederemos a iniciar el servicio dhcp, para así inicializar la red local. Para ello, en la misma consola, escribimos:

# service dhcpd start

PD: Si falla el inicio de dhcpd, revisa los ficheros de configuración  (generalmente es que falta un punto y coma, o algo mal puesto de nombre). Si no encuentras nada, existe un fichero en /var/log/messages que nos dirá lo que nos chirría de la configuración general de dhcp o cualquiera que estemos usando. Si falla alguna cosa, revisar este archivo es lo más conveniente. se ejecuta con:


# cat /var/log/messages

3. Enrutar los paquetes entre las dos conexiones (IP Forward y NAT)

Hemos configurado las dos interfaces, pero aunque hayamos configurado, nos resulta un poco "inútil", debido a que aún nos falta realizar el enrutamiento y el seguimiento de paquetes entre interfaces. Para ello, debemos activar el IP Forward y establecer NAT para realizar un enrutamiento exitoso.

  • Activar IP Forward: Para activarlo, tenemos que editar el fichero /etc/sysctl.conf, y en la línea denominada

    net.ipv4.ip_forward = 0

    Editar el 0 por un 1. Reiniciar el servidor CentOS para que los cambios hagan efecto.

  • Establecer NAT como configuración de enrutamiento: Por sí solo, el IP Forward no sirve de nada si no ejecutamos una excepción en iptables para añadir una "ruta" interna entre ambas interfaces y así poder enrutar.

    Para ello, en la consola, escribimos:

    # iptables -F
    # iptables -t nat -F


    Estos dos primeros comandos son para limpiar las configuraciones.

    # iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -d 0/0 -j MASQUERADE
Una vez realizado ésto, CentOS podrá enrutar los paquetes que le lleguen desde eth0 a eth1 y así, dar acceso a Internet a la red local en DHCP que montamos anteriormente.

4. Establecer las políticas de filtrado (iptables).

Una vez todo está funcionando, es posible que solo queramos que estén abiertos determinados puertos, o denegar el acceso a un usuario concreto, permitir que pase información de un puerto... Para ello, CentOS y su iptables (cortafuegos) nos podrán ayudar para establecer qué dejamos o no pasar a través de la red.

Lo primero de todo, antes de establecer filtros, vamos a eliminar la configuración antigua del cortafuegos. Para eso, teclearemos los siguientes comandos:


# iptables -F (Borra todas las reglas de iptables)
# iptables -X (Igual que -F)
# iptables -Z (Pone el contador de paquetes de iptables a cero)
# iptables -t nat -F (Borra la regla de enrutamiento NAT anterior)

Una vez tecleamos todos estos comandos, procederemos a disponer nuestra propia configuración. Por ejemplo:

  • Permitiremos acceso a los puertos de Internet básicos (80 y 443, HTTP y HTTPS)
  • Permitiremos un puerto de conexión segura (22, SSH)
  • A un equipo le daremos acceso total.
Para empezar, restauraremos la última línea de cuando usamos NAT en el servidor:

# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -d 0/0 -j MASQUERADE

Para que el servidor acepte y reenvíe paquetes, debemos aceptar las políticas de uso (INPUT para enviar paquetes, FORWARD para enrutar, y POSTROUTING para enviar a la ruta)


# iptables -P INPUT ACCEPT
# iptables -P FORWARD ACCEPT
# iptables -t nat -P POSTROUTING ACCEPT


Para aceptar las políticas de HTTP y HTTPS, añadiremos la siguiente línea:

# iptables -A FORWARD -s 172.16.1.0/24 -p tcp --dport 80 -j ACCEPT
# iptables -A FORWARD -s 172.16.1.0/24 -p tcp --dport 443 -j ACCEPT

Para aceptar el SSH, añadiremos la siguiente línea:

# iptables -A INPUT -s 172.16.1.0/24 -p tcp --dport 22 -j ACCEPT

Para rechazar los paquetes de un determinado número de puerto. 

# iptables -I INPUT -s 172.16.1.0/24 -p tcp --dport (puerto cualesquiera) -j DROP

Para el acceso total a un equipo, añadiremos la siguiente línea. Como ejemplo, pondré el 172.16.1.2

# iptables -A FORWARD -s 172.16.1.2 -j ACCEPT

Para consultar todos los cambios hechos, ejecutamos:


# iptables -L


Para guardar la configuración, ejecutamos:


# iptables-save


Nota: Para las reglas iptables, es más recomendable usar un script, para ejecutar todo a la vez y no uno a uno.

Siguiendo estos pasos, conseguiremos tener nuestra propia red local con un CentOS como router.

Fuentes:
Redes de Área local. Aplicaciones y Servicios Linux [Formación del profesorado]. Instituto de Tecnologías Educativas.
Experiencia propia.

Revisión de artículo: Octubre de 2013
Razón: Corrección del contexto. Adición de la cláusula de rechazo de paquetes. Corrección de la cláusula de IP fija gracias al comentario de un usuario.