ipfw + natd + tun0 - пример настройки маршрутизатора для локальной сети
Для некоторых кто использовал штатный фаерволл ipfw в операционной системе FreeBSD на маршрутизаторе с минимум двумя ethernet интерфейсами, один из которых являлся внешним, то есть “смотрел” в Интернет, а другой в локальную сеть, возможно, покажется странным, почему та же конфигурация не работает на машине, у которой шлюзовым является динамический интерфейс, например, tun0 или ppp0 (в зависимости от того, что используется, ppp или pppd). На самом деле сложного нет ничего. Но начнем по-порядку, с самого начала.
Итак, дано:
- Маршрутизатор под OS FreeBSD 6.2
- Локальная сеть 192.168.0.0/24.
- Подключение к провайдеру услуг сети Интернет посредством PPPoE на DSL линии.
Требуется:
- Защитить маршрутизатор и локальную сеть фаерволлом.
- Оставить доступ к маршрутизатору, например, по протоколам SSH и FTP только с определенных адресов.
- Дать возможность компьютерам локальной сети выйти во внешний мир.
- Пробросить порт на NAT’е, чтобы из внешнего мира можно было подключиться удаленным рабочим столом Windows (RDP) к машине 192.168.0.100 в локальной сети.
Подразумевается, что уже у Вас имеется рабочая серверная машина, под управлением FreeBSD, с настроенным PPPoE соединением и локальной сетью. Также, подразумевается, что Вы уже умеете пересобрать ядро системы, знаете как минимум основные приемы работы в *nix консоли, а также осознаете всю ответственность за совершаемые действия.
Каким образом будет построена локальная сеть, не имеет значения. Главное, чтобы компьютеры локальной сети имели доступ к тому компьютеру, которому в будущем будет отведена почетная роль маршрутизатора.
Реализация:
Для начала следует пересобрать ядро операционной системы для поддержки ipfw. В принципе, можно подгрузить соответствующий модуль ядра командой (из-под root’а):
root@router# kldload ipfw
Но в данном случае учтите, что после ее выполнения машина останется без связи и обрубит все существующие соединения, поскольку ipfw по-умолчанию “запрещает все”. Следовательно, не стоит выполнять эту команду, если Вы не имеете физического доступа к машине и управляете ею по ssh. Для статической поддержки ядром ipfw, добавим в конфигурационный файл ядра такие строки:
Эта часть публикации доступна только зарегистрированным посетителям!
Пожалуйста, войдите [Login] или зарегистрируйтесь [Register].
Далее, переходим в каталог /usr/src и пересобираем ядро.
Эта часть публикации доступна только зарегистрированным посетителям!
Пожалуйста, войдите [Login] или зарегистрируйтесь [Register].
- где KERNELNAME - имя файла конфигурации ядра в каталоге /usr/src/sys/i386/conf (для платформы x86). После пересборки ядра, не спешите перезагружать систему, иначе, если Вы управляете машиной удаленно, то сразу же потеряете к ней доступ, поскольку после загрузки модуля сработает дефолтовое правило ipfw, запрещающее все соединения. Добавим в файл /etc/rc.conf параметры, необходимые для запуска ppp, ipfw и natd, который будет выполнять у нас функции NAT’а.
Эта часть публикации доступна только зарегистрированным посетителям!
Пожалуйста, войдите [Login] или зарегистрируйтесь [Register].
В вышесказанном, есть упоминание о конфигурационном файле natd. Именно в нем мы и зададим параметры проброса портов на NAT’е во внутреннюю сеть с определенного порта на внешнем интерфейсе, по определенному протоколу на определенный порт и IP адрес локальной сети. В исходных данных требовалось осуществить возможность доступа из внешнего мира на машину 192.168.0.100 в локальной сети посредством удаленного рабочего стола Windows (RDP). В /etc/natd.conf добавим:
Эта часть публикации доступна только зарегистрированным посетителям!
Пожалуйста, войдите [Login] или зарегистрируйтесь [Register].
На данном этапе осталось только создать правила фаерволла и поместить их в /etc/my_firewall Ниже приводится рабочий пример конфигурации ipfw с комментариями, какое правило для чего служит.
Эта часть публикации доступна только зарегистрированным посетителям!
Пожалуйста, войдите [Login] или зарегистрируйтесь [Register].
Данный пример не претендует на обрацзовый. Тем не менее, работает успешно на одной из моих машин. Честно говоря, здесь показан несколько видоизмененный набор правил. Немного упрощенный, чем он есть на самом деле. Вообще, возможности ipfw настолько широки, что могут удовлетворить практически любые запросы.
Теперь, когда мы прописали все необходимое, можно попробовать перестартовать операционную систему, чтобы загрузить новое ядро, а также заодно проверить работу natd и ipfw.
Перезагрузили? Вошли в систему? Доступ к сети Интернет есть? Поздравляю! Значит все прошло успешно. Далеко не каждому дано с первого раза сделать все как следует. Потому, даже если у Вас что-либо неполучилось, не отчаивайтесь. Просто, попробуйте определить в чем заключается ошибка. Хотя, если Вы все делали, так же как описано в данном материале, ошибки возникнуть не должно.
Для проверки работы фаерволла, попробуйте набрать команду ipfw show. На консоль должны вывалиться все Ваши правила. Для внесения изменений, можно воспользоваться командой “ipfw [-abcdefhnNqStTv] “, либо внести соответствующие изменения в файл с набором правил, и попросту снова его запустить: /etc/my_firewall
Не забудьте, если в конфигурационном файле /etc/ppp/ppp.conf ранее использовалась секция “NAT” с конфигурацией, все эти строки следует закомментировать, а в /etc/rc.conf установить параметр ppp_nat значение “NO” поскольку теперь функции NAT’а выполняет демон natd.
Советы:
- Учтите, что если Вы собираетесь снимать статистику пакетов с правил ipfw, то каждый перезапуск скрипта ./my_firewall приведет к обнулению счетчиков.
- Не убирайте в скрипте фаерволла опцию ipfw “- q”. Иначе, при перезапуске скрипта /etc/my_firewall, ipfw выбросит Вам на консоль весь набор правил. При работе с машиной по ssh это может стать причиной отпадания консоли.
- При перезапуске /etc/my_firewall лучше применять конструкцию nohup /etc/my_firewall. В данном случае, если при применении правил обнаружится какая-либо ошибка в синтаксисе файла, все сообщения об этих ошибках будут выведены в файл nohup.out который будет создан в текущем каталоге.
Удачи!
Похожие публикации
Теги: bsd, divert, FreeBSD, ipfw, ipfw.sh, nat, natd, ppp, rc.conf, rc.firewall, tun, unix, интерфейс, настройка, ограничения доступа, сервер, требуется регистрация, фаерволл, шейп


Для того чтоб соединение не рвалось по SSH:
/etc/rc.d/ipfw forcerestart
Доброго времени суток всем. Прочитал статью и комменты. Вынес много полезного для себя, за что автору ОГРОМНОЕ спасибо! Но у меня возник вопрос, ответа на который я здесь не нашел:
При загрузке внешняя сет.карта получает “серый” адрес по DHCP. Затем ipfw считывает свой скрипт с правилами(он еще не знает о существовании tun0). Затем я вручную устанавливаю сеанс PPTP (появляется tun0 с “белым” адресом, который можно парсить). Подскажите, как можно сделать tun0 ДО того как ipfw начнет читать конфиг? Мозга пока только хватило чтоб написать скрипт, проверяющий каждую минуту наличие соединения с инетом.
И как с этим
${fw} add divert natd all from any to ${outip} in via ${outif}
если и динамический, видел скрипт пару комментариев назад, но как его применить не понял
Можно конечно. Но, когда настраивается ipfw на роутере у которого два внешних интерфейса (аплинки) и три внутренних, смотрящих в три разные локальные сети (для которых раздается доступ к Интернет), такая детализация нужна. Без нее никак.
Тут уточни, плз. Не совсем понял, что имелось в виду.
Daemony Спасибо. Раз уж я начал копатся в ipfw помучаю тебя ещё парой вопросов, если не против:
1. Почему\зачем используется явное указание направления когда можно ограничится парой правил бeз in\out или есть необходимость ограничить локалку только tcp?
…
${fw} add allow all from ${innet} to any out via ${inif}
${fw} add allow all from any to ${innet} in via ${inif}
….
${fw} add allow tcp from ${innet} to any in via ${inif}
${fw} add allow tcp from any to ${innet} out via ${inif}
2. Сакральный смысл разворота правил запрета и детализации направления ? - обычно рекомендуют тупо from{запрещенная сеть} to any?
${fw} add deny log ip from any to 0.0.0.0/8 in via ${outif}
….
PS. прошу прощения за опечатку в прошлый раз.
Вот что-то типа такого:
и пока проблем не было.
Deamony ,а размер журнала из-за правила ${fw} add 65534 deny log all from any to any не становится непомерным и не съедает всё доступное место? установленны ограничения в syslog?
Честно, так до конца не понял что ты имел в виду.
Ну да ладно, раз разобрался, молодец. За тебя рад.
Употребляю я пиво, но, судя по всему, ты в Нижнем Новгороде, а я в Днепропетровске… Потому пиво в ближайшее время попить не получится. Просто вспомни обо мне добрым словом, когда будешь пить с друзями или с коллегами на работе. Мне этого будет достаточно.
СПАСИБО ТЕБЕ, Daemony!!!! В любом случае с меня пиво или то, что ты употребляешь. Только скажи куда выслать!!!!