Gerenciando regras paralelas para ipt4 e ipv6 iptables?

10

Recentemente, começamos a experimentar o IPv6, e um dos primeiros problemas que estamos enfrentando é lidar com um conjunto completamente separado de regras de firewall (Linux iptables / ip6ables) para as duas pilhas de protocolos. Nossa lógica de firewall baseia-se amplamente em várias redes específicas (por exemplo, 10.0.0.0/24 é a rede da estação de trabalho da equipe, 10.1.0.0/24 é a rede do banco de dados, 10.2.0.0/24 é a rede do servidor da web, etc. ) e a lógica para o IPv6 e o ​​IPv4 será basicamente a mesma, modulo de prefixos de rede diferentes.

O que as pessoas estão fazendo gerenciam esse tipo de situação? Idealmente, eu gostaria de poder gerar conjuntos de regras iptables e ip6table a partir dos mesmos arquivos de origem. Eu já juntei algo usando o bash, mas não é necessariamente bonito e suspeito que uma solução melhor deve existir em algum lugar por aí.

Eu estaria particularmente interessado em uma solução baseada em Puppet que faça bom uso dos mecanismos de dependência do Puppet para implementar a ordenação relativa de regras (ou grupos de regras).

larsks
fonte

Respostas:

5

O Firewall Builder tem exatamente o que você precisa. Você pode criar um conjunto de regras, marque-o como "ipv4 + ipv6 combinado" e coloque suas redes ipv4 e ipv6 atribuídas ao mesmo segmento (como "rede de banco de dados" etC) na mesma regra. O programa gera duas configurações separadas de tabelas de ip, uma para ipv4 e outra para ipv6. Este capítulo do Guia do Usuário ilustra isso, embora use as listas de acesso dos roteadores Cisco como exemplo. Funciona exatamente da mesma maneira para o iptables.

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

vadimk
fonte
4

Também recentemente fui confrontado com a criação de regras de iptables para IPv4 e IPv6. Após algumas pesquisas, acabei usando o ramo IPv6 FireHOL de Phil Whineray .

O FireHOL é um gerador de firewall iptables que produz firewalls stateful de filtragem de pacotes iptables, em hosts e roteadores Linux com qualquer número de interfaces de rede, qualquer número de rotas, qualquer número de serviços servidos, qualquer complexidade entre variações dos serviços (incluindo positivo e negativo). expressões). (Fonte: site FireHOL)

Infelizmente, a versão oficial não possui suporte para IPv6. Mas Phil Whineray acrescentou apoio em um ramo não oficial.

Alguns exemplos de como a configuração se parece:

# 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

Você pode fazer checkout neste ramo do firehol em:

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

Documentação adicional pode ser encontrada na documentação oficial do FireHOL ou no Leia-me adicional sobre o IPv6 .

Pessoalmente, provavelmente seria cauteloso ao usá-lo em uma máquina de produção em que é importante ter um firewall 100% confiável. Mas vale a pena dar uma olhada, no entanto.

bb-generation
fonte
3

No interesse do evangelismo contínuo da causa, sugiro alavancar o Puppet para fazer o seu levantamento. Atualmente, não existe um bom script para lidar com as regras das tabelas 4 e 6 do iptables, mas não seria um desafio muito grande escrever uma assim que você se ajustasse ao idioma.

O repositório público git do Mediawiki é uma mina fantástica de padrões de configuração e inclui uma classe iptables que fornecerá uma boa base para começar. Você pode editá-lo para aplicar regras às duas pilhas de uma vez por padrão e ter um sinalizador para regras diferentes ao basear as coisas nas regras IPv4 ou IPv6.

O bônus final ao final disso é que as regras de firewall de um serviço podem ser gravadas na definição de serviço e implantadas e removidas automaticamente quando um serviço é implantado ou removido.

Jeff Ferland
fonte
Vou dar uma olhada. Até agora, fiquei impressionado com as soluções típicas baseadas em Puppet para gerenciar iptables. Em particular, todos eles parecem implementar a ordem explicitamente, seja por meio de nomes de arquivos de arquivos de fragmento ou por índices explícitos fornecidos nas regras do Puppet, em vez de usar os mecanismos de resolução de dependência do Puppet, que é o que eu realmente quero. Se a solução vinculada aqui evitar esses problemas, eu sou a favor.
Larsks
@larsks Eu concordo e fiquei igualmente frustrado por não ter sido lançada uma boa solução genérica ... mas talvez seja a hora de fazer isso sozinho. O Puppet permitirá o uso before => Resource['declared_name']de qualquer definição, para que você possa solicitá-los usando uma implementação que não tente solicitar itens com fragmentos. Um bom uso do Augueas para a estrutura também evitaria esse problema - faça seus principais comentários na árvore e faça o pedido abaixo como desejar.
Jeff Ferland
Minhas próprias tentativas de resolver isso não foram muito longe. O que fiz por enquanto é (a) instalar fragmentos em um subdiretório e (b) usar o rcorder para colocá-los em ordem de dependência. Funciona, mas como é baseado exclusivamente no gerenciamento de arquivos de fragmento, não se presta a um ambiente misto de ipv4 / ipv6. Eu realmente não olhei atentamente para usar o Augeas para ajudar a resolver o problema. Gostaria de saber se você tem algum código de protótipo por aí.
Larsks
2

Respondendo à minha própria pergunta aqui, mas achei que esta informação poderia ser de interesse geral:

Enquanto examinava essa questão, me deparei com o ufw (Uncomplicated FireWall) do pessoal do Ubuntu. Com o IPV6 ativado na configuração do ufw, o ufw gerenciará as regras iptables e ip6tables em paralelo. Isso significa que você pode fazer algo assim:

# ufw allow ssh/tcp

E termine com:

# ufw status
Status: active

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

O que resulta em regras de iptables / ip6tables parecidas com esta:

# 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

O Ufw também suporta perfis de aplicativos, que permitem criar grupos de portas nomeados. Você consegue fazer isso:

# ufw allow 'WWW Full'

E acabe abrindo as portas 80 e 443 (para IPv4 e IPv6).

Eu apenas comecei a olhar para ele, mas parece estar bem organizado.

larsks
fonte
0

Como ainda está ausente da lista: Shorewall é uma ferramenta de configuração de filtro de pacotes rica em recursos, amplamente adotada e atualizada regularmente. Ele tinha suporte ao IPv6 por um tempo agora.

o wabbit
fonte
1
Meu entendimento é que "shorewall" é apenas ipv4 e "shorewall6" é apenas ipv6, e é preciso usar os dois para cobrir os dois protocolos. Eles podem compartilhar uma configuração comum?
Larsks