Назад | Перейти на главную страницу

Как я могу написать автоматические тесты для iptables?

Я настраиваю маршрутизатор Linux с iptables. Я хочу написать приемочные тесты для конфигурации, которые подтверждают такие вещи, как:

Древний FAQ ссылается на iptables -C опция, которая позволяет задать что-то вроде: «учитывая пакет из X в Y, на порт Z, будет ли он принят или отброшен?» Хотя FAQ предлагает, чтобы это работало так, для iptables (но может и нет ipchains как он используется в примерах) -C вариант, похоже, не имитирует тестовый пакет, проходящий через все правила, а скорее проверяет наличие точно соответствующего правила. Это мало что значит для проверки. Я хочу заявить, что правила имеют желаемый эффект, а не просто их существование.

Я подумал о создании еще нескольких тестовых виртуальных машин и виртуальной сети, а затем попытался использовать такие инструменты, как nmap для эффектов. Однако я избегаю этого решения из-за сложности создания всех этих дополнительных виртуальных машин, что на самом деле является довольно сложным способом генерировать некоторый тестовый трафик. Также было бы неплохо иметь методологию автоматического тестирования, которая также может работать на реальном сервере в производственной среде.

Как еще я могу решить эту проблему? Есть ли какой-то механизм, который я мог бы использовать для генерации или имитации произвольного трафика, а затем узнать, был ли он (или будет) отброшен или принят iptables?

Если вы готовы немного кодировать, вы можете попробовать следующее:

  • Создайте новое сетевое пространство имен с помощью CLONE_NEWNET флаг для clone системный вызов, или используя ip netns add и ip netns exec команды.
  • В этом пространстве имен создайте набор виртуальных сетевых интерфейсов с использованием tun водитель или ip link add.
  • Загрузите конфигурацию, используя iptables-restore
  • Подайте несколько пакетов в правила через tun или veth устройства
  • Обратите внимание, что вы получаете правильные пакеты из tun или veth устройства

Этот подход, вероятно, будет лучше всего работать для проверки правил для пересылаемых пакетов. Подключение к / с машины, на которой используется iptables, требует немного больше усилий, но также должно быть возможно проверить этот способ.

Вот пример последовательности команд, которые можно использовать:

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

Это создаст три сетевых пространства имен для тестирования и загрузит набор правил iptables в одно из них. Два других служат в роли какого-то парня в Интернете и хоста в локальной сети.

В приведенном выше примере первый telnet команда получить соединение отклонено от test-iptables-lan-host пространство имен, второе telnet команда получает тайм-аут, если набор правил отбрасывает пакет.

Это не касается исходного сетевого пространства имен, в котором по умолчанию будет происходить вся ваша продукция. Единственный способ добиться большего разделения от вашего производства - запустить его на отдельном хосте (физическом или виртуальном).

профессиональный мир делает это с помощью аппаратного и программного обеспечения, предоставленного двумя компаниями.

www.ixiacom.com

www.spirent.com

В первом случае можно использовать что-то вроде шасси Ixia 400T + Ixload.

Во втором случае линейка Smartbits или Testcenter с соответствующими приложениями

Эти устройства могут (среди прочего) имитировать множество клиентов, выполняющих различные типы запросов на выбранном вами целевом сервере. Они готовы проверить безопасность ваших серверов, включая заранее определенный набор тестов на атаки, плюс вы всегда можете определить свой собственный набор. У них также есть много других возможностей, таких как нагрузочные стресс-тесты и тому подобное.

Не дешевый вариант.