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, интерфейс, настройка, ограничения доступа, сервер, требуется регистрация, фаерволл, шейп


Спасибо помогло, но есть новая проблема TCP трафик на клиентах есть, а UDP нет. Т.е проводник работает пинги есть, а в игры играть нельзя.
Если правила:
##### И наконец, пропускаем в Интернет локальную сеть ##### игры не работают
${fw} add allow tcp from ${innet} to any in via ${inif}
${fw} add allow tcp from any to ${innet} out via ${inif}
##### И наконец, пропускаем в Интернет локальную сеть ##### игры тоже не работают
${fw} add allow ip from ${innet} to any in via ${inif}
${fw} add allow ip from any to ${innet} out via ${inif}
заменить на
${fw} add allow ip from ${innet} to any
${fw} add allow ip from any to ${innet}
работают, но наверно это не правильно как сделать правильно?