Как предотвратить IP-спуфинг с использованием MAC и ebtables?

10

Я пытаюсь создать правила сопряжения 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] +?

Большое спасибо за любые ответы.

Мартин
источник
2
Но что, если кто-то подделывает их макинтош?
Zoredache
1
Ну, это тоже проблема. Но угадать правильную пару IP-MAC очень сложно и своевременно превышает уровень безопасности моего сервиса.
Мартин

Ответы:

12

Мне наконец удалось выработать рабочее решение.

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

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

Мартин
источник