Routing avanzado Linux

Qué hace este script?

#!/bin/bash

set -e
set -o pipefail
set -u

# add a rule for using our custom rules
if !(ip rule | grep 'from all lookup custom' > /dev/null); then
    echo "ip rule: add custom table"
    sudo ip rule add from all lookup custom
fi

# delete every custom rule
ip route show table custom \
| while read R; do
    echo "deleting: $R"
    ip route del $R table custom
done

# add all addresses
(
    echo "# GOOGLE"
    curl -s https://www.gstatic.com/ipranges/goog.json \
    | jq -r '.prefixes[] | select(.ipv4Prefix != null) | .ipv4Prefix'

    echo "# ATLASSIAN JIRA MIERDERS"
    curl -s https://ip-ranges.atlassian.com/ \
    | jq -r '.items[] | select(.direction | contains(["ingress"]))| select(.mask_len < 32) | .cidr'

    echo "# AMAZON AWS"
    curl -s https://ip-ranges.amazonaws.com/ip-ranges.json \
    | jq -r '.prefixes[].ip_prefix' \
    | sort -u

) > /tmp/networks.txt

grep -vP '^\s*(#.*)?$' /tmp/networks.txt \
| while read T; do
    echo "adding: $T"
    ip route add "$T" via 192.168.2.254 table custom
done

echo "done"

Este script de  configura reglas de enrutamiento personalizadas en una máquina Linux. A continuación se explica paso a paso lo que hace:

  • Activa configuraciones estrictas del entorno de :
set -e           # Termina el script si un comando falla

set -o pipefail  # Falla si cualquier comando en una tubería falla

set -u           # Falla si se usa una variable no definida
  • Crea una regla de enrutamiento que use la tabla custom si no existe:
ip rule add from all lookup custom
  • Elimina todas las rutas existentes en la tabla custom:
ip route show table custom | while read R; do ip route del $R table custom; done
  • Descarga rangos de IP públicos de varios proveedores (Google, Atlassian, Amazon AWS) y los guarda en /tmp/networks.txt.
  • Filtra los comentarios/líneas vacías y añade cada ruta IP a través del gateway 192.168.2.254 en la tabla custom:
ip route add "$T" via 192.168.2.254 table custom

Resumen funcional

Este script:

  • Crea reglas de enrutamiento personalizadas en la tabla custom.
  • Añade rutas específicas para rangos IP de proveedores conocidos.
  • Redirige el tráfico hacia esos rangos a través de un gateway concreto (192.168.2.254).

Esto puede usarse para enrutar tráfico a ciertos servicios (como Google, AWS, Atlassian) por una ruta específica (VPN, gateway alternativo, etc.).

https://datahacker.blog/industry/technology-menu/networking/routes-and-rules/iproute-and-routing-tables

El artículo “iproute and Routing Tables” de David Guyton ofrece una visión detallada sobre la gestión avanzada del enrutamiento en sistemas Linux mediante la herramienta iproute2. A continuación, se presenta un índice temático seguido de una explicación concisa de cada apartado.

Índice de temas

  1. Introducción al RPDB (Routing Policy DataBase)
  2. Rutas y la herramienta iproute2
  3. Reglas de enrutamiento (Routing Rules)
  4. Tabla de enrutamiento maestra (/etc/iproute2/rt_tables)
  5. Tablas de enrutamiento integradas por defecto
  6. Examinando rutas existentes
  7. Buenas prácticas para la tabla de enrutamiento principal
  8. Creación de tablas de enrutamiento adicionales
  9. Pasos para crear una nueva tabla de enrutamiento
  10. Buenas prácticas al añadir nuevas tablas de enrutamiento

1. Introducción al RPDB (Routing Policy DataBase)

El RPDB es un sistema que permite una gestión avanzada del enrutamiento en Linux, compuesto por tres elementos clave: rutas, reglas de enrutamiento y tablas de enrutamiento. Este enfoque modular facilita configuraciones de enrutamiento más complejas y flexibles.

2. Rutas y la herramienta iproute2

La herramienta iproute2 ha reemplazado al comando route para la gestión de rutas en Linux. Aunque route aún puede ser útil para consultas de solo lectura, iproute2 es preferido por su capacidad para manejar múltiples tablas de enrutamiento y configuraciones avanzadas.

3. Reglas de enrutamiento (Routing Rules)

Las reglas de enrutamiento determinan cómo se seleccionan las rutas para el tráfico de red. Pueden basarse en diversos criterios, como la dirección IP de origen, y son esenciales para implementar políticas de enrutamiento específicas. Estas reglas se almacenan en una base de datos separada y trabajan en conjunto con las tablas de enrutamiento.

4. Tabla de enrutamiento maestra (/etc/iproute2/rt_tables)

Este archivo actúa como un índice que asocia números y nombres a las diferentes tablas de enrutamiento disponibles en el sistema. Por defecto, incluye entradas como:

255 local

254 main

253 default

0   unspec

Los usuarios pueden añadir nuevas tablas personalizadas editando este archivo.

5. Tablas de enrutamiento integradas por defecto

  • local: Maneja direcciones locales y de broadcast.
  • main: Tabla principal utilizada por defecto para la mayoría de las operaciones de enrutamiento.
  • default: Reservada para reglas de post-procesamiento.
  • unspec: Valor predeterminado para rutas no especificadas.Datahacker

Estas tablas están predefinidas y no deben ser modificadas.

6. Examinando rutas existentes

Para visualizar las rutas actuales en el sistema, se puede utilizar el siguiente comando:

ip route show

Este comando muestra las rutas presentes en la tabla principal. Para ver rutas en otras tablas, se puede especificar el nombre de la tabla:

ip route show table [nombre_tabla]

7. Buenas prácticas para la tabla de enrutamiento principal

  • Evitar modificar las entradas predeterminadas.
  • Utilizar la tabla principal para rutas estándar.
  • Para configuraciones más complejas, considerar la creación de tablas adicionales.

8. Creación de tablas de enrutamiento adicionales

Para crear una nueva tabla de enrutamiento:

  • Añadir una nueva entrada en /etc/iproute2/rt_tables con un número único entre 1 y 252 y un nombre descriptivo.
echo "100 custom" >> /etc/iproute2/rt_tables
  • Agregar rutas a la nueva tabla:
ip route add [destino] via [gateway] dev [interfaz] table custom
  • Crear una regla de enrutamiento que utilice la nueva tabla:
ip rule add from [origen] table custom

9. Pasos para crear una nueva tabla de enrutamiento

  1. Editar /etc/iproute2/rt_tables para añadir la nueva tabla.
  2. Poblar la tabla con las rutas necesarias utilizando ip route add.
  3. Establecer reglas de enrutamiento con ip rule add para dirigir el tráfico a través de la nueva tabla.

10. Buenas prácticas al añadir nuevas tablas de enrutamiento

  • Asegurarse de que el número y el nombre de la tabla sean únicos.
  • No modificar las entradas predeterminadas en rt_tables.
  • Utilizar números entre 100 y 200 para nuevas tablas, permitiendo flexibilidad futura.
  • Usar nombres en minúsculas y evitar espacios.
  • Dejar espacios entre los números de tabla para facilitar futuras adiciones.
  • Probar exhaustivamente las nuevas configuraciones antes de hacerlas persistentes.

Esto puede servir para hacer un sinkhole?

Sí, este enfoque puede usarse para implementar un sinkhole local, y de hecho es una técnica válida y flexible para ello. Te explico cómo:

✅ ¿Qué es un sinkhole?

Un sinkhole es una técnica de red que redirige tráfico malicioso o no deseado (por ejemplo, hacia dominios de malware) a una IP controlada o inactiva (normalmente un host local o inexistente). Esto sirve para:

  • Bloquear el acceso a direcciones maliciosas.
  • Registrar o analizar el tráfico que intenta alcanzarlas.
  • Evitar filtrado DNS activo (si se hace a nivel de IP).

🛠 ¿Cómo aplicar esto con ip rule, tablas y rutas?

Usando el artículo como base, puedes hacer un sinkhole así:

  • Crear una tabla personalizada:
echo "100 sinkhole" | sudo tee -a /etc/iproute2/rt_tables
  • Añadir rutas maliciosas hacia una IP falsa o controlada (por ejemplo, localhost):
sudo ip route add 45.33.32.156 via 127.0.0.1 table sinkhole

O bien hacia un host controlado en tu red:

sudo ip route add 45.33.32.156 via 192.168.1.100 table sinkhole
  • Crear una regla para usar esa tabla cuando el tráfico se origine desde cualquier sitio (o alguna IP en particular):
sudo ip rule add to 45.33.32.156 lookup sinkhole
  • (Opcional) Automatizarlo con listas de IPs maliciosas y un script como el que mostraste.

🧠 Consideraciones

  • Puedes usar direcciones de listas negras (como FireHOL, Emerging Threats, etc.).
  • Mejor aún si tu sinkhole apunta a un servidor de captura (con Wireshark, tcpdump o Snort).
  • Esto funciona a nivel de red, independientemente del sistema DNS.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.