Фильтрации пакетов для программных мостов

Posted by

Данная заметка есть продолжение предыдущей где я рассматривал, как объединять интерфейсы в один образуя программный мост, а также той где упоминал что на основе собранной информации по MAC адресам всех систем в локальной сети буду разграничивать доступ. Существует еще один этап безопасности который можно использовать на благо своей сети – это

объединение коммутатора и брандмауера посредством утилиты ebtables которая также присутствует в репозитариях .5 Server

ekzorchik@srv-mon:~$ apt-cache search ebtables

ebtables — Ethernet bridge frame table administration

Брандмауер на канальном уровне ничем себя не выдает по сравнений с сетевым, он прозрачен/невидимый

Утилита ebtables имеет в своем арсенале следующие возможности:

— фильтрация на уровне протокола Ethernet;
— фильтрация MAC-адресов;
— простая фильтрация по заголовкам IP;
— фильтрация по заголовкам ARP;
— фильтрация VLAN 802.1Q;
— фильтрация входящего и исходящего интерфейсов (логических и физических устройств);
— трансляция MAC-адресов (NAT);
— ведение логов;
— счетчики кадров;
— возможность добавлять, удалять, вставлять правила, сбрасывать цепочки, обнулять счетчики;
— возможность создавать brouter;
— возможность автоматической загрузки таблицы с созданными правилами в ядро;
— поддержка определяемых пользователем цепочек;
— поддержка маркировки кадров и соответствия маркированным кадрам.

Для справки: ebtables чем-то напоминает iptables с той лишь разницей, что используется на втором уровне модели OSI (Канальный уровень), а iptables на третьем (Сетевой уровень)

  • Канальный уровень – Физическая адресация – PPP, IEEE 802.2, L2TP, ARP
  • Сетевой уровень – Определение маршрута и логическая адресация – IPv4,IPv6,IPsec

Для справки: трафик проверяется ebtables раньше, чем это сделает iptables – т.к. это разные уровни модели OSI. В ebtables управление идет на основе MAC-адреса, а в iptablesIP-адреса.

ekzorchik@srv-mon:~$ sudo apt-get install ebtables -y

Текущие правила:

ekzorchik@srv-mon:~$ sudo ebtables --list

Bridge table: filter

Bridge chain: INPUT, entries: 0, policy: ACCEPT → входящие правила

Bridge chain: FORWARD, entries: 0, policy: ACCEPT → правила идущие транзитом

Bridge chain: OUTPUT, entries: 0, policy: ACCEPT → исходящие правила

К примеру запретим подключение к текущей системе если компьютер с которого я подключаюсь имеет следующий MAC-адрес

(мой компьютер с которого я подключаюсь к системе где изучаю работу bridge:

aollo@system:~> sudo ifconfig vlan10 | grep ‘addr’

vlan10 Link encap:Ethernet HWaddr 00:E0:4C:8D:7F:E9

inet addr:10.7.8.227 Bcast:10.7.8.255 Mask:255.255.255.0)

ekzorchik@srv-mon:~$ sudo ebtables -A INPUT -s 00:E0:4C:8D:7F:E9 -j DROP

теперь пробую послать ECHO запрос к хосту 10.7.8.154 с 10.7.8.227 и получаю – блокировка:

aollo@system:~> ping 10.7.8.154

PING 10.7.8.154 (10.7.8.154) 56(84) bytes of data.

^C

— 10.7.8.154 ping statistics —

5 packets transmitted, 0 received, 100% packet loss, time 3999ms

Работает, для удаления правила, отобразим сперва все правила какие есть а уже потом на основе вывода удалим созданную выше цепочку:

ekzorchik@srv-mon:~$ sudo ebtables -L

Bridge table: filter

Bridge chain: INPUT, entries: 0, policy: ACCEPT

-s 00:E0:4C:8D:7F:E9 -j DROP → удаляем эту цепочку

Bridge chain: FORWARD, entries: 0, policy: ACCEPT

Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

ekzorchik@srv-mon:~$ sudo ebtables -D INPUT 1

если цепочек несколько то их можно перечислять: 1:2

изменения вступают в силу мгоновенно

Может понадобиться ограничить доступ к текущей системе только по MAC-адресу, и не важно что какой IP адрес у разрешенной, если MAC адрес не соответствует разрешенному:

пакеты идут с разрешенной системы

ekzorchik@srv-mon:~$ sudo ebtables -A INPUT -s 00:E0:4C:8D:7F:E9 -j ACCEPT

пакеты идут на разрешенную систему

ekzorchik@srv-mon:~$ sudo ebtables -A OUTPUT -d 00:E0:4C:8D:7F:E9 -j ACCEPT

блокируем доступ к системе для всех кроме указанной системы выше:

ekzorchik@srv-mon:~$ sudo ebtables -P INPUT DROP

теперь если с другой системе попробовать пропинговать систему srv-mon то это станет не возможным:

[root@srv-phone ~]# ping 10.7.8.154

PING 10.7.8.154 (10.7.8.154) 56(84) bytes of data.

^C

— 10.7.8.154 ping statistics —

3 packets transmitted, 0 received, 100% packet loss, time 2213ms

Отлично.

Чтобы заблокировать все broadcast и multicast:

ekzorchik@srv-mon:~$ sudo ebtables -I FORWARD -d Multicast -j DROP

Но вот как быть ведь в случае перезагрузки системы настроенные правила ebtables потеряются, поэтому нужно рассмотреть, как их подгружать в систему на стадии инициализиации сетевой подсистеме, вот собственно и чему будет посвящены нижеследующие шаги:

К примеру настройка правил такая:

ekzorchik@srv-mon:~$ sudo ebtables -P FORWARD DROP

ekzorchik@srv-mon:~$ sudo ebtables -I FORWARD -d Multicast -j DROP

ekzorchik@srv-mon:~$ sudo ebtables -L

Bridge table: filter

Bridge chain: INPUT, entries: 0, policy: ACCEPT

Bridge chain: FORWARD, entries: 0, policy: DROP

Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

Сохраняем таблицы брандмауера канального уровня в файлы:

На заметку: таблицы имеют названия: filter, nat and broute

filter

    1. INPUT
    2. FORWARD
    3. OUTPUT
  1. broute
    1. BROUTING
    2. OUTPUT

ekzorchik@srv-mon:~$ sudo ebtables -t filter --atomic-file /etc/ebtables.forward.conf –atomic-save

Полученный файл – это бинарник и посмотреть его через текстовый редактор не удасться (возможно если использовать шестнадцатеричный)

ekzorchik@srv-mon:~$ sudo file /etc/ebtables.forward.conf

/etc/ebtables.forward.conf: data

После добавляем в файл /etc/rc.local до строки exit 0 следующую строку:

ekzorchik@srv-mon:~$ sudo nano /etc/rc.local

ebtables -t filter --atomic-file /etc/ebtables.forward.conf --atomic-commit

exit 0

Не забываем сохранить внесенные изменения. Теперь когда система будет перезагружена, первым делом подгрузятся настройки правил ebtables а уже потом если используется правила iptables, проверяем:

ekzorchik@srv-mon:~$ sudo reboot

заметил, что система загружается не прям-таки и сразу как до использования bridge – возможно это так и должно быть.

И после загрузки проверив текущие правила ebtables обнаружил, что да они подгрузились из сохраненного файла. Работает.

Чтобы подсчитать трафик через ebtables:

ekzorchik@srv-mon:~$ sudo ebtables -L --Lc

Bridge table: filter

Bridge chain: INPUT, entries: 0, policy: ACCEPT

Bridge chain: FORWARD, entries: 0, policy: DROP

Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

Почему значение 0 – просто сейчас система не используется.

Рассмотрю еще такой пример, разрешаем доступ к системе если отрабатываются два условия: IP = MAC, в примере выше я показывал если исполняется только одно условием c MAC'ом:

ekzorchik@srv-mon:~$ sudo ebtables -A INPUT -p IPv4 --ip-src 10.7.8.227 -s '!' 00:E0:4C:8D:7F:E9 -j DROP

[sudo] password for ekzorchik:

ekzorchik@srv-mon:~$ sudo ebtables -t filter --atomic-file /etc/ebtables.forward.conf –atomic-save

Видите, как все просто да и главное это уже более низкий уровень управления системой. Таким образом использование утилит ebtables & iptables на системе Ubuntu образует связку обеспечения защиты сети на  2 и 3 уровнях модели OSI. На этом я пока завершу свое освещение возможностей bridga и ebtables. До встречи, с уважением автор блога – ekzorchik.

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *

пятнадцать + 5 =