Данная заметка есть продолжение предыдущей где я рассматривал, как объединять интерфейсы в один образуя программный мост, а также той где упоминал что на основе собранной информации по MAC адресам всех систем в локальной сети буду разграничивать доступ. Существует еще один этап безопасности который можно использовать на благо своей сети – это
объединение коммутатора и брандмауера посредством утилиты ebtables которая также присутствует в репозитариях Ubuntu 12.04.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-адреса, а в iptables — IP-адреса.
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
- INPUT
- FORWARD
- OUTPUT
- broute
- BROUTING
- 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.