Я пытаюсь создать правила сопряжения IP-MAC в ebtables . Есть несколько учебных пособий и связанных с ними вопросов [1], но у меня есть особые настройки.
ОКРУЖАЮЩАЯ СРЕДА: У меня много физических хозяев . Каждый хост имеет несколько сетевых карт, соединенных в связку и используемых в качестве подчиненных для моста. На каждом хосте много виртуальных машин (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] +?
Большое спасибо за любые ответы.
Ответы:
Мне наконец удалось выработать рабочее решение.
Итак, в начале не существует никаких правил, и все политики настроены для ПРИНЯТИЯ. Там нет пользовательских цепочек. Таблица фильтров выглядит следующим образом:
Новая цепь добавлена. Эта цепочка содержит все разрешенные пары IP-MAC. Это называется VMS.
Теперь важная часть. Для каждого кадра, содержащего IP-пакет (или его части), который проходит через мост через порт vnet [0-9] +, примените политику цепочки и правила цепочки VMS. Другими словами, для каждого IP-пакета, приходящего с любой виртуальной машины, применяется цепочка VMS.
Политика по умолчанию цепочки VMS должна быть DROP. Таким образом, каждый IP-пакет, приходящий с любой виртуальной машины, по умолчанию отбрасывается. Позже добавляются разрешенные исключения пар IP-MAC. Политика DROP по умолчанию приводит к тому, что весь трафик с любой виртуальной машины с неизвестной парой IP-MAC удаляется одновременно, что делает невозможным подделку IP.
Табличный фильтр теперь выглядит следующим образом. Кроме того, этот способ выглядит, когда нет запущенных виртуальных машин (разрешено).
Предположим, есть две работающие машины. Если мы попытаемся пропинговать их, трафик сбрасывается, а пункт назначения недоступен. Это желаемый результат, так как этот трафик еще не разрешен. Для разрешения трафика каждой виртуальной машины достаточно одной команды.
Теперь трафик с разрешенных виртуальных машин проходит нормально, а подмена IP-адресов предотвращена.
Это решение может быть несовершенным, и если у вас есть какие-либо комментарии или улучшения, я с удовольствием их выслушаю.
источник