Як запобігти підробленню IP за допомогою MAC та ebtables?


10

Я намагаюся створити правила сполучення IP-MAC в ebtables . Є кілька підручників та пов'язаних із цим питань [1], але у мене є певна настройка.

ЕКОЛОГІЯ: У мене багато фізичних господарів . У кожного хоста є кілька карток Ethernet, об'єднаних у зв'язки і використовуваних як раб для мосту. На кожному хості є багато віртуальних машин (kvm, qemu, libvirt). Кожна віртуальна машина підключена до мосту свого фізичного хоста через новий порт під назвою vnet [0-9] +. Не існує НАТ. Мережа працює чудово, всі фізичні хости можуть пінгнути, всі віртуальні машини теж. У кожної віртуальної машини є своя 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
Але що робити, якщо хтось підробляє їх мак?
Зоредаче

1
Ну, і це теж проблема. Але відгадати правильну пару IP-MAC дуже важко і вчасно перевершує рівень безпеки мого сервісу.
Мартін

Відповіді:


12

Нарешті мені вдалося розробити робоче рішення.

  1. Рішення використовує ebtables та IP-MAC-пари.
  2. Тільки потрібна таблиця - це таблиця "фільтр" за замовчуванням.
  3. Не потрібно додавати жодних правил чи політик до ланцюга INPUT, оскільки ланцюг INPUT НЕ пов'язаний із запуском віртуальних машин. Пояснення значення ланцюгів INPUT, OUTPUT та FORWARD у таблиці фільтрів знаходиться на сторінці ebtables.
  4. Оскільки ebtables працює на рівні Ethernet, а з'єднання IP-MAC застосовується лише для IP-пакетів, це потрібно чітко використовувати в правилах, щоб не блокувати кадри ARP та інший життєвий трафік.

Отже, на початку немає жодних правил і всі політики налаштовані на ACCEPT. Немає визначених користувачем ланцюгів. Таблиця фільтрів виглядає так:

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-адреси запобігається.

Це рішення може бути недосконалим, і якщо у вас є коментарі чи покращення, я з радістю почую їх.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.