Как предотвратить подмену IP-адреса с помощью MAC и ebtables?

Как предотвратить подмену IP-адреса с помощью MAC и ebtables?

Я пытаюсь создать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

Мне наконец удалось разработать работающее решение.

  1. Решение использует ebtables и пары IP-MAC.
  2. Единственная необходимая таблица — это таблица «фильтра» по умолчанию.
  3. Нет необходимости добавлять какие-либо правила или политику в цепочку INPUT, поскольку цепочка INPUT НЕ связана с запуском виртуальных машин. Объяснение значения цепочек INPUT, OUTPUT и FORWARD в таблице фильтров находится на странице руководства ebtables.
  4. Поскольку 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-адресов предотвращена.

Это решение может быть несовершенным, и если у вас есть какие-либо замечания или предложения по улучшению, я с радостью их выслушаю.

Связанный контент