Como posso escrever testes automatizados para iptables?

13

Estou configurando um roteador Linux com iptables. Quero escrever testes de aceitação para a configuração que afirma coisas como:

  • o tráfego de alguém na internet não é encaminhado e
  • O TCP para a porta 80 no servidor da Web na DMZ dos hosts na LAN corporativa é encaminhado.

Um FAQ antigo faz alusão a uma iptables -Copção que permite perguntar algo como "dado um pacote de X a Y, na porta Z, ele seria aceito ou descartado?" Embora o FAQ sugira que funcione assim, para iptables(mas talvez não ipchainscomo é usado nos exemplos) a -Copção parece não simular um pacote de teste executando todas as regras, mas verifica a existência de uma regra exatamente correspondente. Isso tem pouco valor como teste. Quero afirmar que as regras têm o efeito desejado, não apenas que elas existem.

Eu considerei criar ainda mais VMs de teste e uma rede virtual e, em seguida, pesquisar com ferramentas como nmapefeitos. No entanto, estou evitando esta solução devido à complexidade de criar todas essas máquinas virtuais adicionais, o que é realmente uma maneira bastante pesada de gerar algum tráfego de teste. Também seria bom ter uma metodologia de teste automatizada que também possa funcionar em um servidor real em produção.

De que outra forma eu poderia resolver esse problema? Existe algum mecanismo que eu possa usar para gerar ou simular tráfego arbitrário e saber se foi (ou seria) descartado ou aceito por iptables?

Phil Frost
fonte
Este também pode ser interessante: security.stackexchange.com/questions/31957/…
dawud
1
@dawud Eu não acho que esses dois sejam duplicados. Eu sei como executar uma verificação de porta: esse não é um bom teste, porque estou limitado a testar de e para destinos e fontes que posso controlar. Minha preocupação também não é me bloquear do servidor. Quero testar automaticamente se as regras do firewall realmente têm os efeitos que eu as projetei.
Phil Frost

Respostas:

2

Se você estiver preparado para codificar um pouco, tente o seguinte:

  • Crie um novo espaço para nome da rede usando o CLONE_NEWNETsinalizador para a clonechamada do sistema ou usando os comandos ip netns adde ip netns exec.
  • Nesse espaço de nome, crie um conjunto de interfaces de rede virtual usando o tundriver ou ip link add.
  • Carregue a configuração usando iptables-restore
  • Alimente um número de pacotes às regras através dos dispositivos tunouveth
  • Observe que você obtém os pacotes corretos dos dispositivos tunouveth

Essa abordagem provavelmente funcionará melhor para testar regras para pacotes encaminhados. As conexões de / para a máquina em que o iptables é usado exigem um pouco mais de esforço, mas também devem ser possíveis de serem testados dessa maneira.

Aqui está um exemplo de uma sequência de comandos que pode ser usada:

ip netns add test-iptables
ip netns add test-iptables-some-guy-on-the-internet
ip netns add test-iptables-lan-host

ip netns exec test-iptables ip link add eth0 type veth peer name eth0-peer
ip netns exec test-iptables ip link set eth0-peer netns test-iptables-some-guy-on-the-internet
ip netns exec test-iptables ip link add eth1 type veth peer name eth1-peer
ip netns exec test-iptables ip link set eth1-peer netns test-iptables-lan-host

ip netns exec test-iptables ifconfig eth0 192.0.2.2 netmask 255.255.255.0
ip netns exec test-iptables ifconfig eth1 203.0.113.1 netmask 255.255.255.0

ip netns exec test-iptables-some-guy-on-the-internet ifconfig eth0-peer 192.0.2.1 netmask 255.255.255.0
ip netns exec test-iptables-some-guy-on-the-internet route add default gateway 192.0.2.2

ip netns exec test-iptables-lan-host ifconfig eth1-peer 203.0.113.2 netmask 255.255.255.0
ip netns exec test-iptables-lan-host route add default gateway 203.0.113.1

ip netns exec test-iptables-some-guy-on-the-internet telnet 203.0.113.2
ip netns exec test-iptables iptables-restore < /tmp/iptables-test
ip netns exec test-iptables-some-guy-on-the-internet telnet 203.0.113.2

ip netns del test-iptables
ip netns del test-iptables-some-guy-on-the-internet
ip netns del test-iptables-lan-host

Isso criaria três namespaces de rede para testar e carregar um conjunto de regras do iptables em um deles. Os outros dois servem como o papel de um cara na internet e um host na LAN.

No exemplo acima, o primeiro telnetcomando obtém a conexão recusada do test-iptables-lan-hostespaço para nome, o segundo telnetcomando obtém um tempo limite se o conjunto de regras descarta o pacote.

Isso não toca no namespace inicial da rede, que é o padrão em que toda a sua produção estará acontecendo. A única maneira de obter mais separação de sua produção é executá-la em um host separado (físico ou virtual).

Kasperd
fonte
0

o mundo profissional faz isso com a ajuda do hardware / software fornecido por duas empresas.

www.ixiacom.com

www.spirent.com

No primeiro caso, você pode usar algo como um chassi Ixia 400T + Ixload.

No segundo caso, a linha Smartbits ou Testcenter com seus aplicativos correspondentes

Esses dispositivos podem (entre outras coisas) emular muitos clientes executando diferentes tipos de solicitações no servidor de destino selecionado. Eles estão prontos para testar a segurança de seus servidores, incluindo um conjunto predefinido de testes de ataque, e você sempre pode definir seu próprio conjunto. Eles também têm muitos outros recursos, como testes de estresse de carga e similares.

Não é uma opção barata.

Pat
fonte
é incrível ver o quão simples ignorância pode tranquilamente fazer o downgrade respostas válidas ...
Pat