Вопрос в первую очередь адресован системным администраторам Linux.
Имеется некая плата маршрутизатора на базе процессора PowerPC, которая работает, под управлением операционной системы
OpenWRT (Linux). На этой плате установлено всего два сетевых интерфейса eth0 и eth1, объединённых в сетевой мост.
root@OpenWrt:/# brctl show
bridge name bridge id STP enabled interfaces
br-br0 8000.7e0410820000 no eth0
eth1
Стоит задача сделать фильтрацию пакетов по IP-адрессу (именно только по IP-адрессу!). Чтобы только некоторые компьютеры одной сети видели компьютеры другой. Задача с одной стороны тривиальная (использовать iptables), но на поверку оказалась нетривиальной…
Для проверки корректности настройки, к одному сетевому интерфейсу подключён компьютер с IP-адрессом 192.168.1.10 (положим к eth0), а к другому с адрессом 192.168.1.11 (положим eth1). Для удобства, у самого роутера присвоен айпишник 192.168.1.2.
Итак, в качестве проверки использую ping. Плюс, дополнительно в качестве «фона» использую локальную сеть предприятия, чтобы проверить фильтрацию пакетовПингую оба компьютра (друг-друга), маршрутизатор, с маршрутизатора компьютеры — пинги идут. Смотрим tcpdump на роутере и компьютерах — по сети гуляют пакеты. Теперь давайте закрываться, и тут начинается самое интересное!
root@OpenWrt:/# iptables -F
root@OpenWrt:/# iptables -P INPUT DROP
root@OpenWrt:/# iptables -P OUTPUT DROP
root@OpenWrt:/# iptables -P FORWARD DROP
root@OpenWrt:/#
Казалось бы, после этого в сети должна наступить тишина и никто никого видеть и слышать не должен, кроме компьютера, который находится в одной сети с предприятием. Ан нет! Внимание:
1. Роутер не пингуется и не пингует компьютеры, т.е. правила
INPUT, OUTPUT DROP сработали!
2. Компьютеры видят друг-друга, пингуются и по сети свободно гуляют пакеты. Это видно tcpdump на всех компьютерах, кроме маршрутизатора. Это говорит о том, что правило для сквозного трафика
FORWARD DROP — не работает!
Почему так, я не знаю!
Едем дальше. Существует фаервол, специально для моста, именуемый
ebtables. Основной его недостаток, что он более низкоуровневый, и стоит на канальном уровне. Основная фильтрация идёт по МАС-адресам. Синтаксис работы похож на iptables. Итак попробуем:
root@OpenWrt:/# ebtables -F
root@OpenWrt:/# ebtables -P FORWARD DROP
И всё, передача заткнулась. Можно открывать шапанское, и праздновать победу. Но теперь нам нужно разрешить передачу от компьютера с адрессом 192.168.1.10 к компьютеру 192.168.1.11 и наоборот. При этом не привязываясь к МАС-адресам. Я попробовал сделать вот такое правило:
ebtables -A FORWARD -p ipv4 --ip-dst 192.168.1.11 --ip-source 192.168.1.10 -j ACCEPT
ebtables -A FORWARD -p ipv4 --ip-dst 192.168.1.10 --ip-source 192.168.1.11 -j ACCEPT
Но чуда не произошло… Компьютеры как не слышали, так и не слышат друг-друга. Щипаю на себе волосы, читаю маны, но что и как делать не знаю. Вопрос в общем-то простой, но решение неочевидно.
Теперь вопросы:
1. Почему мне не удалось фильтровать проходящий трафик с помощью iptables?
2. Можно ли настроить фильтрацию пакетов с помощью ebtables по IP-адрессу, без привязки к МАС? Если можно, то как?
3. Есть ли возможность сделать так, чтобы ebtables передавала правила фильтрации трафика iptables?
Меня не сильно бить ногами, я только начинаю сталкиватся с этим. Я не системный администратор, но железка которая делается будет использоваться для маршрутизации и фильтрации, по сему приходится разбираться и курить.