Я пытаюсь создатьIP-MACправила сопряжения вebtables. Доступно несколько руководств и связанных с ними вопросов [1], но у меня есть определенная настройка.
СРЕДА: У меня естьмного физических хостов. На каждом хосте есть несколько карт Ethernet, соединенных в бонд и используемых в качестве ведомых для моста. На каждом хосте есть много виртуальных машин (kvm, qemu, libvirt). Каждая виртуальная машина подключена к мосту своего физического хоста через новый порт, называемый vnet[0-9]+. NAT отсутствует. Сетевое взаимодействие работает отлично, все физические хосты можно пинговать, все виртуальные машины тоже. Каждая виртуальная машина имеет свой собственный IP-адрес и MAC-адрес.
ПРОБЛЕМА:Внутри виртуальной машины IP-адрес можно изменить на другой.
НАЙДЕНО РЕШЕНИЕ:Известное решение есть на сайте ebtables [2], но это решение применимо, когда используется только один хост. Оно разрешает весь трафик, и если есть пакет с IP с другим MAC, чем разрешено, пакет отбрасывается. Если есть более одного хоста, требуется, чтобы все существующие пары IP-MAC были зарегистрированы на всех хостах. Необходимо решение обратной политики.
РАЗРАБОТАННОЕ РЕШЕНИЕ:Я пробовал использовать ebtables в перевернутом виде. Вот пример того, что я пробовал.
ПРИМЕР 1
Bridge table: filter
Bridge chain: INPUT, entries: 2, policy: DROP
-i bond0 -j ACCEPT
-p IPv4 -s 54:52:0:98:d7:b6 --ip-src 192.168.11.122 -j ACCEPT
Bridge chain: FORWARD, entries: 0, policy: ACCEPT
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
ПРИМЕР 2
Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 1, policy: DROP
-p IPv4 -s 54:52:0:98:d7:b6 --ip-src 192.168.11.122 -j ACCEPT
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
Суть того, что я хочу, это иметь политику по умолчанию DROP и разрешать трафик только с виртуальных машин с правильной парой IP-MAC, развернутой на данном хосте. Однако эти решения не работают.
ВОПРОС:Как разрешить трафик на мосту только для указанных пар IP-MAC работающих виртуальных машин и отбросить все неизвестные пары IP-MAC, поступающие с портов vnet[0-9]+?
Большое спасибо за любые ответы.
решение1
Мне наконец удалось разработать работающее решение.
- Решение использует ebtables и пары IP-MAC.
- Единственная необходимая таблица — это таблица «фильтра» по умолчанию.
- Нет необходимости добавлять какие-либо правила или политику в цепочку INPUT, поскольку цепочка INPUT НЕ связана с запуском виртуальных машин. Объяснение значения цепочек INPUT, OUTPUT и FORWARD в таблице фильтров находится на странице руководства ebtables.
- Поскольку ebtables работает на уровне Ethernet, а сопряжение IP-MAC применимо только для IP-пакетов, необходимо подчеркнуть это в правилах, чтобы не блокировать кадры ARP и другой важный трафик.
Итак, в начале нет никаких правил, и все политики настроены на ПРИНЯТЬ. Нет никаких пользовательских цепочек. Таблица фильтров выглядит так:
Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 0, policy: ACCEPT
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
Добавляется новая цепочка. Эта цепочка содержит все разрешенные пары IP-MAC. Она называется VMS.
# ebtables -N VMS
Теперь важная часть. Для каждого кадра, содержащего IP-пакет (или его части), который проходит через мост с порта vnet[0-9]+, применить политику цепочки и правила цепочки VMS. Другими словами, для каждого IP-пакета, приходящего с любой виртуальной машины, применить цепочку VMS.
# ebtables -A FORWARD -p ip -i vnet+ -j VMS
Политика по умолчанию цепочки VMS должна быть DROP. Таким образом, каждый IP-пакет, приходящий с любой виртуальной машины, по умолчанию отбрасывается. Позже добавляются исключения разрешенных пар IP-MAC. Политика по умолчанию DROP приводит к тому, что весь трафик с любой виртуальной машины с неизвестной парой IP-MAC отбрасывается сразу, что делает подделку IP невозможной.
# ebtables -P VMS DROP
Фильтр таблицы теперь выглядит так. Также, так он выглядит, когда нет запущенных виртуальных машин (разрешено).
Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 1, policy: ACCEPT
-p IPv4 -i vnet+ -j VMS
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
Bridge chain: VMS, entries: 0, policy: DROP
Предположим, есть две работающие машины. Если мы попытаемся пинговать их, трафик сбрасывается и пункт назначения недоступен. Это желаемый результат, так как этот трафик еще не разрешен. Достаточно одной команды, чтобы разрешить трафик каждой виртуальной машины.
# ebtables -A VMS -p ip --ip-src 192.168.11.125 -s 54:52:00:cc:35:fa -j ACCEPT
# ebtables -A VMS -p ip --ip-src 192.168.11.122 -s 54:52:00:98:d7:b6 -j ACCEPT
Теперь трафик с разрешенных виртуальных машин проходит нормально, а подмена IP-адресов предотвращена.
Это решение может быть несовершенным, и если у вас есть какие-либо замечания или предложения по улучшению, я с радостью их выслушаю.