управляемый ethernet bridge со встроенным прозрачным файрволлом всего за $49,99 - реально?
Рано или поздно перед администраторами сетей встает задача фильтрации трафика. Классически, для данных задач применяется связка маршрутизатор+файрволл, построенная на базе какой-нибудь устаревшей машины под управлением Linux.
Еще одно возможное решение — управляемые коммутаторы или мосты. Однако ему присущи серьезные недостатки. Первый — цена, которая, если речь идет об устройствах с более-менее серьезным функционалом, редко опускается ниже $200-300. И несмотря на дороговизну такие устройства обычно обладают совсем скромными возможностями. Цены же на что-то приличное зашкаливают уже за тысячи долларов.
Тем не менее, решение проблемы на канальном уровне имеет и очень серьезные плюсы. Самый главный — прозрачность. Если при установке в разрез сети маршрутизатора вам придется перенастроить компьютеры пользователей, то при использовании управляемого коммутатора/моста никто ничего и не заметит, так как с точки зрения сетевых интерфейсов он будет представлять собой простой кусок кабеля. Возможно ли совместить достоинства обоих методов, отбросив их основные минусы?! Благодаря проекту с неприлично звучащим по-русски названием EBTables это стало реальностью!
Итак, что же представляют собой эти самые (censored) tables? Ebtables — это Linux-проект, реализующий мощный файрволл для моста, который в свою очередь работает под управлением Linux. Он также позволяет создавать так называемые броутеры (от слов bridge и router) и делать много других интересных вещей.
Вот список его возможностей:
— фильтрация на уровне протокола Ethernet;
— фильтрация MAC-адресов;
— простая фильтрация по заголовкам IP;
— фильтрация по заголовкам ARP;
— фильтрация VLAN 802.1Q;
— фильтрация входящего и исходящего интерфейсов (логических и физических устройств);
— трансляция MAC-адресов (NAT);
— ведение логов;
— счетчики кадров;
— возможность добавлять, удалять, вставлять правила, сбрасывать цепочки, обнулять счетчики;
— возможность создавать brouter;
— возможность автоматической загрузки таблицы с созданными правилами в ядро;
— поддержка определяемых пользователем цепочек;
— поддержка маркировки кадров и соответствия маркированным кадрам.
Впечатляет, не так ли? Но не будем торопиться и для начала рассмотрим саму основу нашего моста на примере конкретной задачи.
В моей сети требовалось управлять трафиком между сетью и некоторым черным ящиком, доступа к настройкам которого не было. В роли черного ящика выступал ADSL-модем/маршрутизатор. По договоренности с провайдером, всю настройку модема осуществлял он, не давая никому администраторского пароля. Стало ясно, что между модемом и сетью необходимо внедрить еще один черный ящик, который бы по команде свыше откусывал ненужные пакеты. Область применения планировалась широкая, но для начала надо было отгородить «левые» машины от доступа к Интернету.
мост
Рассмотрим решение проблемы. В ядре ОС Linux, начиная с уже довольно старых версий, существует возможность объединения нескольких сетевых интерфейсов в мост. То есть, по сути, данная ОС позволяет превратить обычный компьютер с несколькими сетевыми платами в аналог аппаратного моста. Насколько мне известно, поддержка мостов включена в ядрах 2.4 и 2.6.
Предположим, что у нас уже установлено необходимое ядро. Для создания моста нам потребуется утилита brctl. Если ее нет, установим пакет «bridgeutils».
Приступим. Чтобы проверить, встроена ли в данную систему поддержка мостов, наберите brctl. Если все в порядке, то на экран выведется что-то вроде:
# brctl
# commands:
addbr <bridge> add bridge
delbr <bridge> delete bridge
addif <bridge> <device> add interface to bridge
delif <bridge> <device> delete interface from bridge
setageing <bridge> <time> set ageing time
setbridgeprio <bridge> <prio> set bridge priority
setfd <bridge> <time> set bridge forward delay
sethello <bridge> <time> set hello time
setmaxage <bridge> <time> set max message age
setpathcost <bridge> <port> <cost> set path cost
setportprio <bridge> <port> <prio> set port priority
show show a list of bridges
showmacs <bridge>show a list of mac addrs
showstp <bridge> show bridge stp info
stp <bridge> <state> turn stp on/off
Для начала нам необходимо с помощью ifconfig убедиться в том, что сетевые интерфейсы, с которыми мы собираемся проводить опыты, находятся в состоянии DOWN.
Создаем новый мост (забыл сказать - система позволяет создать несколько мостов):
# brtcl addbr “ass-nibbler”
Теперь добавляем в него сетевые интерфейсы:
# brctl addif eth0
# brc
Проверим, все ли добавилось:
# brctl show
bridge name bridge id STP enabled interfaces
ass-nibbler 8000.00004c9f0bd2 no eth0 eth1
Мост должен заработать через небольшой промежуток времени, в течение которого он изучит проходящий трафик. Чтобы посмотреть запомненные мостом MAC-адреса, введите команду brctl showmacs. Если же на вид все сделано правильно, но ничего не работает, одна из проблем может заключаться в аппаратных конфликтах, попробуйте просто переставить сетевые платы в другие слоты.
Мосту можно назначить IP-адрес, то есть сделать его одним большим интерфейсом:
# ifconfig ass-nibbler 169.254.100.50 up
Более полную информацию о возможностях и настройке мостов можно получить по адресу http://linux-net.osdl.org/index.php/Bridge#Manual_Configuration.
Ну вот, с построением моста разобрались. В моем случае машины на базе Pentium 200 MMX хватало, чтобы обеспечить «wire speed» для двух 10- мегабитных Ethernet интерфейсов. Подозреваю, что ее хватило бы и на большее, но проверять не было необходимости, так как Интернет приходит в сеть еще медленнее.
файрволл
Теперь приступим к решению второй части задачи, а именно - к фильтрации проходящего через мост трафика.
Как уже говорилось выше, специально для этих целей существует проект EBTables, который позволяет осуществлять прозрачную фильтрацию трафика, проходящего через мост.
Для начала необходимо убедиться, что ebtables поддерживаются нашим ядром. Как правило, ядра версии 2.4 не имели включенной по умолчанию поддержки. Для них придется качать патч, после чего конфигурировать поддержку фильтра и компилировать. В ядрах 2.6 с этим уже повеселее. О поддержке EBTables разными версиями ядер можно почитать по адресу: http://ebtables.sourceforge.net/download.html#latest. Кроме того, необходимо установить пакет утилит, реализующих взаимодействие с пользователем.
После того, как все приготовления завершены, можно попробовать задать какое-нибудь простое правило фильтрации. Например, забанить свой компьютер по MAC-адресу :)
# ebtables -A FORWARD -s 00:11:22:33:44:55 -j DROP
Этой командой мы добавили в цепочку FORWARD следующее правило: если MAC-адрес источника равен 00:11:22:33:44:55, то пакет необходимо отбросить. Упсс, трафик-то затих!
Список правил можно посмотреть с помощью команды ebtables –L. Удалить правило можно командой «ebtables –D<имя цепочки>N», где N — номер правила. Например:
# ebtables –D FORWARD 1
Цепочки также имеют политики по умолчанию. Вот, например, наша цепочка FORWARD по умолчанию имеет политику ACCEPT, то есть все кадры, которые не подпадают под какие-то правила, пойдут спокойно туда, куда и следовали. Усложним задачу. Допустим, мы хотим разрешить доступ только с конкретной машины: установим политику по умолчанию для FORWARD на выброс пакетов:
# ebtables –P FORWARD DROP
Теперь разрешим пакеты, которые идут от нас:
# ebtables -A FORWARD -s 00:11:22:33:44:55 -j ACCEPT
Не забудем и про то, что нам нужно еще и получать пакеты:
# ebtables -A FORWARD -d 00:11:22:33:44:55 -j ACCEPT
/* Не правда ли, все это очень похоже на старый добрый iptables? Так что освоить эту премудрость любителям линуксовых файрволлов труда не составит. – прим. ред. */
EBTables не ограничивается канальным уровнем. Он может также дотянуться своими длинными руками практически до всего, что идет через мост. Вышеприведенные примеры — малая крупица от большого пирога возможностей, которые предоставляет проект. Чтобы расписать их все, пожалуй, не хватило бы целого номера журнала «СР». Так что за дальнейшими способами использования придется отсылать читателей на сайт разработчика - http://ebtables.sourceforge.net/.
Ну и на закуску, стоит напомнить, что для управления компьютером не обязательно нужны клавиатура и монитор. Поставьте SSH daemon, и вы получите мост с управлением по SSH.
заключение
Напоследок приведем описание конфигурации, под впечатлением от настройки которой и была написана статья. Есть собственно сеть, и есть два ADSL- модема/маршрутизатора. Сам мост представляет собой машину следующей конфигурации: Intel Pentium 200 mmx, 32 Mb RAM, 2 * Realtek 8029 + 3com905B-TX.
Одна сетевая плата смотрит в сеть, к двум другим подключены модемы. Все это работает под управлением Debian Linux с ядром версии 2.6. Суммарная стоимость комплектующих не превысила $50. На стабильность системы никаких нареканий не возникло.
Дмитрий Герусс.
Еще одно возможное решение — управляемые коммутаторы или мосты. Однако ему присущи серьезные недостатки. Первый — цена, которая, если речь идет об устройствах с более-менее серьезным функционалом, редко опускается ниже $200-300. И несмотря на дороговизну такие устройства обычно обладают совсем скромными возможностями. Цены же на что-то приличное зашкаливают уже за тысячи долларов.
Тем не менее, решение проблемы на канальном уровне имеет и очень серьезные плюсы. Самый главный — прозрачность. Если при установке в разрез сети маршрутизатора вам придется перенастроить компьютеры пользователей, то при использовании управляемого коммутатора/моста никто ничего и не заметит, так как с точки зрения сетевых интерфейсов он будет представлять собой простой кусок кабеля. Возможно ли совместить достоинства обоих методов, отбросив их основные минусы?! Благодаря проекту с неприлично звучащим по-русски названием EBTables это стало реальностью!
Итак, что же представляют собой эти самые (censored) tables? Ebtables — это Linux-проект, реализующий мощный файрволл для моста, который в свою очередь работает под управлением Linux. Он также позволяет создавать так называемые броутеры (от слов bridge и router) и делать много других интересных вещей.
Вот список его возможностей:
— фильтрация на уровне протокола Ethernet;
— фильтрация MAC-адресов;
— простая фильтрация по заголовкам IP;
— фильтрация по заголовкам ARP;
— фильтрация VLAN 802.1Q;
— фильтрация входящего и исходящего интерфейсов (логических и физических устройств);
— трансляция MAC-адресов (NAT);
— ведение логов;
— счетчики кадров;
— возможность добавлять, удалять, вставлять правила, сбрасывать цепочки, обнулять счетчики;
— возможность создавать brouter;
— возможность автоматической загрузки таблицы с созданными правилами в ядро;
— поддержка определяемых пользователем цепочек;
— поддержка маркировки кадров и соответствия маркированным кадрам.
Впечатляет, не так ли? Но не будем торопиться и для начала рассмотрим саму основу нашего моста на примере конкретной задачи.
В моей сети требовалось управлять трафиком между сетью и некоторым черным ящиком, доступа к настройкам которого не было. В роли черного ящика выступал ADSL-модем/маршрутизатор. По договоренности с провайдером, всю настройку модема осуществлял он, не давая никому администраторского пароля. Стало ясно, что между модемом и сетью необходимо внедрить еще один черный ящик, который бы по команде свыше откусывал ненужные пакеты. Область применения планировалась широкая, но для начала надо было отгородить «левые» машины от доступа к Интернету.
мост
Рассмотрим решение проблемы. В ядре ОС Linux, начиная с уже довольно старых версий, существует возможность объединения нескольких сетевых интерфейсов в мост. То есть, по сути, данная ОС позволяет превратить обычный компьютер с несколькими сетевыми платами в аналог аппаратного моста. Насколько мне известно, поддержка мостов включена в ядрах 2.4 и 2.6.
Предположим, что у нас уже установлено необходимое ядро. Для создания моста нам потребуется утилита brctl. Если ее нет, установим пакет «bridgeutils».
Приступим. Чтобы проверить, встроена ли в данную систему поддержка мостов, наберите brctl. Если все в порядке, то на экран выведется что-то вроде:
# brctl
# commands:
addbr <bridge> add bridge
delbr <bridge> delete bridge
addif <bridge> <device> add interface to bridge
delif <bridge> <device> delete interface from bridge
setageing <bridge> <time> set ageing time
setbridgeprio <bridge> <prio> set bridge priority
setfd <bridge> <time> set bridge forward delay
sethello <bridge> <time> set hello time
setmaxage <bridge> <time> set max message age
setpathcost <bridge> <port> <cost> set path cost
setportprio <bridge> <port> <prio> set port priority
show show a list of bridges
showmacs <bridge>show a list of mac addrs
showstp <bridge> show bridge stp info
stp <bridge> <state> turn stp on/off
Для начала нам необходимо с помощью ifconfig убедиться в том, что сетевые интерфейсы, с которыми мы собираемся проводить опыты, находятся в состоянии DOWN.
Создаем новый мост (забыл сказать - система позволяет создать несколько мостов):
# brtcl addbr “ass-nibbler”
Теперь добавляем в него сетевые интерфейсы:
# brctl addif eth0
# brc
Проверим, все ли добавилось:
# brctl show
bridge name bridge id STP enabled interfaces
ass-nibbler 8000.00004c9f0bd2 no eth0 eth1
Мост должен заработать через небольшой промежуток времени, в течение которого он изучит проходящий трафик. Чтобы посмотреть запомненные мостом MAC-адреса, введите команду brctl showmacs. Если же на вид все сделано правильно, но ничего не работает, одна из проблем может заключаться в аппаратных конфликтах, попробуйте просто переставить сетевые платы в другие слоты.
Мосту можно назначить IP-адрес, то есть сделать его одним большим интерфейсом:
# ifconfig ass-nibbler 169.254.100.50 up
Более полную информацию о возможностях и настройке мостов можно получить по адресу http://linux-net.osdl.org/index.php/Bridge#Manual_Configuration.
Ну вот, с построением моста разобрались. В моем случае машины на базе Pentium 200 MMX хватало, чтобы обеспечить «wire speed» для двух 10- мегабитных Ethernet интерфейсов. Подозреваю, что ее хватило бы и на большее, но проверять не было необходимости, так как Интернет приходит в сеть еще медленнее.
файрволл
Теперь приступим к решению второй части задачи, а именно - к фильтрации проходящего через мост трафика.
Как уже говорилось выше, специально для этих целей существует проект EBTables, который позволяет осуществлять прозрачную фильтрацию трафика, проходящего через мост.
Для начала необходимо убедиться, что ebtables поддерживаются нашим ядром. Как правило, ядра версии 2.4 не имели включенной по умолчанию поддержки. Для них придется качать патч, после чего конфигурировать поддержку фильтра и компилировать. В ядрах 2.6 с этим уже повеселее. О поддержке EBTables разными версиями ядер можно почитать по адресу: http://ebtables.sourceforge.net/download.html#latest. Кроме того, необходимо установить пакет утилит, реализующих взаимодействие с пользователем.
После того, как все приготовления завершены, можно попробовать задать какое-нибудь простое правило фильтрации. Например, забанить свой компьютер по MAC-адресу :)
# ebtables -A FORWARD -s 00:11:22:33:44:55 -j DROP
Этой командой мы добавили в цепочку FORWARD следующее правило: если MAC-адрес источника равен 00:11:22:33:44:55, то пакет необходимо отбросить. Упсс, трафик-то затих!
Список правил можно посмотреть с помощью команды ebtables –L. Удалить правило можно командой «ebtables –D<имя цепочки>N», где N — номер правила. Например:
# ebtables –D FORWARD 1
Цепочки также имеют политики по умолчанию. Вот, например, наша цепочка FORWARD по умолчанию имеет политику ACCEPT, то есть все кадры, которые не подпадают под какие-то правила, пойдут спокойно туда, куда и следовали. Усложним задачу. Допустим, мы хотим разрешить доступ только с конкретной машины: установим политику по умолчанию для FORWARD на выброс пакетов:
# ebtables –P FORWARD DROP
Теперь разрешим пакеты, которые идут от нас:
# ebtables -A FORWARD -s 00:11:22:33:44:55 -j ACCEPT
Не забудем и про то, что нам нужно еще и получать пакеты:
# ebtables -A FORWARD -d 00:11:22:33:44:55 -j ACCEPT
/* Не правда ли, все это очень похоже на старый добрый iptables? Так что освоить эту премудрость любителям линуксовых файрволлов труда не составит. – прим. ред. */
EBTables не ограничивается канальным уровнем. Он может также дотянуться своими длинными руками практически до всего, что идет через мост. Вышеприведенные примеры — малая крупица от большого пирога возможностей, которые предоставляет проект. Чтобы расписать их все, пожалуй, не хватило бы целого номера журнала «СР». Так что за дальнейшими способами использования придется отсылать читателей на сайт разработчика - http://ebtables.sourceforge.net/.
Ну и на закуску, стоит напомнить, что для управления компьютером не обязательно нужны клавиатура и монитор. Поставьте SSH daemon, и вы получите мост с управлением по SSH.
заключение
Напоследок приведем описание конфигурации, под впечатлением от настройки которой и была написана статья. Есть собственно сеть, и есть два ADSL- модема/маршрутизатора. Сам мост представляет собой машину следующей конфигурации: Intel Pentium 200 mmx, 32 Mb RAM, 2 * Realtek 8029 + 3com905B-TX.
Одна сетевая плата смотрит в сеть, к двум другим подключены модемы. Все это работает под управлением Debian Linux с ядром версии 2.6. Суммарная стоимость комплектующих не превысила $50. На стабильность системы никаких нареканий не возникло.
Дмитрий Герусс.
Сетевые решения. Статья была опубликована в номере 02 за 2006 год в рубрике sysadmin