¿Administrar reglas paralelas para ipv4 e ipv6 iptables?

10

Recientemente hemos comenzado a experimentar con IPv6, y uno de los primeros problemas con los que tenemos que lidiar es tratar con un conjunto completamente separado de reglas de firewall (Linux iptables / ip6ables) para las dos pilas de protocolos. Nuestra lógica de firewall se basa principalmente en una serie de redes específicas para un propósito (por ejemplo, 10.0.0.0/24 es la red de la estación de trabajo del personal, 10.1.0.0/24 es la red de la base de datos, 10.2.0.0/24 es la red del servidor web, etc. ), y la lógica tanto para IPv6 como para IPv4 será en gran medida la misma, con prefijos de red de módulo diferente.

¿Qué hace la gente para manejar este tipo de situación? Idealmente, me gustaría poder generar los conjuntos de reglas iptables y ip6table a partir de los mismos archivos fuente. Ya he reunido algo usando bash, pero no es necesariamente bonito y sospecho que debe existir una mejor solución en algún lugar.

Me interesaría especialmente una solución basada en Puppet que haga un buen uso de los propios mecanismos de dependencia de Puppet para implementar el orden relativo de las reglas (o grupos de reglas).

larsks
fuente

Respuestas:

5

Firewall Builder tiene exactamente lo que necesitas. Puede crear un conjunto de reglas, marcarlo como "ipv4 + ipv6 combinado" y colocar sus redes ipv4 e ipv6 asignadas al mismo segmento (como "red de base de datos", etc.) en la misma regla. Luego, el programa genera dos configuraciones de iptables separadas, una para ipv4 y otra para ipv6. Este capítulo de la Guía del usuario ilustra esto, aunque utiliza las listas de acceso de enrutadores Cisco como ejemplo. Funciona exactamente igual para iptables.

http://www.fwbuilder.org/4.0/docs/users_guide5/combined-ipv4-ipv6-rule-set.html

vadimk
fuente
4

También me enfrenté recientemente con la creación de reglas de iptables para IPv4 e IPv6. Después de algunas búsquedas terminé usando la rama Firewall de IPv6 de Phil Whineray .

FireHOL es un generador de cortafuegos de iptables que produce cortafuegos de filtrado de paquetes de iptables con estado, en hosts y enrutadores Linux con cualquier número de interfaces de red, cualquier número de rutas, cualquier número de servicios servidos, cualquier cantidad de complejidad entre las variaciones de los servicios (incluyendo positivo y negativo) expresiones). (Fuente: sitio web de FireHOL)

Lamentablemente, la versión oficial carece de soporte para IPv6. Pero Phil Whineray ha agregado soporte en una rama no oficial.

Algunos ejemplos sobre cómo se ve la configuración:

# allowing outgoing http and https requests for ipv4 and ipv6 (default setting when nothing is specified):
client "http https" accept

# allow incoming ssh only on ipv4
ipv4 server ssh accept

# allow incoming IMAP requests only for ipv6
ipv6 server imap accept

Puedes ver esta rama de firehol en:

git clone git://repo.or.cz/fireholvi.git

Puede encontrar documentación adicional en la documentación oficial de FireHOL o en el archivo Léame adicional sobre IPv6 .

Personalmente, probablemente sería cauteloso al usarlo en una máquina de producción donde es importante tener un firewall 100% confiable. Pero vale la pena echarle un vistazo, sin embargo.

bb-generation
fuente
3

En aras de la evangelización continua de la causa, sugiero aprovechar Puppet para levantar cosas. Actualmente no existe un buen script para manejar las reglas de iptables 4 y 6, pero tampoco sería un gran desafío escribir uno una vez que se ajuste al idioma.

El repositorio público de git de Mediawiki es una mina fantástica de patrones de configuración e incluye una clase de iptables que proporcionará una buena base para comenzar. Puede editarlo para aplicar reglas a ambas pilas a la vez de forma predeterminada y tener marcas para diferentes reglas cuando basa las cosas en reglas IPv4 o IPv6.

La ventaja final al final de esto es que las reglas de firewall para un servicio pueden escribirse en la definición del servicio y desplegarse y eliminarse automáticamente cuando se despliega o elimina un servicio.

Jeff Ferland
fuente
Le daré un vistazo. En general, hasta ahora no me impresionaron las soluciones típicas basadas en Puppet para administrar iptables. En particular, todos parecen implementar el orden explícitamente, ya sea a través de nombres de archivos de fragmentos o mediante índices explícitos proporcionados en las reglas de Puppet, en lugar de utilizar los mecanismos de resolución de dependencia de Puppet, que es lo que realmente quiero. Si la solución vinculada aquí evita estos problemas, estoy de acuerdo.
Larsks
@larsks Estoy de acuerdo y me he sentido igualmente frustrado porque no se ha lanzado una buena solución genérica ... pero tal vez es hora de que lo haga yo mismo. Puppet permitirá usar el before => Resource['declared_name']en cualquier definición, por lo que puede ordenarlos usando una implementación que no intente ordenar cosas con fragmentos. Un buen uso de Augueas para la estructura también evitaría este problema: haga sus comentarios en el árbol superior y sus pedidos a continuación como desee.
Jeff Ferland
Mis propios intentos de resolver esto no han llegado muy lejos. Lo que he hecho por ahora es (a) instalar fragmentos en un subdirectorio y luego (b) usar rcorder para ponerlos en orden de dependencia. Funciona, pero como se basa exclusivamente en la gestión de archivos de fragmentos, no se presta a un entorno mixto ipv4 / ipv6. Realmente no he mirado de cerca el uso de Augeas para ayudar a resolver el problema. Me gustaría saber si tienes algún código prototipo por ahí.
Larsks
2

Respondiendo mi propia pregunta aquí, pero pensé que esta información podría ser de interés general:

Mientras miraba esta pregunta, me topé con ufw ( Firewall sin complicaciones) de la gente de Ubuntu. Con IPV6 habilitado en la configuración de ufw, ufw administrará las reglas de iptables y ip6tables en paralelo. Esto significa que puedes hacer algo como esto:

# ufw allow ssh/tcp

Y terminar con:

# ufw status
Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
22/tcp                     ALLOW       Anywhere (v6)

Lo que da como resultado reglas de iptables / ip6tables que se ven así:

# iptables-save | grep 'dport 22'
-A ufw-user-input -p tcp -m tcp --dport 22 -j ACCEPT
# ip6tables-save | grep 'dport 22'
-A ufw6-user-input -p tcp -m tcp --dport 22 -j ACCEPT

Ufw también admite perfiles de aplicaciones, que le permiten crear grupos de puertos con nombre. Puedes hacerlo:

# ufw allow 'WWW Full'

Y termine abriendo los puertos 80 y 443 (tanto para IPv4 como para IPv6).

Acabo de empezar a mirarlo, pero parece estar bastante bien organizado.

larsks
fuente
0

Dado que todavía falta en la lista: Shorewall es una herramienta de configuración de filtro de paquetes con muchas funciones, ampliamente adoptada y actualizada regularmente. Tenía soporte IPv6 por un tiempo ahora.

el wabbit
fuente
1
Entiendo que "shorewall" es solo ipv4 y "shorewall6" es solo ipv6, y uno debe usar ambos para cubrir ambos protocolos. ¿Pueden compartir una configuración común?
lanza el