Как я могу написать автоматизированные тесты для iptables?
Я настраиваю роутер Linux с iptables
, Я хочу написать приемочные тесты для конфигурации, которые утверждают такие вещи, как:
- трафик от какого-то парня в интернете не перенаправляется, и
- TCP на порт 80 на веб-сервере в DMZ от хостов в корпоративной локальной сети пересылается.
Древний FAQ ссылается на iptables -C
опция, которая позволяет спросить что-то вроде: "при наличии пакета от X до Y на порту Z он будет принят или отброшен?" Хотя FAQ предполагает, что это работает так, для iptables
(но, возможно, нет ipchains
как это используется в примерах) -C
Опция, похоже, не имитирует тестовый пакет, проходящий через все правила, а скорее проверяет наличие точно совпадающего правила. Это имеет мало значения в качестве теста. Я хочу утверждать, что правила имеют желаемый эффект, а не только то, что они существуют.
Я подумал о создании еще большего количества тестовых виртуальных машин и виртуальной сети, а затем исследую такие инструменты, как nmap
для эффектов. Однако я избегаю этого решения из-за сложности создания всех этих дополнительных виртуальных машин, что на самом деле является довольно сложным способом генерирования некоторого тестового трафика. Также было бы неплохо иметь методологию автоматизированного тестирования, которая также может работать на реальном сервере.
Как еще я могу решить эту проблему? Есть ли какой-то механизм, который я мог бы использовать для генерации или симуляции произвольного трафика, а затем узнать, был ли он (или будет) отброшен или принят iptables
?
2 ответа
Если вы готовы сделать немного кодирования, вы можете попробовать это:
- Создайте новое пространство имен сети с помощью
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
Команда получает тайм-аут, если набор правил отбрасывает пакет.
Это не касается исходного сетевого пространства имен, в котором все ваше производство будет работать по умолчанию. Единственный способ добиться большего отрыва от производства - запустить его на отдельном хосте (физическом или виртуальном).
Профессиональный мир делает это с помощью аппаратного / программного обеспечения, предоставленного двумя компаниями.
В первом случае вы можете использовать что-то вроде шасси Ixia 400T + Ixload.
Во втором случае строка Smartbits или Testcenter с соответствующими приложениями
Эти устройства могут (среди прочего) эмулировать множество клиентов, выполняющих различные виды запросов на выбранном целевом сервере. Они готовы протестировать безопасность ваших серверов, включая заранее определенный набор тестов атак, плюс вы всегда можете определить свой собственный набор. У них также есть много других возможностей, таких как нагрузочные стресс-тесты и тому подобное.
Не дешевый вариант.