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

Настройте IPTables на хосте KVM для блокировки трафика гостевого моста

Я работаю над диссертационным исследовательским проектом, и мне трудно понять, как получить iptables (выполняется на хосте KVM) для блокировки трафика (или, скорее, манипулирования трафиком), предназначенного для МОСТ KVM гость. Я не могу получить iptables записи (вставлены ниже) для блокировки трафика к виртуальным машинам и от них.

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

Я использую CentOS 6, и на основании другого вопроса, который я написал: Используйте одну сетевую карту для создания нескольких интерфейсов для Linux KVM, У меня настроены следующие интерфейсы:

eth0
br0
tap0

Ниже приведены мои сценарии настройки сети для каждого интерфейса:

eth0Конфигурация:

DEVICE="eth0"
BOOTPROTO="none"
NM_CONTROLLED="no"
ONBOOT=yes
TYPE="Ethernet"
UUID="<<UUID-HERE>>"
HWADDR=<<MAC-ADDR-HERE>>
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"
BRIDGE="br0"

br0Конфигурация:

DEVICE="br0"
TYPE="Bridge"
ONBOOT="yes"
BOOTPROTO="dhcp"
DELAY=0

tap0Конфигурация:

DEVICE="tap0"
TYPE="Tap"
BRIDGE="br0"
ONBOOT="yes"

У меня работает виртуальная машина CentOS 6, и она настроена на использование tap0 мостовой интерфейс. Сеть на виртуальной машине работает правильно. Никаких других изменений в хост-системе не производилось.

Ниже приведены неработающие iptables правила, которые я добавил в FORWARD цепь (Стоит отметить, что я не большой специалист по iptables все же).

sudo iptables -I FORWARD -i any -o tap0 -j DROP
sudo iptables -I FORWARD -i tap0 -o any -j DROP

После выполнения команд FORWARD таблица выглядит так:

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       all  --  tap0   any     anywhere             anywhere            
    0     0 DROP       all  --  any    tap0    anywhere             anywhere            
    0     0 REJECT     all  --  any    any     anywhere             anywhere            reject-with icmp-host-prohibited 

К сожалению, это не блокирует трафик. Я не понимаю, почему это не сработает.

ОБНОВЛЕНИЕ: 25.11.2014: Прошло много времени с тех пор, как я последний раз обновлял это. Как оказывается, iptables имеет physdev плагин, который я успешно использую в своих исследованиях, и он более гибкий, чем ebtables.

Убедитесь, что вы понимаете основные принципы работы в сети. Мост - это коммутатор, работающий на уровне 2. Ваш iptables правила применяются к Уровню 3 и не будут переданы на этом уровне.

Смотреть в ebtables и укажите там правила уровня 2 - или - полностью отключите использование мостов и перейдите к настройке с маршрутизацией, при которой весь трафик проходит через хост на уровне 3. Не уверен, что последний вариант возможен с использованием Libvirt / KVM.

Если вы это сделаете:

echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

он включит netfilter на мостах, а затем вы можете настроить правила iptables в цепочке FORWARD, чтобы влиять на пакеты, идущие к / от виртуальных машин через интерфейс моста.

Чтобы сделать его постоянным при перезагрузке:

редактировать /etc/sysctl.conf и установить net.bridge.bridge-nf-call-iptables = 1

https://wiki.libvirt.org/page/Net.bridge.bridge-nf-call_and_sysctl.conf

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