Como posso escrever testes automatizados para o iptables?

13

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

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

Uma antiga FAQ alude a uma opção iptables -C que permite perguntar algo como: "dado um pacote de X, para Y, na porta Z, seria aceito ou descartado?" Embora o FAQ sugira que funciona assim, para iptables (mas talvez não ipchains como ele usa nos exemplos), a opção -C parece não simular um pacote de teste sendo executado em todas as regras, mas sim verificações para o existência de uma regra de correspondência exata. Isso tem pouco valor como teste. Eu 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, investigar com ferramentas como nmap para efeitos. No entanto, estou evitando essa solução devido à complexidade de criar todas essas máquinas virtuais adicionais, o que é realmente uma maneira bastante difícil de gerar tráfego de teste. Também seria bom ter uma metodologia de teste automatizada que também funcione em um servidor real em produção.

De que outra forma posso resolver este problema? Existe algum mecanismo que eu possa usar para gerar ou simular tráfego arbitrário, então saber se ele foi (ou seria) descartado ou aceito por iptables ?

    
por Phil Frost 30.05.2014 / 17:25

2 respostas

2

Se você estiver preparado para fazer um pouco de codificação, tente isso:

  • Crie um novo namespace de rede usando o sinalizador CLONE_NEWNET para a chamada de sistema clone ou usando os comandos ip netns add e ip netns exec .
  • Nesse namespace, crie um conjunto de interfaces de rede virtual usando o tun driver ou ip link add .
  • Carregue a configuração usando iptables-restore
  • Alimente vários pacotes com as regras por meio dos dispositivos tun ou veth
  • Observe que você obtém os pacotes corretos dos dispositivos tun ou veth

Essa abordagem provavelmente funcionará melhor para testar regras para pacotes encaminhados. Conexões para / da máquina onde o iptables é usado requer um pouco mais de esforço, mas deve ser viável para testar dessa forma também.

Aqui está um exemplo de uma seqüência de comandos que podem ser usados:

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 de 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 comando telnet obtém conexão recusada do namespace test-iptables-lan-host , o segundo comando telnet obtém um tempo limite se o conjunto de regras descartar o pacote.

Isso não afeta o 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á-lo em um host separado (físico ou virtual).

    
por 01.06.2014 / 00:00
0

o mundo profissional faz isso com a ajuda de 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 em seu servidor de destino selecionado. Eles vêm prontos para testar a segurança de seus servidores, incluindo um conjunto pré-definido de testes de ataque, e você sempre pode definir seu próprio conjunto. Eles também têm muitos outros recursos, como testes de carga e afins.

Não é uma opção barata.

    
por 31.05.2014 / 21:40