В Установка, настройка небольшого интернет сервера на FreeBSD 9.2

В прошлых статьях я описал по отдельность настройки некоторого софта для конкретных целей. Статьи касались 5 и 6 версии FreeBSD, сейчас уже выпущена 9-я и 10-я версия.  Поэтому я решил собрать всю информацию вместе и систематизировать. ТЗ. Нам нужен сервер, который будет выступать интернет шлюзом.  В сервере 2 сетевых карты, к первой подключен эзернет от модема провайдера, вторая соединена со свичем, к которому подключены пользователи. Сервер будет выдавать динамически ip-адреса, на нем будет установлен фаервол, котрый будет резать ненужный входящий и исходящий трафик по просьбе руководства( world of tanks, countre strike,…).  Весь веб трафик будет завернут на веб-сервер и на основании его логов будет построена статистика кто какие ресурсы посещал. Также сервер будет выполнять несколько несвойственным ему функций, нужных именно мне :-)

1. Установка и обновление системы.

Скачиваем установочный образ FreeBSD-9.2-RC3-i386 с ftp7.ua.freebsd.org, устанавливаем. Описывать установку не буду, т.к. она подробно описана в хенбуке. В приведенных ниже ссылках указаны лишь параметры, которые нужно добавить, все остальное убрано для компактности. Для начала проверяем ДНС сервера, если пусто – вводим:

root@inet:/usr/home/mick # cat /etc/resolv.conf
nameserver 195.64.225.197
nameserver 195.64.225.199

При установке какого-либо софта из портов запросы на дистрибутив идет по умолчанию на freebsd.org, мы же укажем системе пусть сначала ищет на украинских зеркалах, находящихся в сети ua-ix. Ранее когда инет по ua-ix был бесплатен, а за зарубежный трафик платили за мегабайты, эта опция была актуальна, сейчас трафик неограниченный, выиграш разве что в скорости.

root@inet:/usr/home/mick # cat /etc/make.conf
MASTER_SITE_BACKUP?= \
ftp://ftp7.ua.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/ \
ftp://ftp5.ua.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/ \
ftp://ftp3.ua.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/ \
ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/
MASTER_SITE_OVERRIDE?= ${MASTER_SITE_BACKUP}

Теперь сделаем локализацию системы, укажем системе, что язык наш русский и кодировка по умолчанию KOI8-R. Локализацию можно делать на уровне всей системы или только для конкретного юзера. Делаем для всей системы. Устанавливаем переменные окружения LANG и MM_CHARSET в инициализационных файлах оболочки.

root@inet:/usr/home/mick # cat /etc/profile
LANG=ru_RU.KOI8-R; export LANG
MM_CHARSET=KOI8-R; export MM_CHARSET

root@inet:/usr/home/mick # cat /etc//usr/share/skel/dot.profile
LANG=ru_RU.KOI8-R; export LANG
MM_CHARSET=KOI8-R; export MM_CHARSET

Или:

root@inet:/usr/home/mick # cat /etc/csh.login
setenv LANG ru_RU.KOI8-R
setenv MM_CHARSET KOI8-R

root@inet:/usr/home/mick # cat /usr/share/skel/dot.login
setenv LANG ru_RU.KOI8-R
setenv MM_CHARSET KOI8-R

Добавляем в /etc/rc.conf  указываем местоположение кодовой таблицы (keymaps), консольных шрифтов для русского языка и кнопки переключения языка клавиатуры (правый shift):

root@inet:/usr/share/syscons/fonts # cat /etc/rc.conf
#RU
keymap=”/usr/share/syscons/keymaps/ru.koi8-r”
keychange=”61 ^[[K”
scrnmap=”koi8-r2cp866″
font8x8=”/usr/share/syscons/fonts/cp866-8.8.fnt”
font8x14=”/usr/share/syscons/fonts/cp866-8.14.fnt”
font8x16=”/usr/share/syscons/fonts/cp866-8.16.fnt”
root@inet:/usr/share/syscons/fonts #

Еще нужно установить тип терминала вместо xtrem – cons25r:

root@inet:/usr/home/mick # cat /etc/ttys 
ttyv0   “/usr/libexec/getty Pc”         cons25r on  secure

Перелогиниваемся, нажимаем паравый Shift и в консоли можем писать по русски. Для наглядости запустим mc (у кого нет ставим из портов /usr/ports/misc/mc) и видим, что менюшки все на русском языке.

Ну вот сделали небольшой тюнинг, перейдем к обновлению системы (мир и ядро).  После выхода релиза накапливаются некоторые патчи, изменения, которые со временем входят в следующий релиз. Обновление мира состоит закачке исходников, компиляции и установки из них свежих бинарных файлов пользовательских програм (grep, cat, vi,..). Поскольку  релиз 9.2 вышел 2 недели назад, то мне нет смысла пересобирать мир, но я ниже укажу порядок действий как это делать. Для начала нужно закачать исходники. Можно использовать CVS или SVN репозитории. SVN более новая разработки, которая имеет широкие возможности, но я буду использовать CVS, т.к. он не требует установить большое количество дополнительного ПО как SVN и для небольшого сервера он вполне подойдет. В системе установлена программа csup, можно установить из портов cvsup: net cvsup-without-gui (без GUI интерфейса, консольная версия). Принцип действия у их одинаковый, разница в том, что csup написана на C. Конфиг берем отсюда /usr/share/examples/cvsup/ и редактируем под собственные потребности. Директива *default release=cvs tag=RELENG_9 говорит о том, что исходники будут обновлены до 9-й версии STABLE.

root@inet:/etc/my_config # cat stable-supfile
*default host=cvsup6.ua.FreeBSD.org
*default base=/var/db
*default prefix=/usr
*default release=cvs tag=RELENG_9
*default delete use-rel-suffix
*default compress
src-all

Конфиг готов, я положил его в /etc/my_my_config, запускаем. Ключ -g указывает запускать без GUI, L2 – максимальный уровень вывода на экран – будет выводиться все действия:

root@inet:~ #  csup -g -L 2 /etc/my_config/stable-supfile

После запуска мы увидим процесс закачки обновлений, займет около получаса при хорошей скорости Интернета. Смотрим размер du -h /usr/src 820M. Исходники закачались.

Собираем World (мир). Рекомендуется вернуть дефолтный /etc/make.conf. Порядок действий:

  1. cd /usr/src
  2. rm -R /usr/obj ( удаляем все /usr/obj – тут хранятся компиллированные файлы из которых потом инсталлирует мир)
  3. make cleandir && make cleandir ( рекмендуют делать именно 2 раза)
  4. make -sj4 buildworld

Перед сборкой желательно зайти в однопользовательский режим.

  1. mount -u /
  2. mount -a
  3. /usr/src/usr.sbin/mergemaster -p
  4. cd /usr/src
  5. make installworld
  6. mergemaster
  7. reboot
  8. cd /usr/src
  9. make delete-old

В процессе инсталляции рекомендуется запускать программу mergemaster. Она сравнивает текущие конфигурационные файлы /etc с /usr/src/etc и если есть разница предлагает на выбор или оставить старый или новый или объединить. Желательно использовать новые файлы, но если работает какое-либо ПО, то нужно проанализировать новые изменения на предмет работоспособности.  По хорошему старый /etc желательно  сохранить.

Сборка ядра. В ядре хранятся модули программ и поддержка аппаратных устройств. Программы, встроенные в ядро работают быстрее, чем подгружаемые модули. По умолчанию в системе используется ядро GENERIC, местоположение /usr/src/sys/i386/conf. Но хранить там собственное ядро нежелательно, поскольку может быть удалено при последующих обновлениях. Мы создадим свою папку с файлами конфигураций/etc/my_config , скопируем сюда GENERIC, переименуем его и добавим нужные нам опции.

#mkdir /etc/my_config
# cd /usr/src/sys/i386/conf
#cp GENERIC /etc/my_config/
# mv /etc/my_config/GENERIC /etc/my_config/MICKIPFW
#ln -s /etc/my_config/MICKIPFW (создаем символическую ссылку на файл /etc/my_config/MICKIPFW)

В файл ядра добавляем следующие опции:

ident           MICKIPFW
#
options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=100
options IPFIREWALL_DEFAULT_TO_ACCEPT
options IPFIREWALL_FORWARD
options IPDIVERT
options DUMMYNET
options IPFILTER
options IPFILTER_LOG

Эти опции для работы нужны для работы фаервола, о котором речь пойдет позже.

  1. cd /usr/src
  2. rm -R /usr/obj
  3. make cleandir && make cleandir
  4. make -sj4 builkernel KERNCONF=MICKIPFW
  5. make  installkernel KERNCONF=MICKIPFW
  6. reboot

Если в процессе сборки и установки никаких ошибок не возникло после ребута командой uname -a увидим, что новое ядро работает. При инсталяции /boot/kernel переименовывается в /boot/kernel.old. Если после инсталяции система не грузится можно при загрузке указать грузиться с /boot/kernel.old и стартанет старое ядро.

Обновление портов.

Обновлять порты можно с пмощью cvsup или portsnap. Будем использовать второй вариант, поскольку cvsup утсаревшее ПО. При первом запуске:

root@inet:/usr/home/mick # portsnap fetch
Looking up portsnap.FreeBSD.org mirrors… 7 mirrors found.
Fetching public key from ec2-eu-west-1.portsnap.freebsd.org… done.
Fetching snapshot tag from ec2-eu-west-1.portsnap.freebsd.org… done.
Fetching snapshot metadata… done.
Fetching snapshot generated at Fri Sep 13 03:04:34 EEST 2013:
ced2dfabe1a0a7ca68bedad7f042f8d1c0a9ac7882e963 26% of   69 MB  181 kBps 05m47s
root@inet:/usr/home/mick # portsnap extract

В дальнейшем:

root@inet:/usr/home/mick # portsnap fetch
root@inet:/usr/home/mick # portsnap update

Можно в крондобавить раз в неделю запускать portsnap fetch && portsnap update. Есть еще хорошая програмка portupgrade(/usr/ports/ports-mgmt/portupgrade), которая может обновлять порты до последних версий.

Команда pkg_version -v показывает какие установлены программы и нужно ли их обновлять.

portupgrade -nr port_name – информация о будущей установки пакета и какие зависимости будут установлены.

portupgrade -ir port_name – опция -i – указывает спрашивать пользователя, если есть выбор при установке, опция -r – обновлять все зависимости при установке.

Есть еще интерессная программа portdowngrade, которая позволяет инсталлировать прошлые версии программ.

2.Установка и настройка DHCP-сервера.

Наш сервер будет выдавать динамически IP-адреса для пользователей. Для этих целей устанавливает порт /usr/ports/net/isc-dhcp42-server/. Дефолтный конфиг нам не подходит, там много лишнего, вот мой конфиг, лежит /usr/local/etc/dhcp.conf:

option domain-name-servers 195.64.225.197,195.64.225.199; # определяем ДНС сервера провайдера
default-lease-time 43200;#время аренд ip адреса
max-lease-time 43200;#максимальное время аренд ip адреса
authoritative; # наш сервер является авторизованных главным сервером для нашей сети
log-facility local7; # куда пишем логи
subnet 192.168.210.0 netmask 255.255.255.0 {
range 192.168.210.100 192.168.210.200;
option routers 192.168.210.1;
option broadcast-address 192.168.210.255;
}#Тут определяем нашу подсети, диапазон выделяемых ip,щлюз, бродкаст, эти все данные сервер будет выдавать пользователям.
host Xerox_sekretar {hardware ethernet 9c:93:4e:08:1b:83; fixed-address 192.168.210.2;}
host dlink2 {hardware ethernet 00:17:9a:83:3f:5e; fixed-address 192.168.210.3;}
host 1C {hardware ethernet 20:cf:30:8a:d5:2c; fixed-address 192.168.210.6;}
host icc-bd {hardware ethernet 8c:89:a5:68:85:13; fixed-address 192.168.210.7;}
host Admin {hardware ethernet 48:5b:39:d2:a7:58; fixed-address 192.168.210.8;}
host Sekretar {hardware ethernet 00:0d:87:d4:c9:2f; fixed-address 192.168.210.10;}
host Kosiuk {hardware ethernet 00:22:15:8e:72:1f; fixed-address 192.168.210.11;}
host Lytkina {hardware ethernet 00:1e:68:fb:7a:4a;fixed-address 192.168.210.12;}
host Suprunyuk {hardware ethernet 00:30:67:3e:c6:11;fixed-address 192.168.210.13;}
host Novohatska {hardware ethernet c8:60:00:d0:0a:dd;fixed-address 192.168.210.14;}
host Tarnavska {hardware ethernet 00:0a:48:0d:33:5a;fixed-address 192.168.210.15;}
host Xerox_lytkina {hardware ethernet 00:00:aa:cc:91:74;fixed-address 192.168.210.16;}
host Xerox_bugalt {hardware ethernet 00:00:aa:cc:26:22;fixed-address 192.168.210.17;}
host Pasechnik {hardware ethernet 00:23:08:b7:57:47;fixed-address 192.168.210.18;}
host Zavhoz {hardware ethernet 00:50:8d:68:cc:3b;fixed-address 192.168.210.19;}
host Tereshkovich {hardware ethernet 20:16:d8:85:61:c5;fixed-address 192.168.210.20;}
host Khalak {hardware ethernet 8c:89:a5:d9:ca:a7;fixed-address 192.168.210.21;}
host Dlink1 {hardware ethernet 00:17:9a:75:a0:f5;fixed-address 192.168.210.22;}
host Stepnyk {hardware ethernet 00:15:af:45:5a:11;fixed-address 192.168.210.23;}
host Suhareva {hardware ethernet 50:46:5d:73:4f:dd;fixed-address 192.168.210.25;}
host Gorbatsevich {hardware ethernet 00:15:af:59:a7:40;fixed-address 192.168.210.26;}
host Kabanets {hardware ethernet c8:60:00:d0:09:da;fixed-address 192.168.210.27;}

В директиве host указывается какой ip назачать для конкретного mac-адреса сетевой. Это нам нужно в дальнейшем, когда будет строиться статистика по использованию веб-траффика по каждому сотруднику. Конфин настроили, добавляем в /etc/rc.conf:

#DHCP
#ifconfig_re1=”DHCP”
dhcpd_enable=”YES”                          # dhcpd enabled?
dhcpd_flags=”-q”                            # command option(s)
dhcpd_conf=”/usr/local/etc/dhcpd.conf”      # configuration file
dhcpd_ifaces=”re1″                             # ethernet interface(s)
dhcpd_withumask=”022″                       # file creation mask

Добавляем в /etc/syslog.conf нижеуказанные строчки и создаем файл var/log/dhcpd.log.

local7.*                                         /var/log/dhcpd.log

Ребутим машину или рестартим службу /etc/syslogd restart && /usr/local/etc/rc.d/isc-dhcpd start. На клиентах должен повиться ip, в логах /var/log/dhcp.log:

Sep 13 22:36:17 inet dhcpd: DHCPREQUEST for 192.168.210.11 from 00:22:15:8e:72:1f via re1
Sep 13 22:36:17 inet dhcpd: DHCPACK on 192.168.210.11 to 00:22:15:8e:72:1f via re1
Sep 13 22:37:53 inet dhcpd: DHCPINFORM from 192.168.210.11 via re1
Sep 13 22:37:53 inet dhcpd: DHCPACK to 192.168.210.11 (00:22:15:8e:72:1f) via re1

В /var/db/dhcpd/dhcpd.leases:

lease 192.168.210.11 {
starts 2 2013/09/10 11:48:41;
ends 2 2013/09/10 14:12:41;
cltt 2 2013/09/10 11:48:41;
binding state active;
next binding state free;
rewind binding state free;
hardware ethernet 00:22:15:8e:72:1f;
uid “\001\310`\000\320\012\335″;
client-hostname “Novohatska”;

3. Настройка IPNAT и IPFW.

Ранее, когда мы обирали вое ядро были включены в ядро IPFW и IPFILTER. Ели этого не делать работать будет как модуль, но скорость будет ниже. Итак, что мы включили в ядро:

PFIREWALL – включение в ядро ipfw;
IPFIREWALL_VERBOSE – ведение логов ipfw;
IPFIREWALL_VERBOSE_LIMIT=100 – максимальное количество записей в секунду в логах;
IPFIREWALL_DEFAULT_TO_ACCEPT – если нет правил – пакеты все проходят;
IPFIREWALL_FORWARD – для настройки форварда пакетов (необходим для transparent squid);
IPDIVERT – включение natd в ядро;
DUMMYNET – системное средство применяется для регулирования трафика, шейпера;
IPFILTER – включение в ядро ipfilter;
options IPFILTER_LOG – включение записи логов.

Для того, чтобы пользователь смогли выходить в интернет нужно пробрасывать пакеты с внутреннего интерфейса на внешний. Сделать это можно посредством опции DIVERT демона NATD или IPNAT. Я использую IPNAT. Прописываем в /etc/rc.conf следующее:

gateway_enable=”YES”
firewall_enable=”YES”
firewall_script=”/etc/my_config/ipfw.rules”
firewall_quiet=”NO”
firewall_logging=”YES”
ipnat_enable=”YES”
ipnat_rules=”/etc/ipnat.rules”
ipmon_enable=”YES”
ipmon_flags=”-Dva /var/log/ipmon.log”
#natd_enable=”YES”
#natd_interface=”re0″
#natd_flags=””

Тут gateway_enable=”YES” указывает серверу быть шлюзом интернета, эта запись меня меняет значение с 0 на 1 параметра  ip.fw net.inet.ip.fw.enable.

root@inet:/var/log # sysctl -a | grep net.inet.ip.fw.enable:
net.inet.ip.fw.enable: 1

Далее в rc.conf прописан запуск IPFW со списком правил /etc/my_config/ipfw.rules. Стартует IPNAT с конфигом /etc/ipnat.rules, IPMON, который пишет логи в /var/log/ipmon.log (нужно создать вкучную). В /etc/ipnat.rules прописаны правила:

root@inet:/var/log # cat /etc/ipnat.rules
map re0 192.168.210.0/24 -> 195.64.226.196/32 portmap tcp/udp 40000:60000

Тут указано, что пакеты пришедшие на внешний интерфейс re0 с подсети внутренней сети 192.168.210.0/24 перенаправлять на внешний ip при этом порты подменяются на высокие в диапазоне 40000-60000. Если пользователь в браузере введет какой-либо сайт его запрос обратиться на шлюз по умолчанию ,IPNAT увидит, что пакет хочет на внешний интерфейс, подменит адрес внутренний ip отправителя на внешний ip сервера и подменит порт на из высокого диапазона. IPMON все эти действия запишет в   /var/log/ipmon.log. Если использовать natd, то нужно раскомментировать его в /etc/rc.cong и добавить в правилах фаервола директивой DIVERT форвард пакетов на внешний интерфейс.

Теперь рассмотрим правила /etc/my_config/ipfw.rules. Идея следующая – сначала разрешаем нужные нам сервисы, все остальное запрещаем.

#!/bin/sh
#Назначаем переменные, путь к ipfw, внешний,внутренний интерфейс,  внешний,внутренний ip, список ip, которым разрешен доступ на SSH.
cmd=”/sbin/ipfw”
if_ext=”re0″
if_int=”re1″
ip_ext=”195.64.226.196″
ip_int=”192.168.210.1″
sshpass=”178.137.X.X,195.238.X.X”

${cmd} 1 add allow ip from 178.137.X.X to any
${cmd} 2 add allow ip from any to 178.137.X.X

# Проверяем – соответствует ли пакет динамическим правилам:
${cmd} 3 add check-state

# Разрешаем весь траффик по внутреннему интерфейсу (петле)
${cmd} 10 add allow ip from any to any via lo0
${cmd} 11 add deny ip from any to 127.0.0.0/8
${cmd} 12 add deny ip from 127.0.0.0/8 to any

# запреты:
# режем частные сети на внешнем интерфейсе
${cmd} 20 add deny ip from any to 10.0.0.0/8 in via ${if_ext}
${cmd} 21 add deny ip from any to 172.16.0.0/12 in via ${if_ext}
${cmd} 22 add deny ip from any to 192.168.0.0/16 in via ${if_ext}
${cmd} 23 add deny ip from any to 0.0.0.0/8 in via ${if_ext}
# рубим траффик к частным сетям через внешний интерфейс
# заметтьте – эти правила отличаются от тех что были выше!
${cmd} 24 add deny ip from 10.0.0.0/8 to any out via ${if_ext}
${cmd} 25 add deny ip from 172.16.0.0/12 to any out via ${if_ext}
${cmd} 26add deny ip from 192.168.0.0/16 to any out via ${if_ext}
${cmd} 27 add deny ip from 0.0.0.0/8 to any out via ${if_ext}

# рубим автоконфигуреную частную сеть
${cmd} 30 add deny ip from any to 169.254.0.0/16 in via ${if_ext}
${cmd} 31 add deny ip from 169.254.0.0/16 to any out via ${if_ext}

# рубаем мультикастовые рассылки
${cmd} 40 add deny ip from any to 240.0.0.0/4 in via ${if_ext}
${cmd} 41 add deny ip from 224.0.0.0/4 to any out via ${if_extt}

# рубим фрагментированные icmp
${cmd} 50 add deny icmp from any to any frag
# рубим широковещательные icmp на внешнем интерфейсе
${cmd} 51 add deny log icmp from any to 255.255.255.255 in via ${if_ext}
${cmd} 52 add deny log icmp from any to 255.255.255.255 out via ${if_ext}

# разрешаем все установленные соединения (если они установились –
# значит по каким-то правилам они проходили:)
${cmd} 60 add allow tcp from any to any established

# разрешаем весь исходящий траффик (серверу-то в инет можно? :))
${cmd} 70 add allow ip from ${ip_ext} to any out xmit ${if_ext}

# разрешаем DNS снаружи (нам же надо узнавать IP по именам машин?)
${cmd} 80 add allow udp from any 53 to any via ${if_ext}

# разрешаем UDP (для синхронизации времени – 123 порт)
${cmd} 90 add allow udp from any to any 123 via ${if_ext}

# разрешаем ftp снаружи (оба правила – для пасивного режима)
# для узнавания портранджа по которому будет работать, лезем в
#/usr/home/lissyara/>sysctl net.inet.ip.portrange.first
# net.inet.ip.portrange.first: 49152
# /usr/home/lissyara/>sysctl net.inet.ip.portrange.last
# net.inet.ip.portrange.last: 65535
${cmd} 100 add allow tcp from any to ${ip_ext} 21 via ${if_ext}

# разрешаем некоторые типы ICMP траффика – эхо-запрос,
# эхо-ответ и время жизни пакета истекло
${cmd} 110 add allow icmp from any to any icmptypes 0,8,11

# открываем снаружи SSH порт – если надо будет ходить на машину по ssh
${cmd} 120 add allow tcp from ${sshpass} to ${ip_ext} 443 via ${if_ext}

#Разрешено все внутри сети
${cmd} 130 add allow ip from any to any via ${if_int}

#Запрещено весь отальной траффик
${cmd} 900 add deny ip from any to any 137,138,30311
${cmd} 901 add deny udp tcp from any to any
${cmd} 902 add deny log logamount 10000 tcp from any to any

В самом конфиге все прозрачно описано, был взят с сайта www.lissyara.su.  В первом правиле я разрешил все для своего домашнего ip. Далее режем на внешнем интерфейсе что не должно появиться, разрешаем все внутри сети, снаружи ДНС, сиснхронизацию времени, FTP, SSH. В 900 правиле режутся порты,137,139,30311, в 901 udp пакеты – те, которые я не хочу видеть в логах. Все остальное пишется в логи, при этом игнорируется значение, указанное в ядре IPFIREWALL_VERBOSE_LIMIT=100 – 100 строк в логе. Опция logamount 10000разрешает 10000 записей. Когда идет атака на сервер записи в логах могу разростись до больших значений и когда достигнут значения 100( указано в ядре) данные не пишутся. В кроне прописываем:

root@inet:/var/log # cat /etc/crontab | grep ipfw
*     */3       *       *       *       root    “/sbin/ipfw zero”

Опция zero обнулит счетчик ipfw, тогда в логи снова будут писать данные. Сделано на всякий случай, если количество записей после последнего обнуления достигнут 10000.   Пропишем ротацию логов:

root@inet:/var/log # cat /etc/newsyslog.conf  | grep security
/var/log/security                       600  10    500  *     JC

Логи ipfw пишутся в /var/log/security, в  /etc/newsyslog.conf указываем, что хранить не 10 файлов, при достижении размера файла 500 кб архивировать. Рестартуем сервер или службы /etc/rc.d/ipfw restart, /etc/rc.d/syslogd restart, /etc/rc.d/syslogd restart. Влогах может появиться запись last message repeated 45 times. Это определяется строкой в ядре IPFIREWALL_VERBOSE_LIMIT=100. При получении одинаковых 145 сообщений 100 запишется и в конце last message repeated 45 times.

4.Установка и настройка прокси-сервера SQUID.

Для того, чтобы собирать статистику по веб-трафику пользователей, нужно все запросы на 80 и 443 порт пропускать через прокси-сервер, далее анализатором логом парсить данные в таблицы и черз http просматривать. В качестве прокси используем /usr/ports/www/squid. При установке выбираем с какими опциями собран порт.  Мы используем IPNAT для редиректа портов, поэтому обязательно нужно собирать с опцией IPFILTER. У меня собрано с такими опциями:

root@inet:/usr/ports/www/squid # make showconfig
===> The following configuration options are available for squid-2.7.9_4:
ARP_ACL=off: Enable ACLs based on ethernet address
AUFS=off: Enable the aufs storage scheme
CACHE_DIGESTS=off: Enable cache digests
CARP=on: Enable CARP support
COSS=off: Enable the COSS storage scheme
DELAY_POOLS=on: Enable delay pools
DNS_HELPER=off: Use the old ‘dnsserver’ helper
FOLLOW_XFF=off: Follow X-Forwarded-For headers
HTCP=on: Enable HTCP support
IDENT=on: Enable ident (RFC 931) lookups
IPFILTER=on: Enable transp. proxying with IPFilter
KERB_AUTH=on: Install Kerberos authentication helpers
KQUEUE=on: Use kqueue(2) instead of poll(2)
LARGEFILE=off: Support log and cache files >2GB
LDAP_AUTH=off: Install LDAP authentication helpers
NIS_AUTH=on: Install NIS/YP authentication helpers
PF=off: Enable transparent proxying with PF
PINGER=on: Install the icmp helper
REFERER_LOG=off: Enable Referer-header logging
SASL_AUTH=on: Install SASL authentication helpers
SNMP=off: Enable SNMP support
SSL=off: Enable SSL support for reverse proxies
STACKTRACES=off: Create backtraces on fatal errors
STRUCT_HTTP=off
USERAGENT_LOG=off: Enable User-Agent-header logging
VIA_DB=off: Enable forward/via database
WCCP=on: Enable Web Cache Coordination Prot. v1
WCCPV2=off: Enable Web Cache Coordination Prot. v2
===> Use ‘make config’ to modify these settings

Опции сборки порта также можно посмотреть в файле /var/db/ports/www_squid/options или /usr/ports/www/squid сделать make config. Добавляем squid_enable=”YES” в /etc/rc.conf. Настраиваем конфиг /usr/local/etc/squid/squid.conf:

 #2013-09-18_http://www.lissyara.su/articles/freebsd/programms/squid+ad/
http_port 192.168.210.1:8080 transparent
error_directory /usr/local/etc/squid/errors/Russian-1251
# список слов, которые будучи обнаруженными в URL вызывают обработку без кэширования
hierarchy_stoplist cgi-bin ?
# список ACL которые вызывают несовпадение с кэшем,
# и, запрос с ответом кэшироваться не будут
acl QUERY urlpath_regex cgi-bin \?
# собственно – правило что не кэшируем
no_cache deny QUERY
# сколько отдаём ему памяти (реально пожрёт втрое больше)
cache_mem 512 MB
# Директория для кэша, числа – размер кэша в Mb,
# число директорий первого уровня, число директорий второго уровня в каждой директории первого.
cache_dir ufs /var/squid/cache 3000 16 256
# лог доступа
cache_access_log /var/squid/logs/access.log squid
cache_log /var/squid/logs/cache.log
# лог активности менеджера хранилища. Показывает, какие
# объекты были сохранениы/удалены из кэша и как долго.
# мне он не нужен, а места занимает прилично.
cache_store_log none
pinger_program /usr/local/libexec/squid/pinger
cache_swap_high 95
cache_swap_low 90
maximum_object_size 4096 KB
minimum_object_size 0 KB
cache_mgr admin@medigran.com.ua
visible_hostname medigran.com.ua
tcp_outgoing_address 195.64.226.196
udp_outgoing_address 195.64.226.196
#ACL
acl all src 0.0.0.0/0.0.0.0
acl localhost src 127.0.0.1/255.255.255.255
acl office src 192.168.210.0/24
acl manager proto cache_object
acl shaper src 192.168.210.200
acl admins src 192.168.210.8
acl SSL_ports port 443 563 5190
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 563 # https, snews
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
acl access_denied dstdomain “/usr/local/etc/squid/access_denied”
http_access deny access_denied all
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow admins all
http_access allow office all
http_access deny all
#
#Delay Pool
#Задаем количество пулов -2
delay_pools 2
# задется сначала номер пула(2), потом клас его клас 1
delay_class 1 1
#первое значение – сколько байт скачается на максимальной скорости,второе – скорость последующая в байтах 1Мбит=128кбайт=131072 байт
#delay_parameters 1 -1/-1 снятие всех ограничений
#Класы: 1. Ограничение общей скорости для всех хостов из группы.Самій распространенный, его и используем.
#2.Общая скорсоть для всей сети и конкретно по каждому пользователю
#3. Ограничивает общая скорость для сети, для группы ipи на конкретный ip
delay_parameters 1 1000/131072
#доступ или запрет по конкретному пулу
delay_access 1 allow shaper
delay_access 1 deny all
#
delay_class 2 1
delay_parameters 2 1310720/1310720
delay_access 2 allow office
delay_access 2 deny all

В конфиге указано, что логи будут складываться в /var/squid/logs/access.log , через прокси разрешен доступ на некоторые порты (safe_ports), в файле /usr/local/etc/squid/access_denied описывается список запрещенных сайтов, создано 2 пула для ограничения скорости для конкретных пользователей. Для создания кеша в консоли выполняем squid -z . В /etc/rc.conf пишем squid_enable=”YES”. Ребутаем или стартуем /usr/local/etc/rc.d/squid start. Если мы в свойствах обозревателя укажем наш прокси мы попадем в интернет и в логах отобразится запись. Но нам нужно сделать прозрачный без прописывания прокси, для этого IPNAT будет форвардить весть http траффик  на 8080 порт нашего прокси сервера:

root@inet:/ # cat /etc/ipnat.rules
map re0 192.168.210.0/24 -> 195.64.226.196/32 portmap tcp/udp 40000:60000
rdr re1 0/0 port 80 -> 192.168.210.1 port 8080 tcp
root@inet:/ # /etc/rc.d/ipnat reload
787 entries flushed from NAT table
2 entries flushed from NAT list

5.Установка и настройка анализатора логов Lightsquid и веб-сервера  Apache.

Для анализа логов устанавливаем /usr/ports/www/lightsquid/. Порт не собирался и выдавал ошибку. Смотрим в .usr/ports/UPDATING, там указано “20130612:Please rebuild all Perl ports and all ports that depend on it”. Поменялась конфигурация perl, его нужно переустановить. Делаем portupgrade -rf perl, после чего lightsquid успешно установился.Открываем конфиг /usr/local/etc/lightsquid/lightsquid.cfg и правим:

#!/usr/bin/perl
# ——————– GLOBAL VARIABLES  —————————

#где находятся cfg
$cfgpath             =”/usr/local/etc/lightsquid”;
#где находятся шаблоны
$tplpath             =”/usr/local/www/lightsquid/tpl”;
#где смотреть языки
$langpath            =”/usr/local/share/lightsquid/lang”;
#куда будет слаживаться статистика
$reportpath          =”/usr/local/www/lightsquid/report”;
#откуда парсить
$logpath             =”/var/squid/logs”;
#где брать данные о предобразовании ip в имена
$ip2namepath         =”/usr/local/libexec/lightsquid”;

#path to `lockfile` ;-)
$lockpath            =$reportpath;

#удалить старый лок-файл, если он старше $maxlocktime second
$maxlocktime         = 30*60;

#if 1 – lightparser generate some statistic
$debug               = 0;
#if 1 – lightparser generate skip details, 2 …, 3 …, ….
$debug2              = 0;

# ——————– LightParser VARIABLES  —————————
#тип логов, 0 -родной, 1 – httpd
$squidlogtype        = 0;

#не учитывать указанные сайты в статистике
#$skipurl             = ‘zdd\.com|192\.168\.1\.|cnn\.com';
$skipurl             = ‘zzz\.zzz';

#ip2name использовать шаблон /usr/local/libexec/lightsquid/ip2name.list. В єтом файле указываем my $ipfile = “/etc/hosts”.Преобразовывать ip в имена
$ip2name=”list”;

#Если нужно – преобразование text в число
%month2dec = ( Jan => 1, Feb => 2, Mar => 3, Apr => 4, May => 5,Jun => 6,
Jul => 7, Aug => 8, Sep => 9, Oct => 10, Nov => 11,Dec => 12);

# ——————– Common (Parser & Web) VARIABLES  ———————-
#create & use time report statistic (logsize = logsize*2) ;-))
$timereport          = 1;

# ——————– WEB VARIABLES  —————————————-

#язык интерфейса – bg,eng,fr,hu,it,pt_br,ru,sp
$lang                =”ru”;

#имя шаблона, смотреть `tpl/$templatename/`
$templatename        =”base”;
#$templatename        =”ric”;
#$templatename        =”base.css”;

#define type of decimal output
#fine  123456789 -> 123,456,789
#class 123456789 ->       117.7 G
$DecOutType=”class”;

# define delimiter for thousands (in `fine` mode)
# = ” ” -> 12 345 678
# = “,” -> 12,345,678
# = “”  ->   12345678
$decdelimiter        = ” “;

#if you dont need Group mode, do =0
$showgrouplink       = 1;

#if not zero, groups look like “01. Group1″, if zero – “Group1″
$showgroupid         = 1;
$showoversizelink    = 1;

#show how many data user send to internet
$showputpost         = 0;
#if putpost higer this variable (in percent), highlight it
$putpostwarninglevel =15;

#использование .realname files
$userealname         = 1;

#большие файлы 2Mб
$bigfilelimit        = 2*1024*1024;

#Лимит трафик для пользователя( в статистике показано – превысил)
$perusertrafficlimit = 1000*1024*1024;

# недельный режим отображения
$weekendmode=”both”;

#сколько сайтов показывать в Top
$topsiteslimit       = 500;

#сколько сайтов показывать в .pthcrjq cnfnbcnbrt
$usertimelimit       = 200;

#if you want user traffic GRAPHIC report, set it in 1
#WARNING !!!, need libgd, GD.PM & other external modules !!!
#please run check-setup.pl for check library !!!!
$graphreport         = 1;

#Максимальное значение в графическом отчете
# for user month report (0.05*(…) = 50mb)
$graphmaxuser=0.05*(1024*1024*1024);
# for all user month report (1.05*(…) = 1 Gb)
$graphmaxall =0.80*(1024*1024*1024);

#Тема для графиков, бывает “orange”,”blue”,”green”,”yellow”,”brown”,”red”
$barcolor=”orange”;

После всех изменений парсим:

14:25 mick@[/usr/ports]# /usr/local/www/lightsquid/lightparser.pl
14:25 mick@[/usr/ports]# cd /usr/local/www/lightsquid/ && ./check-setup.pl
LightSquid Config Checker, (c) 2005-9 Sergey Erokhin GNU GPL

LogPath   : /var/squid/logs
reportpath: /usr/local/www/lightsquid/report
Lang      : /usr/local/share/lightsquid/lang/ru
Template  : /usr/local/www/lightsquid/tpl/base
Ip2Name   : /usr/local/libexec/lightsquid/ip2name.list

all check passed, now try access to cgi part in browser

Заносим в /etc/crontab:

14:27 mick@[/usr/local/www/lightsquid]# cat /etc/crontab | grep light
#Squid & lightsquid
*/10    *       *       *       *       root    /usr/local/www/lightsquid/lightparser.pl
1       0       *       *       *       root    /usr/local/www/lightsquid/lightparser.pl && /usr/local/sbin/squid -k rotate

Тут каждые 10 минут lightparser.pl парсит лог сквида, в 00:01 парсится лог сквида, создается новый файл текущего дня и заносится статистика за период 00:00-00:01 после выполнения ротируется лог сквида. Если ротацию производить например утром в 08.00, то парсер увидит, что в логе данные начинаются с 08:00 и старые данные затрет и статистика начнется с 08.00, т.е. потеряем данные. Статистика у нас есть, теперь мы должны ее визуально увидеть черед браузер. Для этого установим веб-сервер /usr/ports/www/apache22. В /etc/rc.conf добавляем apache22_enable=”YES”. Открываем конфиг апача  /usr/local/etc/apache22/httpd.conf и правим конфиг. Ниже укажу только те строки которые меняем, остальное остается по умолчанию без изменений:

Listen *:80 – слушать 80 порт на всех интерфейсах, если нужно на конкретном , то пишем IP:80

ServerName www.stat.medigran.com:80 – указываем имя сервера, без этого служба не стартует

<Directory />
AllowOverride None
Order deny,allow
#    Deny from all                  # комментируем мы, строка по умолчанию раскомментирована.
</Directory>

Alias /lightsquid/ “/usr/local/www/lightsquid/”
<Directory “/usr/local/www/lightsquid”>
AddHandler cgi-script .cgi
AllowOverride All
</Directory>

Последний блок – мы прописываем алиас /lightsquid по которому будет доступна статистика.Стартуем веб-сервер, открываем в браузере http://IP/lightsquid и смотрим статистику.

© mick, 2013.