# Задача: хотим внедрить в своей сети мост (bridge) на Debian,
# выполняющий также задачи межсетевого экрана,
# т.е. получить возможность фильтрации трафика, не сильно меняя топологию
# и совсем не меняя адресацию в сети и шлюз по умолчанию.
# Желательно, чтобы мост-МЭ при этом вообще не имел IP-адресов
# на интерфейсах (обращенном наружу и смотрящему в защищаемую сеть)
# Администрировать его и смотреть на нем логи предлагается локально
# или путем подключения к выделенной сети администрирования
# Ставим его в сети так, чтобы одним интерфейсом моста он был
# подключен к провайдеру или другому уже имеющемуся шлюзу по умолчанию,
# а другой «смотрел» в защищаемую ЛВС, например в порт коммутатора
# Таким образом, приходящий извне трафик прежде чем попасть в защищаемую сеть
# будет всегда проходить через мост на котором мы его будем фильтровать
# с помощью iptables
Схема тестового стенда
# сначала приведем вариант,как НЕ надо,зато попробуем использовать
# командный интерфейс для Network Manager (nmcli) и посмотрим,
# почему всё-таки другой вариант предпочтительнее
# Смотрим, какие есть вообще на МЭ сетевые устройства
nmcli dev show
# Если есть проводные соединения для интерфейсов, например eth1 и eth3
# которые мы будем привязывать к мосту, то удаляем их
sudo nmcli con del "Wired connection 2" sudo nmcli con del "Wired connection 4"
# Добавляем соединение типа bridge
# с именем интерфейса bridge0
# и именем соединения тоже bridge0:
sudo nmcli con add ifname bridge0 type bridge con-name bridge0
# Добавляем подчиненные (slave) соединения для интерфейсов, включаемых в мост
sudo nmcli con add type bridge-slave ifname eth1 master bridge0 sudo nmcli con add type bridge-slave ifname eth3 master bridge0
# Отключаем для моста поддержку spanning tree protocol
sudo nmcli con modify bridge0 bridge.stp no
# Смотрим, как выглядят поля свойств соединения bridge0, связанные с bridge
nmcli -f bridge con show bridge0
# Для проверки результата ещё раз смотрим все соединения
nmcli con show
# Получим что-то типа
# NAME UUID TYPE DEVICE
# bridge0 b38659f3-2863-43ea-a899-ea9c2b393827 bridge bridge0
# bridge-slave-eth1 01ff1133-67a0-497b-a909-56df91c3db1d ethernet eth1
# bridge-slave-eth3 741c03f6-7c73-442a-9c05-60c9372e06cf ethernet eth3
# Wired connection 6 7008b0d6-2589-30a4-99de-420c0879724d ethernet –
# Теперь загружаем модуль ядра br_netfilter
sudo modprobe br_netfilter
# Разрешаем ему фильтровать пакеты
sudo sysctl -w net.bridge.bridge-nf-call-iptables=1
# Стартуем соединение
sudo nmcli con up bridge0
# и тут нас ждёт засада — у моста появляется IP-адрес,
# так как по умолчанию для соединения, создаваемого через nmcli
# метод присвоения адреса ipv4.method – auto, т.е. мост получает адрес по DHCP,
# а нам нужен «невидимый» bridge-firewall
# Если задать для ipv4.method значение manual и не задать значение адреса,
# то nmcli ругается, что адрес не может быть пустым
# Поэтому если для вас факт наличия адреса не страшен,
# то можно оставить адрес, полученный по DHCP
# если хотите задать этот адрес и шлюз по умолчанию статически, то делаем так:
sudo nmcli con mod bridge0 ipv4.method manual sudo nmcli con mod bridge0 ip4 192.168.2.5/24 gw4 192.168.2.6
# впоследствии можно изменить шлюз по умолчанию или сделать его пустым:
# sudo nmcli con mod bridge0 ipv4.gateway 0.0.0.0
# статические маршруты можем прописывать через ip route
sudo ip route add 192.168.110.0/24 dev bridge0
# но тогда вам придется позаботиться о том, чтобы они заново
# прописывались после перезагрузки, или тоже через nmcli,
# как именно, предлагаю разобраться самостоятельно
# проверим, что адрес присвоен правильно и мост работает,
# пропинговав кого-нибудь во внешней сети с компьютера в защищаемой сети
ping 1.1.1.1 # 64 bytes from 1.1.1.1: icmp_seq=1 ttl=128 time=0.441 ms # 64 bytes from 1.1.1.1: icmp_seq=2 ttl=128 time=0.433 ms # ...
# Теперь мы имеем возможность фильтровать трафик с помощью модуля iptables
# physdev, работающего с физическими интерфейсами, входящими в мост.
# Возвращаемся на наш мост и пишем правила фильтрации, например:
sudo iptables -A FORWARD -m physdev --physdev-in eth3 --physdev-out eth1 \ --src 10.10.2.75 --dst 192.168.2.23 --proto tcp --dport 22 -j DROP
# где, —physdev-in eth3 это входной интерфейс eth3 моста,
# на котором у нас провайдер или шлюз по умолчанию
# —src 10.10.2.75 – IP адрес источника
# где, —physdev-out eth1 это интерфейс eth1 моста,
# на котором у нас порт коммутатора, в который в свою очередь
# включен защищаемый сервер SSH
# —dst 192.168.2.23 – IP адрес назначения,
# в данном случае защищаемого сервера SSH
# —proto tcp —dport 22 – протокол tcp, порт назначения 22
# -j DROP – действие, отбрасываем пакет без уведомления отправителя
# А теперь как надо, чтобы получить мост без IP-адреса:
# Удалим мост и slave соединения, созданные через Network Managercode
sudo nmcli con del bridge0 sudo nmcli conn del bridge-slave-eth3 sudo nmcli conn del bridge-slave-eth1
# Останавливаем Network Manager
sudo systemctl stop network-manager
# Как вариант, вообще его отключаем
sudo systemctl mask --now network-manager
# Мост создаем через bridge-utils
sudo brctl addbr br0 sudo brctl addif br0 eth1 sudo brctl addif br0 eth3
# Переводим интерфейсы в promisc mode и делаем их активными
sudo ifconfig eth1 0.0.0.0 promisc up sudo ifconfig eth3 0.0.0.0 promisc up
# Загружаем модуль ядра br_netfilter
sudo modprobe br_netfilter
# Разрешаем ему фильтровать пакеты
sudo sysctl -w net.bridge.bridge-nf-call-iptables=1
# задаем правила для фильтрации с использованием -m physdev:
sudo iptables -A FORWARD -m physdev --physdev-in eth3 --physdev-out \ eth1 --src 10.10.2.75 --dst 192.168.2.23 --proto tcp --dport 22 -j DROP
# PROFIT!!111
# Дополнение:
# Для того, чтобы каждый раз после перезагрузки системы не настраивать интерфейс
# br0, настроим /etc/network/interfaces.
# Пример файла с настройками ниже.
# The loopback network interface
auto lo iface lo inet loopback iface eth1 inet manual iface eth3 inet manual
# Bridge setup
auto br0 iface br0 inet static bridge_ports eth1 eth3 address 0.0.0.0 bridge_stp off
# Обратите внимание, что для br0 задан адрес 0.0.0.0,
# что равносильно отсутствию адреса
# Если этого не сделать,то при попытке поднять интерфейс
sudo ifup br0
# Получим сообщения об ошибке вида
ifup: missing required variable: address ifup: missing required configuration variables for interface br0/inet ifup: failed to bring up br0
0 Комментарии