В этой статье я расскажу, как настроить операционную систему FreeBSD в качестве шлюза в Интернет. Настраиваемый сервер расчитан выполнять функции хранилища информации, маршрутизатора, подсчитывать траффик между Интернетом и внутренней сетью. Все на одном железе. Будем поднимать NAT, Samba, FTP, и систему биллинга. Начнем? Для начала настроим корректное отображение кириллицы. Идем в /etc/ttys и редактируем его следующим образом: заменяем cons25 на cons25r. Все, теперь мы не увидим корявых шрифтов и прочих "". Далее для работы нам потребуется Midnight Commander, установим его из портов: #cd /usr/ports/misc/mc #make install НАСТРАИВАЕМ NAT Для решения этой задачи нам понадобится NAT (Network Address Translation). Любой маршрутизатор (в нашем случае - компьютер между интернетом и внутренней сетью) должен обладать этой возможностью. Основная задача маршрутизатора - это передача пакетов в нужном напрвлении. Направление выбирается в зависимости от таблицы маршрутизации. Существует два вида маршрутизации: Статическая и Динамическая. Мы будем использовать статическую маршрутизацию. Настройки маршрутизации и NAT'а в FreeBSD являются стандартными компонентами системы. Те или иные настройки применяются путем внесения изменений в /etc/rc.conf (настройки системы по умолчанию находятся в /etc/defaults/rc.conf). Вот как должен выглядеть ваш файл: # -- sysinstall generated deltas -- # Tue June 26 02:27:31 2005 #Enable network daemons for user convenience. #Please make all changes to this file, not to /etc/defaults/rc.conf. #This file now contains just the overrides from /etc/defaults/rc.conf. font8x14="cp866-8x14" font8x16="cp866b-8x16" font8x8="cp866-8x8" kern_securelevel_enable="NO" keymap="ru.koi8-r" keyrate="fast" mousechar_start="3" nfs_reserved_port_only="YES" saver="daemon" scrnmap="koi8-r2cp866" sendmail_enable="NO" sshd_enable="YES" Теперь установим IP-адреса для обеих сетевых карт. Если у вас сетевые карточки Realtek, то FreeBSD определит эти карточки как Rl0 и Rl1. На одной сетевой карте устанавливаем IP-адрес и маску подсети, выданную провайдером, а на второй карте устанавливаем IP из диапазона, который специально выделен для локальный сетей (192.168.0.1) маска 255.255.255.0 . Не забудьте про шлюз по умолчанию (12.34.45.1). Делается это добавлением в уже известный нам /etc/rc.conf ifconfig_rl0="inet внешний_ип netmask 255.255.255.0" ifconfig_rl1="inet 192.168.0.1 netmask 255.255.255.0" defaultrouter="12.34.45.1" После чего указываем: natd_enable="YES" natd_interface="rl0" natd_flags="-u -s -m" Первая строчка включает NAT, вторая указывает, на каком интерфейсе будет производиться трансляция адресов, и третья - с какими параметрами будет запускаться. Далее нас ждет самое веселое, это пересборка ядра. Эта процедура нужна, чтобы включить поддержку соединенй Divert Sockets. Я не буду рассказывать, что это такое, потому что и сам не знаю :) Этот тип подключений неоходим для natd, но он не поддеживается ядром при стандартой установке системы. Так что заходи в систему под Root'ом и выполняй следующие команды: #cd /usr/src/sys/i386/conf #cp GENERIC MYKERN #echo "options IPDIVERT" >> MYKERN #cd ../../compile/MYKERN #make depend all install #reboot Теперь ядро поддеживает этот тип соединений. Добавь еще несколько строк в /etc/rc.conf вот они: firewall_enable="YES" firewall_type="open" hostname="Имя_вашего_хоста" gateway_enable="YES" Вот и все, маршрутизация включена, осталось только отправить машину в ребут. По идее все должно работать... Для просмотра состояния сети используется команда netstat, а для просмотра состояния сетевых интерфейсов есть команда ifconfig. НАСТРАИВАЕМ SAMBA Самба - это программа для взаимодействия *NIX c Windows-сетью. Т.е., когда в вашей сети все клиенты используют ОС из семейства Windows, они могут получить доступ к серверу (*nix) по протоколу Windows. Чаще всего самба используется для организации на *nix-сервере хранилища информации, с возможностью доступа из Windows-машины. Ставим Самбу из портов: #cd /usr/ports/net/samba #make install clean smb.conf.default - конфигурационный файл, его следует переименовать в smb.conf . Сценарий запуска /usr/local/etc/rc.d/samba.sh.sample так же необходимо переименовать в samba.sh . Вся настройка самба сервера сводится к редактированию smb.conf Присваивание рабочей группы: # workgroup=Имя рабочей группы workgroup=MY_WORKGROUP Создание общего ресурса (public) [Public] comment= Общие файлы path= /usr/local/share/samba-public public = yes writeable = yes printable = no write list = @users Для доступа клиенов к "Общим ресурсам" требуется в файле smb.conf прописать IP клиента в строке hosts allow. Запускаем Самбу. #/usr/local/etc/rc.d/samba.sh stop #/usr/local/etc/rc.d/samba.sh start НАСТРАИВАЕМ FTP В качастве FTP-сервера мы будем рассматривать сервер Proftpd. Выполним установку из портов: #cd /usr/ports/ftp/proftpd #make all install #make clean Чтобы демон сервера загружался сразу после старта системы, сделайте следующее: #ftp stream tcp nowait root /usr/local/libexec/proftpd proftpd #ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l #ftp stream tcp6 npwait root /usr/libexec/ftpd ftpd -l Еще можно запустить сервер с помощью специального скрипта: /usr/local/etc/rc.d/proftpd.sh.sample сначало следует его переименовать в proftpd.sh и присвоить права на запуск chmod 755 proftpd.sh Настраиваем сервер Proftpd. Все настройки у этого ftp-сервера должны находиться в файле /usr/local/etc/proftpd.conf Копируем его из файла /usr/local/etc/proftpd.conf.default и редактируем... #cp /usr/local/etc/proftpd.conf.default #/usr/local/etc/proftpd.conf #vi /usr/local/etc/proftpd.conf #Имя сервера ServerName "Corporate FTP Server" #запуск демона (с использованием inetd) ServerType inetd DefaultServer on ServerIdent off RootLogin on Port 21 Unmask 022 User admin Group nogroup МахClients 50 "Подключено максимальное количество пользователей" MaxClientsPerHost 5 "%m клиентов подключено с вашего хоста" MaxLoginAttempts 10 "Убери свой брутфорсер нах :)" # ограничение по трафику в обе стороны (256 кб) TransferRate RETR,STOR,APPE 256 #Ведение логов SyslogLevel notice UseReverseDNS off TransferLog /var/log/proftpd-transfer.log SystemLog /var/log/proftpd-error.log #Можно задать адреса, с которых вход запрещен или разрешен. #UseHostsAllowFile /etc/proftpd.allow #UseHostsDenyFile /etc/proftpd.deny Создание лог-файлов: #cat > /var/log/proftpd-error.log #cat > /var/log/proftpd-tranfer.log #mkdir /var/run/proftpd/ && cat /var/run/proftpd/proftpd.scoreboard После этих незамысловатых действий мы настроили наш FTP-сервер. Теперь он готов к использованию. НАСТРАИВАЕМ БИЛЛИНГ Для подсчета трафика используется специальное програмное обеспечение. Для нашего сервера я выбрал биллинг StarGazer. Почему? Да потому что это бесплатный биллинг, да и к тому же он имеет множество возможностей: 1) контроль над клиентами сети, их добавление, удаление, текущие корректировки 2) авторизация клиента, с последующим разрешением или запретом доступа в Internet 3) подсчет трафика по предварительно заданным направлениям и правилам 4) подсчет израсходованных клиентом средств и автоматическое отключение в случае их полного расходования 5) хранение дополнительной информации о клиенте, такой как домашний адрес, телефон и т.д. 6) автоматический пинг всех клиентов сети и вывод результатов на экран 7) ведение кредитной истории для всех клиентов 8) оперативное предоставление клиенту информации о его траффике и наличии средств 9) формирование подробных отчетов о состоянии клиентов 10) внешние модули Пример настройки биллинга для FreeBSD Дано: Имеется пользовательская сеть, один сегмент, 192.168.10.0/24. Роутер с установленным stargazer-ом. Сервер имеет связь с внешним миром и сервером, на котором находится музыкальный и видео архивы. Серврер имеет три сетевых интерфейса (сетевые карты 3COM): xl0, 192.168.10.0/24, к нему подключены клиенты xl1, 192.168.30.0/24, через него происходит выход во внешний мир. На этом же интерфейсе производится маскарадинг xl2, 192.168.20.0/24, к нему подключен архив с музыкой и фильмами Городские ресурсы состоят из 4-х подсетей: 195.248.160.0/19 212.86.224.0/19 213.227.192.0/18 217.24.160.0/20 Требуется: Необходимо настроить сервер таким образом: Организовать подсчет локального траффика Организовать подсчет городского траффика Организовать подсчет мирового (прочего) траффика Настроить доступ пользователям так, чтобы они, не авторизовавшись, не могли попасть в Интернет, внутренние ресурсы также должны быть недоступны. Пользователи всегда, независимо от того, авторизованы они или нет, могли пинговать сервер (для нужд диагностики) С клиентской машины с адресом 192.168.10.18 настроить доступ по ssh на сервер при отсутствии авторизатции. Это домашняя машина админа и ему бывает нужно что-то сделать на сервере не имея авторизации В офисе расположена машина с адресом 192.168.10.2, настроить для нее доступ по ssh на сервер при отсутствии авторизатции. Доступ конфигуратором сделать возможным только с хостов 192.168.10.2 и 192.168.10.18 Решение: Первое что нужно сделать, это определится с правилами подсчета траффика. Будем считать, что: направлекние №0 - локальный траффик (DIR0) направлекние №1 - городской траффик (DIR1) направлекние №2 - мировой траффик (DIR2) rules Файл /usr/local/stargazer/etc/rules: # Локальные ресурсы ALL 192.168.10.0/24 DIR0 # Трафик на роутер ALL 192.168.20.1 DIR0 ALL 192.168.30.1 DIR0 # Городской траффик ALL 195.248.160.0/19 DIR1 ALL 212.86.224.0/19 DIR1 ALL 213.227.192.0/18 DIR1 ALL 217.24.160.0/20 DIR1 # Пинг ICMP 0.0.0.0/0 NULL # Мир ALL 0.0.0.0/0 DIR2 Настройка фаервола Будем использовать стандартный пакетный фильтр для FreeBSD ipfw. Назовем этот файл ipfw.sh, сделаем его исполняемым и разместим в директории /usr/local/etc/rc.d # Определим основные переменные # int_if, serv_if, ext_if – названия интерфейсов, к которым # подключены соответствующие сети – пользовательская, серверная, внешняя. #!/bin/sh fwcmd="/sbin/ipfw" natdcmd="/sbin/natd" int_if="xl0" serv_if="xl1" ext_if="xl2" Сбрасываем правила ipfw ${fwcmd} -f flush # Задаем маскарадинг пакетов из пользовательской сети во внешнюю сеть # опции маскарадинга # -s для правильной работы таких протоколов как FTP, IRC, DCC # -m пытаться использовать те же номера портов, которые имеют # исходящие пакеты. (короче нужно для правильной работы таких протоколов как RPC) # -u использовать маскарадинг только для немаршрутизируемых # адресов (192.168.0.0/16 172.16.0.0/12 10.0.0.0/8) # -a использовать данные IP-адрес для макарадинга пакетов. ${natdcmd} -s -m -u -a 192.168.30.1 # Разрешаем ходить ICMP пакетам ${fwcmd} add 10 allow icmp from any to any # Следующие правила будут блокировать любой исходящий # траффик из внутренних сетей во внешние с адресами получателя # из немаршрутизируемого диапазона (как правило, это траффик # генерирующийся вирусами, выпускать который наружу не # рекомендуется, чтобы не загружать внешний канал). ${fwcmd} add 304 deny ip from any to 192.168.0.0/16 out via ${ext_if} ${fwcmd} add 305 deny ip from any to 10.0.0.0/16 out via ${ext_if} ${fwcmd} add 306 deny ip from any to 172.16.0.0/12 out via ${ext_if} # Следующие правила можно использовать для блокирования # использования различных прокси-серверов в городском # сегменте сети ${fwcmd} add 307 deny log tcp from any to proxy.alkar.net 8080 via ${int_if} # и т.д # Следующие правила разрешают конектиться клиентам к серверу # stargazer на порт 8888, на котором он слушает клиентские соединения ${fwcmd} add 308 allow udp from any to 192.168.10.1 8888 via ${int_if} ${fwcmd} add 309 allow udp from 192.168.10.1 to any via ${int_if} # Следующие правила разрешают машинам с адресами 192.168.10.2 и # 192.168.10.18 подключаться к роутеру по протоколу ssh без # подключения клиентской программы. ${fwcmd} add 310 allow tcp from 192.168.10.2 to 192.168.10.1 22 via ${int_if} ${fwcmd} add 311 allow tcp from 192.168.10.18 to 192.168.10.1 22 via ${int_if} ${fwcmd} add 312 allow tcp from 192.168.10.1 to any via ${int_if} # Блокируем все остальные клиентские запросы к роутеру ${fwcmd} add 320 deny log ip from 192.168.10.0/24 to 192.168.10.1 via ${int_if} ${fwcmd} add 321 deny log ip from 192.168.10.0/24 to 192.168.20.1 via ${int_if} ${fwcmd} add 322 deny log ip from 192.168.10.0/24 to 192.168.30.1 via ${int_if} # Здесь оставляем окно в нумерации для исполнения скриптов юзеров # Следующее правило определяет, что все пакеты, проходящие через # внешний сетевой интерфейс, направленный во внешнюю сеть, будут # попадать в правило маскарадинга, описанное выше. ${fwcmd} add 50024 divert natd all from any to any via ${ext_if} # Следующие правила разрешают роутеру соединяться с использованием # протокола tcp с внешними сетями. ${fwcmd} add 50029 allow tcp from any to any out via ${ext_if} setup ${fwcmd} add 50030 allow tcp from any to any via ${ext_if} established # Следующие правила разрешают роутеру соединяться с использованием # протокола udp с внешними сетями, а также разрешают прохождение # ДНС траффика через роутер ${fwcmd} add 50031 allow udp from any to any out via ${ext_if} ${fwcmd} add 50032 allow udp from any 53 to any in via ${ext_if} # Следующее правило разрешает конектиться к роутеру по протоколу # ssh из внешней сети ${fwcmd} add 50033 allow tcp from any to 192.168.30.1 22 via ${ext_if} # Далее идет запрещающее правило для всего остального # траффика (т.е. схема файрвола – все что не разрешено # явно – то запрещено) $fwcmd add 65534 deny log ip from any to any После того, как ipfw настроен, необходимо настроить скрипты OnConnect и OnDisconnect. Для этого мы в нумерации правил ipfw оставили диапазон номеров, которые будут использовать скрипты OnConnect и OnDisconnect, это будут номера начиная с 310 по 50000. OnConnect fwcmd="/sbin/ipfw" int_if="xl0" ip=$2 login=$1 id=$4 # id - уникальный целочисленный идентификатор пользователя # принимает значений от 0 до максимального кол-ва пользователей ${fwcmd} add `expr $id '*' 10 + 29000` fwd 127.0.0.1,3128 tcp from $ip to any 80 via ${int_if} ${fwcmd} add `expr $id '*' 10 + 29001` allow ip from $ip to any via ${int_if} echo "connect $login " >> /usr/local/stargazer/var/log/connect.log OnDisconnect fwcmd="/sbin/ipfw" id=$4 ${fwcmd} delete `expr $id '*' 20 + 29000` ${fwcmd} delete `expr $id '*' 20 + 29001` echo "disconnect $1" >> /usr/local/stargazer/var/log/connect.log OnDisconnect fwcmd="/sbin/ipfw" id=$4 ${fwcmd} delete `expr $id '*' 20 + 29000` ${fwcmd} delete `expr $id '*' 20 + 29001` echo "disconnect $1" >> /usr/local/stargazer/var/log/connect.log Теперь настраиваем конфигурацию Stargazer. stargazer.conf # Имя файла, в котором определяются правила подсчета трафика rules=/usr/local/stargazer/etc/rules # Рабочая директория сервера, тут содержатся данный о тарифах, юзерах и админах WorkDir=/usr/local/stargazer/var # Имя лог-файла, куда пушутся события LogFile=/usr/local/stargazer/var/log/stargazer.log # Если юзер в течение UserTimeout секунд не подает признаков жизни, # сервер отключит его (естественно, если клиент был подключен до этого) UserTimeout=120 # Время, через которое сервер повторяет проверку того, жив ли клиент. Также это время, # через которое у клиента обновляется его статитстика. UserDelay должно быть в # 3...10 раз меньше чем UserTimeout UserDelay=15 # Эта опция действительна только для сервера, работающего со вторым типом тарифных планов # Она определяет, что будет передаватся программе InetAccess от сервера # FreeMb = 0 - кол-во бесплатных мегабайт в пресчете на цену нулевого направления # FreeMb = 1 - кол-во бесплатных мегабайт в пресчете на цену первого направления # FreeMb = 2 - кол-во бесплатных мегабайт в пресчете на цену второго направления # .................... # FreeMb = 9 - кол-во бесплатных мегабайт в пресчете на цену девятого направления # FreeMb = cash - кол-во денег, на которые юзер может бесплатно качать # FreeMb = none - ничего не передавать FreeMb=2 # Время через которое пишется детальная статистика # возможные значения 3, 2, 1, 1/2, 1/4, 1/6 # 3 - раз в три часа, 1 - раз в чаc, 1/2 - раз в пол часа, 1/6 - раз в 10 мин StatTime=1/6 # Номер порта, по которому сервер слушает обращения конфигуратора adminPort=8888 # Номер порта, по которому сервер ожидает обращения авторизатора userPort=8888 # Максимальное кол-во юзеров. Эта величина влияет на кол-во # памяти необходимой серверу MaxUsers=1000 # for FreeBSD only # Имя интерфейсов, на которых нужно вести подсчет трафика iface=xl0,xl1,xl2 # Имена направлений. Пустые имена не будут отображаться # ни в авторизаторе, ни в конфигураторе DirName0=Local Network DirName1=City Network DirName2=World Network DirName3= DirName4= DirName5= DirName6= DirName7= DirName8= DirName9= # Опция, определяющая, менять ли местами upload и download TurnTraff=no #Опция, определяющая, обнулять трафик в конце месяца или нет ResetTraff=yes # "Разамазанное" снятие абонплаты. Каждый день # 1/30 (1/31, 12/28) часть абонплаты SpreadFee=no # День снятия абонплаты DayFee=1 # День, в который происходит обнуление счетчиков трафика, и # перехода на новый тариф DayResetTraff=1 # Владелец, группа и права доступа на файлы # статистики у пользователей StatOwner=root StatGroup=stg_stat StatMode=644 # Владелец, группа и права доступа на файлы # конфигурации у пользователей ConfOwner=root ConfGroup=root ConfMode=600 # Владелец, группа и права доступа на логи # у пользователей UserLogOwner=root UserLogGroup=root UserLogMode=644 # Разрешение на доступ конфигуратором AdminOrder=allow,deny AdminAllowFrom=192.168.10.2 192.168.10.18 AdminDenyFrom=all # Разрешение на доступ авторизатором UserOrder=allow,deny UserAllowFrom=192.168.10.0/24 UserDenyFrom=all # Запрет на слишком частые обращения на порт авторизатора FloodControl=yes Теперь помещаем в каталог /usr/local/etc/rc.d стартовый скрипт старгейзера stargazer.sh . Содержание скрипта stargazer.sh #!/bin/sh /usr/local/stargazer/bin/stargazer /usr/local/stargazer/etc/ В данном примере, настроечные файлы и БД сервера расположены, не в /etc /var а в /usr/local/stargazer/etc /usr/local/stargazer/var Если у тебя хватило терпения прочитать эту статью до конца, то ты, наверное, понял, как собрать своими руками уневерсальный сервер для локальной сети. Настроить NAT в *NIX и прописать маршрутизацию не так сложно, а вот настроить грамотно биллинг... и чтобы деньги правильно считал - это совсем не так просто, как кажется... Соберешь сервер - будешь молотком... :) Удачи.. А я пошел спать.
|