Linux Networking: “Baby steps”

Redes significa: lograr que equipos se comuniquen entre sí. Es algo sencillo de decir, pero no tan fácil de implementar.

Una Red Ethernet en Linux se conforma por las piezas que hacen todo el trabajo: routers, firewalls, switches, cableado, interfaz dehardware y los diferentes tipos de servicios de WAN y de Internet.

Una Red, sea una Red LAN o una Red WAN, puede ser considerada en dos partes: Computadoras y todo lo que va entre las computadoras.

Por el momento nos vamos a centrar en la conectividad: firewalls, puntos de acceso inalámbrico, administración remota segura, asistencia remota técnica, acceso remoto a usuarios, redes privadas virtuales, autenticación, sistemas y supervisión de la red, incluyendo servicios de Voz sobre IP.

En redes se pueden cubrir tareas como: integración de hosts de Windows, enrutamiento, identificación y autenticación de usuario, compartir una conexión a Internet, conexión de sucursales de oficinas, servicios de nombres, conectividad cableada e inalámbrica, seguridad y el seguimiento y la resolución de problemas.

Otros recursos interesantes:

Redes privadas no enrutables

En teoría, cada equipo  o sistemaen la Red necesita un identificador único, tal como, cada equipo o sistema que accesa la Internet va a necesitar una dirección IP única debido al protocolo de la Internet TCP/IP. Al no haber tantas direcciones IP disponibles para nuestros hogares y oficinas, debido a esto, es que existe la solución con Rangos de Redes Privadas que pueden ser usadas en conjunto con “la traducción de direcciones“.

Hay tres bloques de direcciones IP que se reservaron como privados, lo que significa que todos los routers en Internet deben estar configurados para no enrutarlos. Es por eso que a las direcciones privadas también se les llama direcciones “no enrutables” ¿El beneficio? Si los paquetes de sistemas con direcciones privadas no se enrutan entre las redes conectadas a la Internet, entonces muchas redes podrían usar esas mismas direcciones privadas, ya que nunca van a ser descubiertas por las demás direcciones. En otras palabras, estas mismas direcciones privadas pueden ser utilizados por cualquier número de equipos en todo el mundo, al no ser enrutadas, no se descubre que no son únicas.

10.0.0.1 mediante 10.255.255.254

  • 16,777,214 direcciones.
  • 16,777,214 equipos en 1 Red.
  • (10.x.x.x)
  • Usa una máscara de subred 255.0.0.0
  • En primer octeto debe ser el mismo en todos los equipos.
    net mask bits: /8
  • Un rango de direcciones de clase A.

172.16.0.1 mediante 172.31.255.254

  • 1,048,574 direcciones.
  • 65,534 equipos en cada un de las 16 redes posibles.
  • (172.16.x.x hasta 172.31.x.x)
  • Usa una máscara de subred 255.255.0.0
  • Los dos primeros octetos deben ser los mismos en todos los equipos.
    net mask bits: /16
  • Un rango de direcciones de Clase B.

192.168.0.1 mediante 192.168.255.254

  • 65,534 direcciones.
  • 254 equipos en cada una de las 256 redes posibles.
  • (192.168.0 hasta 255.x)
  • Usa una máscara de subred 255.255.255.0
  • Los tres primeros octetos deben ser los mismos en todos los equipos.
    net mask bits: /24
  • Un rango de direcciones de Clase C.
apt-get install ipcalc
ipcalc 192.168.0.0/16
Address:   192.168.0.0          11000000.10101000. 00000000.00000000
Netmask:   255.255.0.0 = 16     11111111.11111111. 00000000.00000000
Wildcard:  0.0.255.255          00000000.00000000. 11111111.11111111
=>
Network:   192.168.0.0/16       11000000.10101000. 00000000.00000000
HostMin:   192.168.0.1          11000000.10101000. 00000000.00000001
HostMax:   192.168.255.254      11000000.10101000. 11111111.11111110
Broadcast: 192.168.255.255      11000000.10101000. 11111111.11111111
Hosts/Net: 65534                 Class C, Private Internet
ipcalc 192.168.0.0/24
Address:   192.168.0.0          11000000.10101000.00000000. 00000000
Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111
=>
Network:   192.168.0.0/24       11000000.10101000.00000000. 00000000
HostMin:   192.168.0.1          11000000.10101000.00000000. 00000001
HostMax:   192.168.0.254        11000000.10101000.00000000. 11111110
Broadcast: 192.168.0.255        11000000.10101000.00000000. 11111111
Hosts/Net: 254                   Class C, Private Internet

Así que si no están enrutadas ¿Cómo acceden a la Internet los equipos que tienen una dirección privada asignada? Ahí es donde la segunda pieza, conocida como la traducción de direcciones, entra en juego. Lo general, es que para acceder todos los equipos de una empresa tendrían que tener asignada una dirección IP pública y enrutable para pasar a través de la Internet. Dado que no hay suficientes direcciones disponibles para esto, las empresas en su lugar asignan direcciones privadas a todos los cientos de equipos dentro de su propia organización, donde todos los equipos comparten una sola dirección “pública” para acceder a los recursos en la Internet.

Claramente, con 254 direcciones posibles (192.168.x.1 a 192.168.x.254) en cada uno de los 256 rangos de direcciones privadas (192.168.0.x hasta 192.168.255.x), utilizar estos rangos es suficiente para la mayoría las pequeñas empresas y para los que quieren jugar con una red en el hogar.

El espacio de direcciones 10.x.x.x se utiliza por organizaciones más grandes, en muchos lugares dispersos. Se hace “subnet” de este gran espacio de direcciones privada, por ejemplo, para que una ubicación tenga un rango de direcciones de 10.3.x.x, otra ubicación va a terner un rango de direcciones 10.4.x.x, y así sucesivamente, en cada ubicación se tiene la capacidad de tener hasta 65.534 equipos. Donde cada ubicación puede aprovechar su espacio de direcciones de “subnet” para sus diferentes departamentos e instalaciones. Por ejemplo, en la ubicación que tiene el espacio de direcciones 10.3.x.x, el departamento de ingeniería tendrá el espacio 10.3.2.x, la contabilidad tendrá el espacio de direcciones 10.3.3.x, y así sucesivamente, donde cada departamento de ser capaz de tener hasta 254 equipos.

Cada uno de los números separados por puntos en una dirección IP se conoce como “octeto“, porque el valor del número (0 a 255) se deriva de ocho bits binarios. Una dirección IP se compone de dos partes:

  • La primera parte de una dirección IP identifica la red donde un equipo está encendido.
  • La otra parte identifica el equipo individual en esa red.

Hay una analogía muy frecuente, comparar una dirección IP a un número de teléfono. La parte de red de la dirección IP es análogo al código de área, y la parte del equipo de la dirección IP es como el número de teléfono de la persona. Todas las personas en la red de la compañía telefónica (en un código de área) tienen el mismo número de código de área, y no hay dos de ellos que vayan a tener el mismo número de teléfono. Por otro lado, dos personas pueden tener el mismo número de teléfono en diferentes partes del país, ya que no están en el mismo código de área (no en la misma red). Es cuando se pone el código de área y número de teléfono de una persona juntos que el número se convierte en uno que es único para todo el país (internetwork). En este contexto, se llama el código de área como prefijo. Con las direcciones IP, la parte de red de una dirección IP es el prefijo.

Puerta de enlace (gateway)

Nos vamos a referir a la interfaz entre la Red LAN y las Redes externas con el “gateway”. Como mínimo, esta puerta de enlace es un router. Podría ser un router dedicado que no hace nada más. Incluso, se le puede agregar un firewall. Aunque es posible que quieran otros servicios como DNS, VPN, puntos de acceso inalámbrico o administración remota. Es muy tentador cargar este equipo con todo tipo de servicios, simplemente porque se puede, pero desde la perspectiva de la seguridad y la administración ágil, lo mejor es mantener el “Internet Gateway” lo más simple posible. No sobre-cargar con servicios Web, Correo, FTP o servidores de autenticación. Hay que intentar mantenerlo simple e inteligente, tan bloqueado o seguro como sea posible.

Internet Gateway

Los routers y los firewalls muchas veces se combinan en el mismo equipo, a esto se le conoce como “Internet Gateway”.

Estrictamente hablando, un gateway mueve tráfico entre las redes que usan diversos protocolos, tales como NETBEUI y TCP/IP, que es algo que vemos con frecuencia. En estos días, significa cualquier equipo de Red que conecta Redes.

Los routers reenvían el tráfico entre redes. Siempre se va necesitar un router entre nuestra LAN y las demás redes. Incluso se puede configurar con detección de intrusos, control de tráfico, proxies, acceso remoto seguro, DNS/DHCP y cualquier otro servicio al gusto, aunque parece una mejor idea, limitar el firewall para que nada más realice:

  • Enrutar.
  • Firewalling.
  • Control de tráfico.

Bastion Host

Otros servicios deben sentarse en equipos separados, detrás del firewall de Internet, aunque, por supuesto, esto depende de lo que se puede o desea hacer. En los negocios pequeños, no es raro que una sólo equipo tiene corriendo una gran cantidad de servicios disponibles. Sin embargo, los riesgos pueden permitir que cualquier intruso pueda llegar a tener una fiesta deliciosa con muchos servicios a explotar. Otro inconveniente podría ser sobrecargar el equipo hasta el punto en que el rendimiento se ve afectado de manera negativa.

Velocidades de la Red

Cuando se habla de velocidades de la Red, a menudo hay confusión entre:

  • Ancho de banda (Bandwidth).
  • Latencia (Latency).
  • Rendimiento (Throughput).

Ancho de banda es capacidad y Latencia es el tiempo de respuesta. “Ancho de banda es el diámetro de la línea de riego. La latencia está esperando a que el agua se salga”.

El Rendimiento es la cantidad de datos transferidos por unidad de tiempo, como 100 kbps. Por lo tanto, se puede decir que el rendimiento es la intersección entre el ancho de banda y la latencia. Muchos factores pueden afectar la latencia, por ejemplo:

  • La velocidad del servidor.
  • Congestión de la red.
  • limitaciones inherente en los circuitos.

El comando ping puede medir la latencia en tránsito, de ida y vuelta (roundtrip):

ping google.com

La clave de la felicidad con iptables

iptables es parte del proyecto Netfilter. Netfilter es un conjunto de “hooks” en el Kernel de Linux que se comunican con la pila de Red. iptables es un comando, también es la estructura de la tabla que contiene los conjuntos de reglas que controlan el filtrado de paquetes.

Los paquetes se pueden filtrar por los campos en los encabezados de los paquetes IP, TCP, UDP y también los ICMP. Por esta razón, una gran cantidad de acciones pueden ser tomadas en cada paquete. La clave de la felicidad con ipatables es la simplicidad. Empezando con lo mínimo necesario para realizar el trabajo y agregar reglas tal como se van necesitando. No es necesario construir grandes edificios con iptables, de hecho es una mala idea al hacer las cosas difíciles de mantener, además de que afectan el rendimiento.

Políticas

Las políticas son las acciones predeterminadas que se aplican a los paquetes que no coinciden con ninguna regla.

Tablas, Cadenas, Reglas

Se incorporan las siguientes tres tablas:

  • filter
  • NAT
  • mangle

La que más vamos a utilizar es la tabla filter, la tabla NAT un poco y es probable que la tabla mangle, no del todo (es para manipulación avanzada de paquetes). Cada tabla contiene una serie de cadenas internas. También se pueden crear cadenas al gusto. Una cadena es una lista de reglas que define las acciones que se aplican a los paquetes,  las reglas dicen ¿qué hacer con los paquetes?. Las reglas finalizan con un objetivo (target) que dice qué hacer con el paquete. Esto se hace con el comando (-j) de salto (jump), con el siguiente ejemplo que permite todo el “loopback traffic” con el objetivo de ACCEPT:

iptables -A INPUT -i lo -j ACCEPT

Una vez que un paquete alcanza el objetivo ACCEPT, ese es el fin del camino, y ya no se camina por más cadenas. Las reglas se pueden correr desde la línea de comando o desde un script. Estoes lo que cada parte de una regla significa:

  • iptables = El comando iptables.
  • Si no espeficira una tabla, se utiliza la tabla por defecto (filter).
  • -A INPUT = Añadir esta regla a la cadena INPUT.
  • -i lo = Aplicar esta regla a los paquetes que van por la interfaz lo.
  • -j ACCEPT = Brincar hacia la cadena ACCEPT, mueve los paquetes a sus destinos finales.

Inspección sobre el estado de los paquetes

iptables hace una inspección sobre el estado de los paquetes, que realiza a través de su mecanismo de seguimiento de conexiones. Por esta razón detecta si un paquete está tratando de iniciar una nueva conexión o si pertenece a una ya existente.

Contexto

Ver los paquetes en el contexto es muy potente, esto permite hacer mucho trabajo con pocas reglas. Si no se están corriendo servicios públicos, de manera fácil, se pueden bloquear todos los intentos externos para crear una conexión, ya que no tienen una razón legítima para intentar una conexión con nosotros. Cuando se corren servicios como SSH, FTP, servidor web y servidor correo, iptables puede permitir sólo el tráfico dirigido hacia los servicios que sí se están corriendo, de esta manera es útil para rechazar el resto. También se puede bloquear todo el tráfico saliente, iniciado desde los servidores, ya que se supone que nuestro servidor responde a intentos de conexión desde el exterior, no los iniciar. Estas cosas serían difíciles de lograr sin la inspección sobre el estado de los paquetes.

iptables se puede extender con la adición al gusto de módulos al kernel, por esta razón las características de iptables pueden variar según la distribución de Linux y por las modificaciones propias de los usuarios administradores. Para ver lo que una instalación puede hacer, por favor compruebe los archivos:

ls -la /boot/config-*

Si no es emocionante la idea de manejar un grupo grande de módulos del kernel (donde iptables puede utilizar nada más unos cuantos), se puede construir un kernel al gusto con las funciones de iptables que se desean.

Tabla filter

Hay tres tablas en iptables. Cualquier regla o cadena que se crea va a ir en una de estas tablas. La tabla filter es considerada la tabla por defecto, y es la que vamos a usar más. Se puede pensar en filter como la porción de firewall de iptables. La tabla filter incorpora las siguientes cadenas:

INPUT
Procesa los paquetes entrantes.

FORWARD
Procesa los paquetes enrutados mediante el anfitrión (host).

OUTPUT
Procesa los paquetes salientes.

Tabla NAT

La tabla NAT se utiliza sólo para cambiar en paquetes el campo de dirección de origen o de destino. Si se tiene una sola dirección IP pública, enrutable frente a una LAN que utiliza direcciones privadas, que es lo común, NAT traduce las direcciones IP de origen en los paquetes salientes a las direcciones públicas.

No importa si se tienen cientos de equipos (hosts) que comparten la conexión, parecerá que todo el tráfico proviene de un único equipo (host). Por otro lado, también es posible utilizar NAT para permitir el acceso a los servicios públicos desde IPs privadas. La tabla NAT incorpora las siguientes cadenas:

PREROUTING
Altera los paquetes entrantes antes de su enrutamiento.

OUTPUT
Altera los paquetes generados localmente antes de enrutarlos.

POSTROUTING
Altera los paquetes después de su enrutamiento.

 Tabla mangle

La tabla mangle permite alterar los encabezados de los paquetes al gusto. Esto tiene una gran cantidad de usos, por ejemplo, algunas ideas:

• Cambie el campo TOS en los paquetes, para QoS (hay mejores maneras para manejar QoS).
• Marcado de paquetes para recopilar estadísticas por: filtrado, logging o enrutamiento.
• “Packet Rate Limit”.

La tabla mangle incorpora las siguientes cadenas:

PREROUTING
Altera los paquetes entrantes antes de su enrutamiento.

OUTPUT
Altera los paquetes generados localmente antes de enrutarlos.

INPUT
Altera los paquetes destinados para el equipo local.

FORWARD
Procesos los paquetes enrutados a través del equipo (host).

POSTROUTING
Altera los paquetes en su salida, después de su enrutamiento.

mangle + NAT + filter

Los paquetes que entran en la Red deben pasar primero a través de la tabla mangle, luego por la tabla NAT, y por último, por la tabla de filter.

Cuando definimos cadenas al gusto, se puede mejorar el rendimiento, ya que los paquetes atraviesan las reglas y cadenas en el orden en que aparecen.

Definir cadenas al gusto permite crear accesos directos (shortcuts), de esta manera podemos hacer brincar los paquetes a las cadenas que deseamos que atraviesen, en lugar de pasar a través de un montón de reglas y cadenas irrelevantes primero. O bien, se pueden ahorrar algunos pasos de configuración mediante la construcción de una cadena al gusto, para utilizarla una y otra vez.