Информационные технологииStfw.Ru 🔍

Настройка универсального сервера для локальной сети.

В этой статье я расскажу, как настроить операционную систему FreeBSD в качестве шлюза Render
🕛 30.09.2005, 01:52
В этой статье я расскажу, как настроить операционную систему 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 и прописать маршрутизацию не так сложно, а вот настроить грамотно биллинг... и чтобы деньги правильно считал - это совсем не так просто, как кажется... Соберешь сервер - будешь молотком... :) Удачи.. А я пошел спать.

Про биллинг -по материалам сайта stg.dp.ua
Render [1:40 20.07.2005]

Разное в ИТ   Теги:

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉