Рубрики: FreeBSD

Подсчёт трафика с помощью trafd

Хорошая статья о возможностях trafd находится здесь — http://www.hub.ru/archives/2061 В своей заметке я выбрал лишь то, что нужно действительно мне и подправил пару неточностей.

Установим trafd:

# cd /usr/ports/net-mgmt/trafd
# make install clean

Создаем файл, куда будет писаться статистика (fxp0 — название интерфейса с которого будем собирать статистику):

# touch /usr/local/var/trafd/trafd.fxp0

Запускаем сам сбор статистики:

# /usr/local/bin/trafd -i fxp0

Эту же строчку добавим в /etc/rc.conf для автоматического старта при запуске. В идеале в /etc/rc.conf нужно прописать
trafd_enable=»YES»
trafd_ifaces=»fxp0″

но с этими строчками trafd не запустился, поэтому для автоматического старта прописываем в cron  такую строчку:

@reboot /usr/local/bin/trafd -i fxp0
Проверяем работу демона:

ps ax | grep trafd

7753 ?? Ss 0:00.07 /usr/local/bin/trafd -i fxp0
7826 p0 R+ 0:00.00 grep trafd

Добавим задачу в crontab чтобы данные сохранялись каждые 3 часа:

0 */3 * * * /usr/local/bin/trafsave fxp0

Посмотреть отчет за период со времени последнего сохранения:

# traflog -n -i fxp0 (-n указывает не преобразовывать IP адреса)

Посмотреть перечень записей:

# traflog -l -i fxp0

Примерный вывод результата:

# Started Dumped Data All Recs
001 Dec 10 16:44:46 Dec 10 16:49:54 18638 25246 7
002 Dec 10 16:49:54 Dec 10 16:50:45 22 55 1
003 Dec 10 16:50:45 Dec 10 16:51:15 8607 9111 1
004 Dec 10 16:51:15 Dec 10 20:00:01 68463394 72252858 349
005 Dec 10 20:00:01 Dec 11 00:00:01 1552189274 1621174536 577

Допустим, перед нами стоит задача посчитать сколько трафика скачано с определенного IP за весь период подсчётов. Выяснить это можно так:

traflog -n -i fxp0 -s from all to 10.10.51.79 | grep Summary

Если требуется высчитать трафик за определенный период, то добавляем ключи, указывающие на начало и конец отчетного периода (параметры -b <первая запись> -e <последняя запись>):

traflog -n -i fxp0 -s -b1 -e33 from all to 10.10.51.79 | grep Summary

Команда » | grep Summary» отсекает вывод излишне подробной статистки, откуда и сколько байт пришло, это бывает полезно, если нужно смотреть статистику используя медленные каналы связи.

Один из примеров использования trafd — подсчет трафика одной из игрушек, использующей порты 2106 и 7777, прошедшего через внешний интерфейс за определенный период:

traflog -n -i tun0 -b1 -e28 -s port 7777 port 2106 | grep Summary

Ссылки:

Установка SAMS с NCSA и IP авторизацией на FreeBSD из портов

Что такое SAMS, его возможности и принцип работы хорошо описаны здесь — http://www.permlug.org/wiki/sams. К сожалению в свое время я не нашел хорошей пошаговой инструкции по установке SAMS из портов в системе FreeBSD, поэтому написал собственную шпаргалку. Надеюсь, она поможет начинающим обойти те подводные камни, которые попались мне.

Установка проводилась на FreeBSD 6.3, на момент установки в системе присутствовали следующие пакеты:

mysql-5.0.51a
php5-5.2.6
apache-2.2.9
samba-3.0.31_1

Связка Apache2 + PHP + MySQL без проблем работала (о её установке читайте в предыдущих заметках), оставалось поставить из портов последние доступные версии squid-2.7.5 и sams-1.0.3.

Ставим squid, обязательно выбираем опцию — Enable delay pools:

# cd /usr/ports/www/squid

# make install clean

В /usr/local/etc/squid/squid.conf включаем ncsa авторизацию (это важный пункт, т.к. SAMS этого сам не сделает). Раскомментируем и подправим следующие строчки:

auth_param basic program /usr/local/libexec/squid/ncsa_auth /usr/local/etc/squid/ncsa.sams
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours

Создаем файл ncsa.sams. По идее SAMS сделает его самостоятельно, но нам сейчас нужно, чтобы Squid запустился еще до SAMS с целью тестирования его работы.

# touch /usr/local/etc/squid/ncsa.sams

Запускаем Squid:

# rehash
# squid -z
# /usr/local/etc/rc.d/squid start

Проверяем работу Squid. Должно показаться что-то вроде:

# ps -ax | grep squid
18859 ?? Is 0:00.00 /usr/local/sbin/squid -D
18861 ?? S 0:00.18 (squid) -D (squid)
18862 ?? Is 0:00.00 (ncsa_auth) /usr/local/etc/squid/ncsa.sams (ncsa_auth)
18863 ?? Is 0:00.00 (ncsa_auth) /usr/local/etc/squid/ncsa.sams (ncsa_auth)
18864 ?? Is 0:00.00 (ncsa_auth) /usr/local/etc/squid/ncsa.sams (ncsa_auth)
18865 ?? Is 0:00.00 (ncsa_auth) /usr/local/etc/squid/ncsa.sams (ncsa_auth)
18866 ?? Is 0:00.00 (ncsa_auth) /usr/local/etc/squid/ncsa.sams (ncsa_auth)

Приступаем к установке SAMS из портов. При конфигурации выбираем поддержку Apache 2 (у меня он и стоит):

# cd /usr/ports/www/sams
# make config
# make
# make install
# cp /usr/local/etc/sams.conf.sample /usr/local/etc/sams.conf
# make setup

Здесь нужно будет ввести пароль  пользователя root  в MySQL, согласиться на создание баз данных и пользователя sams и назначить ему пароль.

# make clean

После завершения инсталяции следуем выданным инструкциям. В конфиг Apache добавляем:

Alias /sams/ «/usr/local/share/sams/»
<Directory «/usr/local/share/sams/»>
AllowOverride AuthConfig
Options Indexes MultiViews
Order allow,deny
Allow from all
</Directory>

В файл /etc/rc.conf добавим:

sams_enable=”YES”
squid_enable=”YES”

Прописываем правильные пути в файле /usr/local/etc/sams.conf. Мой файл выглядит так:

[client]
SQUID_DB=squidlog
SAMS_DB=squidctrl
MYSQLHOSTNAME=localhost
MYSQLUSER=sams
MYSQLPASSWORD=samspasswd
MYSQLVERSION=5.0
SQUIDCACHEFILE=access.log
SQUIDROOTDIR=/usr/local/etc/squid
SQUIDLOGDIR=/usr/local/squid/logs
SQUIDCACHEDIR=/var/spool/squid
SAMSPATH=/usr/local
SQUIDPATH=/usr/local/sbin
SQUIDGUARDLOGPATH=/var/log
SQUIDGUARDDBPATH=/var/db/squidGuard
RECODECOMMAND=/usr/local/bin/iconv -f KOI8-R -t 866 %finp > %fout
LDAPSERVER=servername_or_ipadress
LDAPBASEDN=your.domain
LDAPUSER=DomainAdministrator
LDAPUSERPASSWD=passwd
LDAPUSERSGROUP=Users
REJIKPATH=/usr/local/rejik
SHUTDOWNCOMMAND=/sbin/shutdown -h now
CACHENUM=0
MYSQLUSER=sams
MYSQLPASSWORD=123456
MYSQLHOSTNAME=localhost

Запускаем sams:

# samsdaemon

Проверяем запустилось ли всё что нужно:

# ps -ax | grep sams
25865 ?? I 0:00.00 /usr/local/bin/samsf
25868 ?? Is 0:00.00 (ncsa_auth) /usr/local/etc/squid/ncsa.sams (ncsa_auth)
25869 ?? Is 0:00.00 (ncsa_auth) /usr/local/etc/squid/ncsa.sams (ncsa_auth)
25870 ?? Is 0:00.00 (ncsa_auth) /usr/local/etc/squid/ncsa.sams (ncsa_auth)
25871 ?? Is 0:00.00 (ncsa_auth) /usr/local/etc/squid/ncsa.sams (ncsa_auth)
25872 ?? Is 0:00.00 (ncsa_auth) /usr/local/etc/squid/ncsa.sams (ncsa_auth)
22678 p0- S 0:13.77 samsdaemon
26153 p0 R+ 0:00.00 grep sams

Заходим в веб-интерфейс SAMS — http://ip_server/sams/ по умолчанию пользователь admin, пароль qwerty.
SAMS -> SAMS administration -> SAMS settings выбираем NCSA авторизацию, ставим галочку на «Insert SQUID logs in database». Записывам настройки.

ВАЖНО!!! Обязательно изменить в «templates» тип авторизации на NCSA (по умолчанию стоит по IP). Если не сделать этого, то в консоли будет вываливаться сообщение о пуcтом файле default.sams.
Добавляем новых пользователей. Делаем переконфигурирование — SAMS -> SQUID -> SQUID reconfiguration -> Reconfigurate

Идем в браузер, прописываем настройки прокси и пробуем выйти в Интернет. Если всё настроено правильно, то должно появится окно авторизации, вводим логин и пароль ранее добавленного пользователя и выходим на бескрайние просторы Интернета.

Теперь, когда настроена авторизация по логину/паролю, можно без труда настроить авторизацию по IP адресу. Для этого нужно создать дополнительный шаблон и указать в нём тип авторизации «IP», затем добавляем новых пользователей указав в их профиле новый шаблон, а также IP адрес с которого должен работать пользователь, пароль указывать не нужно, но в браузере всё так же требуется прописать настройки прокси-сервера.

Решение разных проблем

Спустя некоторое время после использования SAMS выяснилось, что периодически падает демон samsf отвечающий за непрерывную обработку логов Squid. Оказалось, что разработчики более не поддерживают его и рекомендуется использовать опцию «Discret parser» SAMS -> SAMS administration -> SAMS settings. Периодичность я поставил 1 минуту. После этого всё нормализовалось.

Если при реконфигурировании SAMS новые пользователи не добавляются в ncsa.sams то можно попробовать убить процессы samsdaemon и samsf и запустить samsdaemon заново.

Другой частый вариант при первых запусках SAMS — не стартует squid или ругается на несуществующий процесс. В этом случае нужно в ручную создать файл /usr/local/etc/squid/ncsa.sams (даже если вы его создавали в начале установки, то при реконфигурировании SAMS он скорей всего был удален), затем в папке /usr/local/squid/logs удаляем файл squid.pid (иногда также помогает удаление |access.log) после этого лучше перезагрузиться.

Ещё один нюанс настройки SAMS — при перезапуске сервера SAMS норовит стартовать раньше MySQL, в результате чего он не может открыть нужные таблицы. Есть несколько способов это устранить, один из них дополнить в файле /usr/local/etc/rc.d/sams строчку:

# REQUIRE: LOGIN cleanvar

до

# REQUIRE: LOGIN cleanvar mysql

Другой вариант — убрать из /etc/rc.conf строчку sams_enable=”YES” и прописать в crontab строчку:

@reboot /usr/local/etc/rc.d/sams start
Перезагружаем сервер, смотрим работу SAMS, если всё нормально, то на этом настройку можно считать завершенной.

Следует иметь в виду, что в SAMS есть масса других подводных камней, которые могут проявиться при попытке настроить авторизацию по NTLM и т.д. Есть также вероятность, что в один не очень хороший день SAMS может упасть без видимой причины. В этих случаях я советую искать ответы на форуме http://www.permlug.org/forum/sams/ Многие подобные ситуации уже обсуждались и ответы были найдены, нужно лишь искать.

На всякий случай приведу примеры файлов конфигурации.

Пример файла /usr/local/etc/rc.d/sams

#!/bin/sh
# $FreeBSD: ports/www/sams/files/sams.sh.in,v 1.1 2006/12/29 20:18:35 miwi Exp $

# PROVIDE: sams
# REQUIRE: LOGIN cleanvar mysql — очень важно, без mysql не будет стартовать при загрузке ОС
# KEYWORD: shutdown

# Define these sams_* variables in one of these files:
# /etc/rc.conf
# /etc/rc.conf.local
# /etc/rc.conf.d/sams
#
# DO NOT CHANGE THESE DEFAULT VALUES HERE
#
sams_enable=${sams_enable-«NO»}
sams_flags=${sams_flags-«»}
sams_pidfile=${sams_pidfile-«/var/run/samsdaemon.pid»}

. /etc/rc.subr

name=»sams»
rcvar=`set_rcvar`
command=»/usr/local/bin/samsdaemon»

load_rc_config $name

pidfile=»${sams_pidfile}»

run_rc_command «$1»

Пример файла /usr/local/etc/squid/squid.conf:

auth_param basic program /usr/local/libexec/squid/ncsa_auth /usr/local/etc/squid/ncsa.sams

auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
acl _sams_4934254f2ae45 src «/usr/local/etc/squid/4934254f2ae45.sams»
acl _sams_4934254f2ae45_time time MTWHFAS 00:00-23:59
acl _sams_default proxy_auth «/usr/local/etc/squid/default.sams»
acl _sams_default_time time MTWHFAS 00:00-23:00
acl all src all
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
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
http_access allow _sams_4934254f2ae45 _sams_4934254f2ae45_time
http_access allow _sams_default _sams_default_time
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localnet
http_access deny all
icp_access allow localnet
icp_access deny all
http_port 3128
hierarchy_stoplist cgi-bin ?
access_log /usr/local/squid/logs/access.log squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
acl shoutcast rep_header X-HTTP09-First-Line ^ICY\s[0-9]
upgrade_http0.9 deny shoutcast
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
delay_pools 2
delay_class 1 2
delay_class 2 2
delay_access 1 allow _sams_4934254f2ae45
delay_access 1 deny all
delay_parameters 1 524288/524288 524288/524288
delay_access 2 allow _sams_default
delay_access 2 deny all
delay_parameters 2 64000/64000 64000/64000
coredump_dir /usr/local/squid/cache

ipfw + natd + tun0

Исходные данные: имеем сервер FreeBSD 6.3 с двумя сетевыми картами в одну подключен модем ADSL в режиме bridge, в другую локальную сеть
Задача: разрешить выход в интернет компьютерам локальной сети и дать возможность доступа по определенным портам из интернета на компьютеры в сети.

Для начала работы ipfw пересоберем ядро с нужными опциями:

# Включаем поддержку ipfw
options IPFIREWALL
# Включаем логирование пакетов,
# которые попадут под правило log
options IPFIREWALL_VERBOSE
# Ограничение размера журнального файла,
# на случай DDoS атаки
options IPFIREWALL_VERBOSE_LIMIT=100
# Пригодится, если понадобится воспользоваться
# возможностью перенаправления пакетов
# (например, при создании transparent proxy).
options IPFIREWALL_FORWARD
# Дайверт, для того, чтобы работал NAT, если
# нужно выпустить в Интернет локальную сеть
options IPDIVERT
# Эта опция пригодится, в случае задания
# шейпов для ограничения скорости.
options DUMMYNET

Файл с настройками для дозвона модема:

/etc/ppp/ppp.conf

default:
set device PPPoE:rl0:vtc
set speed sync
set mru 1492
set mtu 1492
set ctsrts off
set timeout 0
set redial 0 0

# Link Quality Request
enable lqr
set lqrperiod 5

vtc:
set authname login # наш логин
set authkey password # наш пароль
add default HISADDR

/etc/rc.conf

defaultrouter=»192.168.1.1″
hostname=»gorod.vera.local»
ifconfig_re0=»inet 10.10.38.100 netmask 255.255.255.0″
ifconfig_rl0=»inet 192.168.1.2 netmask 255.255.255.0″

gateway_enable=»YES»
natd_enable=»YES»
#NAT будет работать на внешнем интерфейсе модема
natd_interface=»tun0″
natd_flags=»-f /etc/natd.conf»

firewall_enable=»YES»
firewall_type=»/etc/rc.firewall»
#включаем логирование пакетов
firewall_logging=»YES»

#включаем дозвон модема
ppp_nat=»NO»
ppp_enable=»YES»
ppp_mode=»ddial»
ppp_profile=»vtc»

Файл с настройками ipfw (делаем его исполняемым — 754)

/etc/rc.firewall

#!/bin/sh —

fw=»/sbin/ipfw -q»

inif=»re0″
outif=»tun0″
inip=»10.10.38.100″
outip=»85.192.x.x»
innet=»10.10.38.0/24″

${fw} -f flush
${fw} add allow all from any to any via lo0
${fw} add deny log all from any to 127.0.0.0/8
${fw} add deny log all from 127.0.0.0/8 to any

${fw} add divert natd log all from ${innet} to any out via ${outif}
${fw} add divert natd log all from any to ${outip} in via ${outif}

${fw} add allow tcp from any to any via ${outif} established
${fw} add allow tcp from ${inip},${outip} to any out xmit ${outif} setup

${fw} add allow all from ${innet} to any out via ${inif}
${fw} add allow all from any to ${innet} in via ${inif}

##### Правила для UDP протокола ####
#
# — для сервера
# Разрешаем все исходящие UDP запросы с самого сервера
# Без этого не работают такие команды как traceroute
# Хотя, как вариант, можно обойтись и без этого если
# использовать traceroute -P icmp
${fw} add allow udp from ${outip} to any out via ${outif}
# Разрешаем входящие DNS запросы к нашему DNS серверу
# если конечно таковой испольуется на этой машине.
${fw} add allow udp from any to ${outip} 53 in via ${outif}
# Разрешаем ответы от DNS серверов на запросы
# от нашего хоста.
${fw} add allow udp from any 53 to ${outip} in via ${outif}
# Разрешаем ответы от серверов времени на запросы
# от нашего хоста
${fw} add allow udp from any 123 to ${outip} in via ${outif}
#
# — для локальной сети
# Разрешаем DNS запросы/ответы для всей сети
${fw} add allow udp from ${innet} to any 53
${fw} add allow udp from any 53 to ${innet}
# Разрешаем запросы/ответы к серверам времени для всей сети
${fw} add allow udp from ${innet} to any 123
${fw} add allow udp from any 123 to ${innet}

${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 all from any to any
${fw} add deny log all from any to any

При настройке сервера я долго не мог понять почему не работает данная связка. Ответ оказался простым — natd не стартовал на интерфейсе tun0 т.к. его еще нет при старте системы, а появляется он после того как модем дозвонился. Проверить включен ли нат можно командой:

# /etc/rc.d/natd status

Если работает, то ответ получаем примерно такой:

natd is running as pid 1175.

Если не работает, то запустить можно командой:

# /etc/rc.d/natd start

Решение данной проблемы может быть таким: прописываем задачу в cron чтобы natd стартовал при каждой загрузке компьютера принудительно.

# crontab -e

@reboot /etc/rc.d/natd start

Если нужно пробросить порты с внешнего интерфейса на компьютеры внутри сети, то редактируем файл /etc/natd.conf. К примеру нужно открыть доступ по 5000 порту на компьютер с IP 10.10.38.200. Для этого добавляем в файл строчку:

redirect_port tcp 10.10.38.200:5000 5000

На этом настройку можно считать законченной.

Статья на основе которой я  настраивал связку — http://live.daemony.org/freebsd/ipfw-natd-tun0.html

Установка webmin

Данная программа может оказаться полезной для новичков изучающих Unix системы.

Устанавливаем сам webmin:

# cd /usr/ports/sysutils/webmin
# make install clean

Для запуска webmin при старте системы сконфигурируем файл /etc/rc.conf добавив в него строчку:

webmin_enable=»YES»
Для конфигурирования webmin запустим скрипт:

# /usr/local/lib/webmin/setup.sh

Отвечаем на вопросы конфигуратора. Если предлагаемую настройку менять не нужно, то нажимаем Enter:

Web server port (default 10000): [Press Enter]
Login name (default admin): [Press Enter]
Login password: [наш пароль]
Password again:
Use SSL (y/n): y

Зайти в программу можно введя следущий адрес:

https://your-server-ip:10000

Авторизация на сервере FreeBSD по SSH ключам

Исходные данные: имеется сервер на базе FreeBSD, имеются клиентские машины с которых надо периодически заходить на этот сервер. В качестве SSH-клиента используется PuTTY.
Задача: избавить себя от постоянного ввода паролей вручную и проходить авторизацию с помощью специальных ключей.

Для подключения клиента требуется сгенерировать два ключа — закрытй и публичный. В клиенте PuTTY это делается утилитой puttygen.exe. В открывшемся окне меняем значение Number of bits in a generated key с 1024 на более сложное, например 2343. Нажимаем кнопку Generate и водим мышкой чтобы создать случайный код.

По завершении генерации станут активными две кнопки — Save public key и Save private key. Нажимаем на первую кнопку и сохраняем публичный ключ с названием, к примеру, rsa-pub. Второй ключ сохраним как rsa-private. При этом программа напомнит, что нужно ввести еще секретную фразу т.к. это увеличит безопасность, но мы откажемся т.к. задача соединяться не вводя пароли.

Теперь соединяемся с нашим сервером и заходим в домашнюю папку того пользователя под которым будем соединяться с сервером. Создаем там директорию .ssh

$ mkdir .ssh

Ставим на папку права 700

Копируем туда наш публичный ключ. И в этой же директории выполняем следующую команду:

# ssh-keygen -i -f rsa-pub > authorized_keys

Открываем PuTTY выбираем нашу запись для соединения с сервером, и добавляем в раздел Connection — SSH — Auth путь к нашему приватному ключу. Всё, теперь можно коннектиться. Если всё сделано правильно то мы попадем в директорию пользователя без запроса пароля.

Есть другой вариант переноса публичного ключа на сервер. Необходимо создать в директории .ssh файл authorized_keys

$ touch authorized_keys

Открыть для редактирования этот файл и скопировать туда наш публичный ключ. Ключ должен идти в одну строчку. Перед ключом должно быть написано ssh-rsa и поставлен пробел.

Пример:
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAZYQ69twq6e39+S6LxO62E37wtlGvVknomrTSdGD/QRTiNKwCI0WzFmOjvshFbzi+ARYRUcIQpxjO1nVfcO+RfJHCjX3vjgEeq1vxhag0PQs8mJLaddeCISpW37zpxYczDPTwEC7vVnzW9H1YcB1x42V9dL4JJzhbRUmHWEuNw1h+MM0eOnJLcUHZuHmxiP6M8y41UPenuVnAt2FaNWzxxMUjSKg6zCj3q07Td/ilrCvARs7/hFERG7pn6QN9At/EpTQvyn/aYDByPc4xUkeGTapzaMBYSrRIVpyYvDjJza3TAgIYejwLgV+gwlXMYKkvErsdm1hh+K4Ioe0zkbGzkaYUA+a7q3tzjY5taCDp/9LFjwhuMVcswnNAjLX+ct+sSIvZn/KnZjafcywjdmZc1Nhrl6b9AxnJ+h9PJ2BC73h90ZWvr5EASiXSgyI8A2y1ObVpLvoNIJu0DeKnIZnKarTbhXvQFAAeOzsxkTzb95ceX+llRUHqyOBpnB7D2DR8Im1tdVaQy9v9dZ329+Ogjg2BXKfL5Oh

Установка webalizer

Для того чтобы просматривать статистику на своём сайте я решил поставить на сервер webalizer — /usr/ports/www/webalizer. Поставил, заработало, но не показывало из каких стран заходили на сайт. В make я нашел упоминание о geolizer, который не установился вместе webalizer. Тогда я сделал так: обновил порты, и начал установку именно с geolizer. В конечном итоге всё заработало как надо, поэтому выкладываю последовательность действий. Идем в папку с geolizer и устанавливаем: # cd /usr/ports/www/geolizer # make install clean Установка должна потянуть за собой установку GeoIP. Если всё нормально, то приступаем к конфигурированию. Если выдается ошибка и ругается на webalizer то сначала придется удалить этот пакет (/usr/ports/www/webalizer, он был установлен мной ранее). Файл конфигурации располагается в /usr/local/etc

# cp /usr/local/etc/webalizer.conf-dist /usr/local/etc/webalizer.conf

Наиболее важные строчки конфигурации, без которых статистика не заработает: #Путь к логам апача LogFile /var/lib/httpd/logs/access_log #Путь к папке, куда будем складывать результат обработки статистики, с тем учетом, чтобы потом смотреть через браузер. #конечную папку нужно создать самому OutputDir /usr/local/www/data/webalizer #Эта строчка ставится в самом конце. Она нужна для того, чтобы видеть с IP каких стран заходили на сайт: GeoIP yes Конфигурация закончена. Для запуска статистики используем команду: # webalizer Смотреть статистику идем по адресу (учитывая внесенные в конфиг строчки) — http://yoursuite/webalizer/ Добавляем задачу в cron: */23 * * * * /usr/local/bin/webalizer Более подробно о настройках файла конфигурации webalizer.conf рассказано здесь — http://www.lissyara.su/?id=1182

Читать далее

Соединяем две сети через VPN IPSEC

Цель: подсоединить к локальной сети 6-го микрорайона свою домашнюю сеть из нескольких машин.
Исходные данные: в обоих сетях есть сервер с FreeBSD 6.2 имеющий две сетевых карты (одна смотрит в локалку, в другую подсоединен модем). Выход в Интернет осуществляется через ADSL модем, настроенный в режиме bridge.

Топология сети выглядит так:

1-ая сеть:

10.11.0.0/16
|
10.11.0.201
Сервер
85.192.х.х
|
|
Интернет
|
|
2-ая сеть
92.49.х.х
Сервер
10.10.38.50
|
10.10.0.0/16

Первоначально нужно пересобрать ядро с дополнительными опциями:
options IPSEC #IP security
options IPSEC_ESP #IP security (crypto; define w/ IPSEC)

device gif

Компилируем новое ядро, инсталлируем и перезагружаемся.

Теперь создаем туннель и добавляем маршрутизацию:

На шлюзе 1:

ifconfig gif0 create
ifconfig gif0 10.11.0.201 10.10.38.50
ifconfig gif0 tunnel 85.192.x.x 92.49.x.x
route add 10.10.0.0/16 10.10.38.50

На шлюзе 2:

ifconfig gif0 create
ifconfig gif0 10.10.38.50 10.11.0.201
ifconfig gif0 tunnel 92.49.x.x 85.192.x.x
route add 10.11.0.0/16 10.11.0.201

По сути, после этих команд между сетями уже есть связь. Т.е. можно из подсети 1 зайти на компьютеры в сети 2. Единственный нюанс на компьютерах во 2 сети должен быть прописан шлюз по умолчанию — 10.10.38.50 иначе достучаться до них будет нельзя. Как подсказали знающие люди — выходом из этой ситуации является установка SNAT на втором шлюзе, но это не входило в мои планы.

Теперь можно приступать к шифрованию трафика. Для этого установим из портов — security/ipsec-tools. По идее после установки должна была создаться папка /usr/local/etc/racoon/ с конфигурационными файлами, но этого не произошло. Не беда, создадим их вручную:

/usr/local/etc/racoon/racoon.conf

path include «/usr/local/etc/racoon» ;
path pre_shared_key «/usr/local/etc/racoon/psk.txt» ;
path certificate «/usr/local/etc/racoon/cert» ;

padding
{
maximum_length 20; # maximum padding length.
randomize off; # enable randomize length.
strict_check off; # enable strict check.
exclusive_tail off; # extract last one octet.
}

listen
{
isakmp 222.222.222.222 [500]; #IP компьютера где расположен данный файл
}

timer
{
counter 5; # maximum trying count to send.
interval 20 sec; # maximum interval to resend.
persend 1; # the number of packets per a send.
phase1 30 sec;
phase2 15 sec;
}

remote anonymous
{
exchange_mode aggressive,main,base;
doi ipsec_doi;
situation identity_only;
nonce_size 16;
lifetime time 24 hour; # sec,min,hour
initial_contact on;
proposal_check obey; # obey, strict or claim
proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method pre_shared_key ;
dh_group 2 ;
}
}

sainfo anonymous
{
pfs_group 1;
lifetime time 24 hour;
encryption_algorithm 3des ;
authentication_algorithm hmac_sha1;
compression_algorithm deflate ;
}
#End of racoon.conf

/usr/local/etc/racoon/psk.txt

#На шлюзе 1 (secret — пароль):

92.49.х.х secret

#На шлюзе 2 (secret — пароль):

85.192.х.х secret

Ставим права на эти файлы:

# chmod 600 *

Создаем файл /etc/ipsec.conf:

#На шлюзе 1 (85.192.х.х):

spdadd 85.192.х.х/32 92.49.х.х/32 ipencap -P out ipsec esp/tunnel/85.192.х.х-92.49.х.х/require;
spdadd 92.49.х.х/32 85.192.х.х/32 ipencap -P in ipsec esp/tunnel/92.49.х.х-85.192.х.х/require;

На шлюзе 2 (92.49.х.х):

spdadd 92.49.х.х/32 85.192.х.х/32 ipencap -P out ipsec esp/tunnel/92.49.х.х-85.192.х.х/require;
spdadd 85.192.х.х/32 92.49.х.х/32 ipencap -P in ipsec esp/tunnel/85.192.х.х-92.49.х.х/require;

Выполняем на обоих шлюзах команды:

# racoon

# setkey -f /etc/ipsec.conf

Проверка работы racoon на шлюзе 1:

# sockstat | grep raco

root racoon 4527 3 dgram -> /var/run/logpriv
root racoon 4527 6 udp4 85.192.х.х:500 *:*

Проверяем работу командой setkey -D на шлюзе 1. Если ничего не вывелось, значит, шифрование не настроено.

# setkey -D

85.192.х.х 92.49.х.х
esp mode=tunnel spi=165916838(0x09e3b0a6) reqid=0(0x00000000)
E: 3des-cbc aecfd117 0739d66d 3400f094 e9411901 aa33570b ce7c2130
A: hmac-sha1 d1bc9b8f aa0c0bdc 795c800a 8ff4bc1d b3bd87a5
seq=0x00000375 replay=4 flags=0x00000000 state=mature
created: Nov 13 15:41:53 2008 current: Nov 13 15:55:10 2008
diff: 797(s) hard: 86400(s) soft: 69120(s)
last: Nov 13 15:55:09 2008 hard: 0(s) soft: 0(s)
current: 141600(bytes) hard: 0(bytes) soft: 0(bytes)
allocated: 885 hard: 0 soft: 0
sadb_seq=1 pid=4585 refcnt=2
92.49.х.х 85.192.х.х
esp mode=tunnel spi=42651354(0x028aceda) reqid=0(0x00000000)
E: 3des-cbc 85fe3e51 1c251e7d 22c51fbd 52a9a31c 769758ac c3c69b03
A: hmac-sha1 d90dc2db 8f56a6f0 cdd9fc17 5acae5a4 8c043102
seq=0x0000036e replay=4 flags=0x00000000 state=mature
created: Nov 13 15:41:53 2008 current: Nov 13 15:55:10 2008
diff: 797(s) hard: 86400(s) soft: 69120(s)
last: Nov 13 15:55:09 2008 hard: 0(s) soft: 0(s)
current: 91312(bytes) hard: 0(bytes) soft: 0(bytes)
allocated: 878 hard: 0 soft: 0
sadb_seq=0 pid=4585 refcnt=1

Для пущей достоверности запускаем со шлюза 1 команду:

# ping 10.10.38.50

На втором шлюзе запускаем:

# tcpdump -i tun0 host 85.192.х.х

Если трафик шифруется, то увидим примерно такой вывод:

17:51:34.927576 IP 85-192-x-x.dsl.esoo.ru > 92.49.x.x: ESP(spi=0x0f6188d3,seq=0x12e), length 140
17:51:35.056984 IP 92.49.x.x > 85-192-x-x.dsl.esoo.ru: ESP(spi=0x0b7e205d,seq=0x126), length 140

Для того чтобы VPN поднимался автоматически при загрузке сервера нужно прописать в /etc/rc.conf следующие строчки:

Для шлюза 1:

gif_interfaces=»gif0″
gifconfig_gif0=»85.192.x.x 92.49.x.x»
ifconfig_gif0=»inet 10.11.0.201 10.10.38.50 netmask 0xffffffff»
static_routes=»vpn»
route_vpn=»-net 10.10.0.0/16 10.10.38.50″

ipsec_enable=»YES»
ipsec_file=»/etc/ipsec.conf»
racoon_enable=»YES»

Для шлюза 2:

gif_interfaces=»gif0″
gifconfig_gif0=»92.49.x.x 85.192.x.x»
ifconfig_gif0=»inet 10.10.38.50 10.11.0.201 netmask 0xffffffff»
static_routes=»vpn»
route_vpn=»-net 10.11.0.0/16 10.11.0.201″

ipsec_enable=»YES»
ipsec_file=»/etc/ipsec.conf»
racoon_enable=»YES»

К сожалению, как показала практика, racoon не захотел стартовать автоматически, поэтому в crontab на обоих шлюзах была добавлена новая сточка:

@reboot /usr/local/etc/rc.d/racoon start

После повторной перезагрузки всё завелось. Как видим настройка VPN не так уж сложна.

Ссылки на наиболее интересные материалы по данной теме:

Использование ресурса DynDNS.org, установка клиента ddclient

Для начала нужно рассказать для чего может понадобиться использование сервиса https://www.dyndns.com. Как правило провайдеры выдают своим клиентам динамические IP адреса, которые могут меняться при каждой новой сессии. Т.о. если мы размещаем на своем сервере какой-либо ресурс (к примеру веб-сервер), то чтобы попасть на него из интернета нам понадобится каждый раз вводить правильный IP адрес сервера действительный на тот момент. Это конечно же очень неудобно. Чтобы обойти эту трудность можно воспользоваться сервисом на сайте https://www.dyndns.com. Смысл данного ресурса в том, что после регистрации на нем своего аккаунта мы бесплатно получаем доменное имя третьего уровня, к примеру shestoi.dyndns.org. Далее на своем сервере мы устанавливаем клиент ddclient в котором прописываем настройки для shestoi.dyndns.org. Теперь клиент ddclient будет с определенной периодичностью посылать на https://www.dyndns.com нынешний IP нашего сервера. Т.о. по адресу http://shestoi.dyndns.org будет доступен наш сервер.

Следует также заметить, что современные модемы как правило обладают функцией поддержки DynDNS и можно прописать настройки непосредственно на нём, без установки клиента на сервер.

Теперь о самой установке и настройки клиента ddclient.

# cd /usr/ports/dns/ddclient
# make install clean

Затем копируем и правим конфиг

# cp /usr/local/etc/ddclient.conf.sample /usr/local/etc/ddclient.conf
# chmod 600 /usr/local/etc/ddclient.conf (для безопасности, т.к. там пароли)

Отредактируем настройки

# vi /usr/local/etc/ddclient.conf

# Эти строчки сразу закоментируем, чтобы не сыпался лишний спам
#mail=root # mail all msgs to root
#mail-failure=root # mail failed update msgs to root

# включим метод определения реального (белого) ip-адреса
use=web

login=login # логин к dyndns
password=password # пароль к dyndns

server=members.dyndns.org, \
protocol=dyndns2 \
shestoi.dyndns.org # Обращу внимание на эту строчку. Здесь мы прописываем тот адрес который соответствует нашему серверу. Дело в том, что зарегистрировав аккаунт на https://www.dyndns.com мы можем создавать на нем несколько адресов и раздавать их нужным серверам.

Добавляем строчку для автозапуска при старте сервера

# echo ‘ddclient_enable=”YES”‘ >> /etc/rc.conf

Запускаем клиент без перезагрузки сервера: Код:
# /usr/local/sbin/ddclient start

Ссылки по теме:

  1. http://ihtiandr.info/unix/1-unix/70-dynamic-dns-install-freebsd-how-to.html
  2. http://linuxopen.ru/2007/11/14/dyndns-ili-staticheskijj-sajjt-na.html

Если не получается в лоб…

Переустановил на домашнем сервере систему, теперь на нём крутится FreeBSD 7.1. При инсталяции нужных программ из портов столкнулся с проблемой невозможности скачать некоторые зависимости по причине недоступности серверов. К примеру не удавалось установить gettext-0.17. Странно конечно, что множество зеркал с этим портом было недоступно.
Решил эту проблему так: скачал архив этого пакета — gettext-0.17.tar.gz на ноутбук, затем скопировал его в папку пользователя user по SSH, а оттуда скопировал в нужную папку командой — cp gettext-0.17.tar.gz /usr/ports/distfiles/ После этого установка прошла как по маслу.

p.s. Можно внести упрощение в приведенную схему. Для этого сразу переходим в каталог — cd /usr/ports/distfiles/ Далеее скачиваем прямо туда нужный файл — wget http://www.sfr-fresh.com/unix/misc/gettext-0.17.tar.gz

Всё, добил статью по установке SAMS

Наконец-то довёл до ума работу SAMS на своей FreeBSD 6.3. Написал пошаговое руководство по установке SAMS из портов. Теперь осталось обкатать всё это на боевом сервере с целью выявления дополнительных проблем при эксплуатации.