Comment puis-je écrire des tests automatisés pour iptables?

13

Je configure un routeur Linux avec iptables. Je veux écrire des tests d'acceptation pour la configuration qui affirment des choses comme:

  • le trafic d'un type sur Internet n'est pas transmis, et
  • Le TCP vers le port 80 sur le serveur Web dans la DMZ à partir d'hôtes sur le LAN de l'entreprise est transféré.

Une ancienne FAQ fait allusion à une iptables -Coption qui permet de demander quelque chose comme, "étant donné un paquet de X, à Y, sur le port Z, serait-il accepté ou abandonné?" Bien que la FAQ suggère que cela fonctionne comme ceci, car iptables(mais peut-être pas ipchainscomme il l'utilise dans les exemples), l' -Coption ne semble pas simuler un paquet de test exécutant toutes les règles, mais vérifie plutôt l'existence d'une règle de correspondance exacte. Cela a peu de valeur en tant que test. Je veux affirmer que les règles ont l'effet souhaité, pas seulement qu'elles existent.

J'ai envisagé de créer encore plus de machines virtuelles de test et un réseau virtuel, puis de tester avec des outils comme les nmapeffets. Cependant, j'évite cette solution en raison de la complexité de la création de toutes ces machines virtuelles supplémentaires, ce qui est vraiment un moyen assez lourd de générer du trafic de test. Il serait également intéressant d'avoir une méthodologie de test automatisée qui peut également fonctionner sur un vrai serveur en production.

Sinon, comment pourrais-je résoudre ce problème? Existe-t-il un mécanisme que je pourrais utiliser pour générer ou simuler du trafic arbitraire, puis savoir s'il a été (ou serait) rejeté ou accepté iptables?

Phil Frost
la source
Celui-ci pourrait aussi être intéressant: security.stackexchange.com/questions/31957/…
dawud
1
@dawud Je ne pense pas que ce soit des doublons. Je sais comment exécuter une analyse de port: ce n'est pas un bon test car je suis limité aux tests vers et depuis des destinations et des sources que je peux contrôler. Ma préoccupation n'est pas non plus de me verrouiller hors du serveur. Je veux tester automatiquement que les règles de pare-feu ont réellement les effets que je leur ai conçus.
Phil Frost

Réponses:

2

Si vous êtes prêt à faire un peu de codage, vous pouvez essayer ceci:

  • Créez un nouvel espace de noms réseau à l'aide de l' CLONE_NEWNETindicateur de l' cloneappel système ou à l'aide des commandes ip netns addet ip netns exec.
  • Dans cet espace de noms, créez un ensemble d'interfaces réseau virtuelles à l'aide du tunpilote ou ip link add.
  • Chargez la configuration à l'aide iptables-restore
  • Nourrir un certain nombre de paquets aux règles par le tunou les vethdispositifs
  • Observez que vous obtenez les bons paquets des tunou des vethappareils

Cette approche fonctionnera probablement le mieux pour tester les règles des paquets transférés. Les connexions vers / depuis la machine sur laquelle iptables est utilisé nécessitent un peu plus d'efforts, mais devraient également être réalisables pour les tests de cette manière.

Voici un exemple de séquence de commandes pouvant être utilisées:

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

Cela créerait trois espaces de noms réseau pour tester et charger un ensemble de règles iptables dans l'un d'eux. Les deux autres jouent le rôle d'un gars sur Internet et d'un hôte sur le LAN.

Dans l'exemple ci-dessus, la première telnetcommande obtient une connexion refusée à partir de l' test-iptables-lan-hostespace de noms, la deuxième telnetcommande obtient un délai d'expiration si l'ensemble de règles supprime le paquet.

Cela ne touche pas l'espace de noms réseau initial, qui est celui dans lequel votre production se déroulera par défaut. La seule façon d'obtenir plus de séparation de votre production est de l'exécuter sur un hôte séparé (physique ou virtuel).

kasperd
la source
0

le monde professionnel le fait à l'aide de matériel / logiciel fourni par 2 entreprises.

www.ixiacom.com

www.spirent.com

Dans le premier cas, vous pouvez utiliser quelque chose comme un châssis Ixia 400T + Ixload.

Dans le second cas, la ligne Smartbits ou Testcenter avec leurs applications correspondantes

Ces appareils peuvent (entre autres) émuler de nombreux clients effectuant différents types de demandes sur votre serveur cible sélectionné. Ils sont prêts à tester la sécurité de vos serveurs, y compris un ensemble prédéfini de tests d'attaque et vous pouvez toujours définir votre propre ensemble. Ils ont également de nombreuses autres capacités comme les tests de contrainte de charge et similaires.

Pas une option bon marché.

Tapoter
la source
il est étonnant de voir comment une simple ignorance peut discrètement rétrograder des réponses valides ...
Pat