Я работаю над диссертационным исследовательским проектом, и мне трудно понять, как получить 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, которые работают глобально для всех виртуальных машин. Он отлично работает на умеренно загруженных серверах.