Внимание!!! Форум глючный, поэтому НИКАКОГО КОПИПАСТИНГА! В текстах конфигов и прочих местах возможны артефакты в виде слэшей и прочей непотребщины, так что будьте бдительны!!!
Вместо предисловия
Если вы новичок в Linux, то могу предугадать какие ответы вы получите от сообщества, заяви вы что у вас что-то не работает:
1. Кривые руки
2. Кривое железо
3. Дистрибутив не тот
Эти три фразы покрывают 90% всех проблем с которыми пользователи сталкиваются при использовании Linux.
*с сайта stoplinux.org.ru*
Небольшое вступление :-)
Данные заметки не претендуют на звание какой-либо официальной документации и т.д. :-) Официальное руководство по установке и настройке имеется на сайте, более того – оно ОБЯЗАТЕЛЬНО к прочтению, а моя статья ни в коем случае не является его заменой или альтернативой, тем более что кое-где я буду даже на него ссылаться. Также разработчики заранее и неоднократно предупреждают что нормальная работа под другими, «не заявленными», дистрибутивами НЕ ГАРАНТИРОВАНА! Т.е. она не то чтобы невозможна, но и в то же время никто ничего не обещает - вот так вот хитро! :-) А «заявленных» дистрибутивов по сути всего два - это Fedora и Centos, естественно, я не говорю про коммерческие. Чем же чревато использование других дистрибутивов? Да элементарно хотя бы тем, что в случае кривой работы Траффпро разработчик вам вежливо скажет у вас «дистрибутив не тот» (одна из трёх отмазок линугсойдов на все случаи жизни!) и придётся самостоятельно бороться с глюками, либо же ставить «тот» дистрибутив. Ну а если проблема Ваша повторится и на «том» дистрибутиве - тогда уже это будут «кривые руки» %). Так что тут решать только Вам стоит ли вообще связываться с «не заявленным» дистрибутивом.
Зачем это надо было мне? Сложно сказать :-) Ну наверное прежде всего потому что сузя - это мой любимый дистрибутив, тут никакой религии, просто симпатии. Потом, я придерживаюсь мнения что нормальный, правильный продукт должен работать под любыми дистрибутивами без привязки к каким-то конкретным их особенностям (а ТраффПро ведь такой продукт, верно?) Да и если всё легко и сразу установится и заработает - тогда это будет уже не линугз, но ведь мы же не ищем лёгких путей, верно? :-)
Ну да ладно, с философией и религией закончили, теперь немного лирики. В данной заметке будет описана одна из самых распространенных примитивных конфигураций, если чего-то того, что Вам необходимо я не описал - значит я этого не реализовывал и соответственно как это делается я скорее всего не знаю. К примеру, pppd, vpn и прочее я не настраивал за ненадобностью. Также перед тем как обращаться ко мне с вопросами типа «у меня не работает траффпро под сузей, как быть?» убедительная просьба ещё раз внимательно перечитать предисловие - скорее всего в нем содержатся ответы на все Ваши вопросы :-)
Я описываю лишь то, что делал я. А мои действия ни в коем случае не являются единственно возможными правильными и безошибочными, особенно если учесть что мы заведомо работаем под «не заявленной» ОС. Но тем не менее оно у меня как-то работает и работает скорее стабильно, чем нет ;-)
Я не ставлю перед собой цель создать хауту для ленивых, которые думают что всё сделается само по себе, а они лишь закопипастят строчки и будут потом всем говорить что они ниипатса крутые линугсойды :-) Прежде всего - должно быть хотя бы какое-то _элементарное_ представление и понимание своих действий, а также умение читать и АНАЛИЗИРОВАТЬ логи! Обычно последнее - это залог самостоятельного решения 90% всех возможных проблем. Если всего этого нету, то тут одно из двух: либо читать и изучать (тут обычно линугсойды высокомерно отсылают в man и гугль), либо таки не мучить себя и окружающих и юзать win-решения, которые понятны любому дауну и настраиваются в два-три щелчка мыши. Но стоят денег - палка о двух концах, однако ;-)
Таким образом, в данной заметке я постараюсь лишь указать основные моменты, на которых стоит заострить внимание при установке под этим дистрибутивом. Пошаговых действий с разжевываниями (типа как открыть файл, отредактировать, сохранить и т.д.) не будет. Я в основном буду указывать лишь направление действий, а какие инструменты использовать - это личное дело каждого. Можно, например, настраивать всё это из «голой» консоли, даже не используя mc, а можно запустить «иксы» и делать всё под графикой - тут исключительно дело вкуса и религии. Как так? «Иксы» на сервере? Фи, да это ж моветон - скажут настоящие прожженые линугсойды. Тут не буду спорить или что-то советовать, скажу лишь что Траффпро успешно работает как с графикой на сервере, так и без неё.
И ещё раз: так устанавливал и настраивал систему лично я, но это не значит что необходимо повторять всё за мной в точности! ;-)
Исходные данные
Переходим наконец-то к техническим деталям :-) Примерная схема нашего окружения вполне типична: шлюз с двумя сетевыми интерфейсами, интернет приходит по обычному Ethernet и никаких дополнительных соединений (PPoE, VPN и т.д.) не поднимается. Один интерфейс смотрит в Интернет, другой - в локальную сеть. В локальной сети (адресация 192.168.0.0/24) находятся собственно клиенты Интернета и почтовый сервер (его ip 192.168.0.220), принимающий почту из внешнего мира и туда же её отправляющий. Все внешние адреса в примере вымышленные :-) Аутентификация клиентов происходит по связке ip+mac. AD, dhcp и прочие клиенты отсутствуют.
Реквизиты, которые дал нам провайдер:
ip 12.34.56.78
mask 255.255.255.252
gateway 12.34.56.77
ns1 23.45.67.89
ns2 98.76.54.32
Все внешние адреса в примере вымышленные. Для удобства пользования моим руководством, а также чтобы не возникало проблем типа «я прописал всё 100% как там, а оно не работает», рекомендую скопировать весь текст в редактор и произвести там сквозную замену этих данных на свои, актуальные. :-)
IP-адрес шлюза в локальной сети 192.168.0.1
Аппаратная конфигурация моего «сервера» :-)
E2180 - это какой-то самый дохлый DualCore, лучшее из того что попало под руку на момент установки :-)
1024Mb RAM
250Gb HDD
На 40-50 юзеров работает без нареканий, но я думаю это далеко не предел его возможностей. Это я к тому что можно смело подымать и на куда более худшем гуане :-)
Подготовка и установка
Итак, начнём с установки системы. OpenSuse 11.1 х64, установка с DVD-носителя на чистый диск.
При разметке диска отдельный большой раздел я смонтировал на /var. Под / (корневой раздел) у меня выделено порядка 15-20гб при объёме жесткого диска в 250гб. Своп в два раза больше объёма физически установленной памяти, ну и остальное на /var. Зачем? Потому что именно там по умолчанию будут лежать базы mysql, самая «тяжёлая» составляющая.
При выборе пакетов на этапе установки ОС я намеренно не ставил apache, php, mysql, squid, named и т.д. Это можно сделать позже из онлайн-репозитариев, где доступны самые свежие версии. Про squid тема вообще отдельная, но об этом будет позже.
Также я бы посоветовал не ставить ничего лишнего, только самое необходимое. Не стоит засорять систему всяким мусором типа вебминов и прочих гуёвых и веб конфигураторов. Дабы потом не искать причины возникающих проблем, которые могут оказаться до банальности простые. Всего лишь потому что «я вот там вот ткнул эту галку, зачем - не помню» :-)
Настройки сети
Их можно произвести как на этапе установки, так и позже любыми доступными способами - это не критично. В моём случае это было сделано так:
NetworkManager отключен, брэндмауэр отключен, IPv6 отключен Ну и параметры интерфейсов:
eth0 - внешний, ip 12.34.56.78/30 (т.е. с маской 255.255.255.252)
eth1 - внутренний, ip 192.168.0.1/24 (маска 255.255.255.0)
Также здесь необходимо указать шлюз провайдера (в моём примере 12.34.56.77), ну и хотя бы один провайдерский DNS, пока у нас ещё не сконфигурирован свой named (в моём примере - 23.45.67.89).
Установка необходимых сервисов
После установки системы подключаем следующие репозитарии сообщества:
Основной репозитарий (OSS) - нужен чтобы поставить iptables-devel
OpenSuse BuildService: Базы данных - отсюда мы возьмём последнюю версию mysql
OpenSuse BuildService: PHP - а отсюда последний PHP5
Updates for 11.1 - обновления
Ну и потом, когда все репы подключены, устанавливаем apache2, apache2-mod_php5, php5, php5-mysql, libmysqlclient15, mysql-client, mysql-tools, named, squid и т.д.
И конечно же -devel и -source пакеты, если будем сами собирать демонов - это libmysqlclient-devel, iptables-devel, kernel-source и linux-kernel-headers. Некоторых из перечисленных пакетов на установочном DVD я не нашёл. По поводу сборки - лично я собирал, а не использовал уже собранные, поэтому мне эти пакеты таки понадобились.
Все работы с репозитариями и установкой пакетов лично я выполнял через центр управления Yast, что на мой взгляд является самым удобным вариантом, даже при работе в текстовом режиме без графики. Ведь при наличии нескольких подключенных репозитариев (как в моём случае) он автоматически определяет в каком из них есть последняя версия нужного пакета и предлагает по умолчанию ставить именно оттуда.
Веб-сервер Apache
С пакетами закончено, теперь проведём лёгкий тюнинг Apache :-)
Внесём небольшие изменения в /etc/apache2/default_server.conf:
Тут надо в теге <Directory> для /srv/www заменить Options None на Options FollowSymLinks (иначе не будет работать веб-морда!)
Тюнинг MySQL
В принципе, mysql можно и не трогать - работать будет и так. Однако в целях оптимизации производительности, а также удобства зачистки базы, лучше его немного «подпилить». Для этого открываем файлик /etc/my.cnf и смотрим что у нас там в секции mysqld. Вот выдержка из моего файла:
[mysqld]
port = 3306
socket = /var/lib/mysql/mysql.sock
skip-locking
key_buffer = 256M
max_allowed_packet = 16M
table_cache = 2048
sort_buffer_size = 64M
net_buffer_length = 16K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
default-character-set = utf8
record_buffer = 256M
max_connect_errors = 100
connect_timeout = 300
innodb_file_per_table
innodb_buffer_pool_size = 512M
Тут, если сравнивать с дефолтными настройками, увеличены различные буфера, выставлена кодировка по умолчанию в utf-8 и т.д. Однако особое внимание следует обратить на последние два параметра.
innodb_file_per_table - непременно необходимо указать чтобы не получить через какое-то время один огромный файл с неуменьшающимся размером. Это в случае чего заметно облегчит высвобождение места на диске в дальнейшем.
innodb_buffer_pool_size - значение этого параметра рекомендуется выставлять в размере 50-80% от объёма физической памяти. В моём случае он равен 512Мб, т.е. половина от 1Гб.
Ну и в завершении стартуем сервис:
# service mysql start
<при первом запуске он что-то там создаёт, мусор поскипан>
Starting service MySQL done
Если сервис не поднялся (вывод последней строки отличен от вышеприведенного), разбираемся почему, чиним и идём дальше.
Установка ТраффПро.
Считаем что сервис MySQL в предыдущем пункте мы успешно подняли, однако это не помешает лишний раз проверить.
# service mysql status
Checking for service MySQL: running
Всё отлично, запускаем установку ТраффПро из shell-скрипта.
Тут предстоит ответить на ряд вопросов:
Select language (just type the name of preferred language):
russian
Запустить установку в графическом режиме? [y/n]
n
Выберите свой Linux дистрибутив:
2 - SUSE
Собрать демон контроля (y) или использовать уже собранный (n)?
y
На этом этапе в процессе сборки на экран будут вывалены тонны непотребного мусора, на который не следует обращать никакого внимания. Главное чтобы завершилось всё это как-то так:
Finished building target: billing
Если здесь вылезли какие-то ошибки - доставляем недостающие компоненты, перезапускаем установку (здесь продолжать её уже нет смысла!) и идём дальше
Продолжить установку? [y/n]
y
Собрать демон маршрутизации (y) или использовать уже собранный (n)?
y
Тут сборка полностью аналогична предыдущей, в конце в случае успеха должны получить:
Finished building target: routerd
Продолжить установку? [y/n]
y
Сохранить предыдущие настройки TraffPro? [y/n] (/var/traffpro_back)
n – поскольку мы ставим систему «с нуля», то сохранять как бы и нечего
Обновляем систему (y) или устанавливаем (n)?
n – поскольку у нас новая установка
Настроить систему сейчас (y) или оставить настройки по-умолчанию (n)?
n
Настроить систему, кстати, можно и сейчас - это дело вкуса: либо ответить на несколько вопросов здесь и получить готовый конфиг согласно своему окружению, либо отказаться и подправить потом вручную дефолтный конфиг.
Но в любом случае стоит заглянуть в официальную документацию, где подробно описаны все параметры файла конфигурации.
Дальше интересный момент с базой, если она вдруг по каким-то непонятным причинам не создастся (а у меня такое вроде было), то это лечится повторным запуском установки - так, для справки, на всякий случай.
End Install or Update DATABASE!
Продолжить установку? [y/n]
y
Добавить администратора в базу данных? [y/n]
y
Добавление админа в базу MySQL: admin
Продолжить установку? [y/n]
y
chmod: cannot access `/opt/traffpro/billing-daemon/bin/tp-router\': No such file or directory
это непонятная ошибка, но вроде всё работает :-)
Запускать TraffPro при загрузке системы? [y/n]
y
Тут очень интересный момент. Дело в том, что в сузе по умолчанию в скриптах запуска должны присутствовать некие теги, в которых содержится информация о сервисе, такая как его название, описание, зависимости от других сервисов итд. Поскольку мы работаем под «не заявленной» ОС, то и получаем тут (да и в дальнейшем теперь при каждом вызове chkconfig) какую-то матерную непотребщину типа:
insserv: warning: script \'traffpro\' missing LSB tags and overrides
insserv: Default-Start undefined, assuming default start runlevel(s) for script `traffpro\'
insserv: warning: script \'tp-router\' missing LSB tags and overrides
insserv: Default-Start undefined, assuming default start runlevel(s) for script `tp-router\'
traffpro 0:off 1:off 2:off 3:on 4:off 5:on 6:off
insserv: warning: script \'K01traffpro\' missing LSB tags and overrides
insserv: warning: script \'tp-router\' missing LSB tags and overrides
insserv: Default-Start undefined, assuming default start runlevel(s) for script `tp-router\'
insserv: warning: script \'traffpro\' missing LSB tags and overrides
tp-router 0:off 1:off 2:off 3:on 4:off 5:on 6:off
Это не критично, на работоспособность не влияет и лечится путём добавления в скрипты запуска соответствующих недостающих строчек, но об этом позже.
Запустить TraffPro прямо сейчас? [y/n]
n – не будем пока этого делать, проверим ещё раз что у нас в конфигах
Теперь, как и обещал, привожу конфиги траффпро, необходимые для работы:
traffpro.cfg
to_install_dir=/opt/traffpro
daemon=true
db_url=localhost
db_usr=root
db_passwd=
db_name=traffpro
time_in=20
time_out=240
control_eth_addr=true
net_number=0
ports_detail=true
ss_enabled=true
eth_out=eth0
url_detail=true
out_ip=12.34.56.78
listen_addr=127.0.0.1
listen_port=9999
ip_queue_maxlen=2048
squid_connect=false
timer=false
Здесь сразу в глаза бросается то, что с базой mysql система работает от root и пароль у него пустой. Как показала практика последней установки – это лучше оставить именно так, как предлагают по умолчанию. Да, это не правильно, да, это не безопасно, но геммороя с работой от другого юзера будет гораздо больше. Последний раз пытался дать юзеру права на базу - так и не понял чего ему надо, но GRANT ALL PRIVILEGES WITH GRANT OPTION, с которым работают практически все приложения, явно не даёт достаточных полномочий и демон от такого юзера с базой не работает. Если есть желание - потом на досуге можно поиграться с этим и сообщить мне о результатах в случае успеха, пока же оставим как есть. Но это всё при условии опять же что пароль root для mysql у нас пустой (т.е. по умолчанию и его никто не менял), в противном случае тут надо указать пароль.
traffpro_rule.cfg
# всегда доступный ssh
iptables -A INPUT -m tcp -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -m tcp -p tcp --sport 22 -j ACCEPT
# заворот на сквид
iptables -t mangle -A PREROUTING -p tcp --dport 80 -d 192.168.0.0/255.255.255.0 -j ACCEPT
iptables -t mangle -A PREROUTING -s 192.168.0.0/255.255.255.0 -p tcp --dport 80 -j QUEUE
iptables -t mangle -A PREROUTING -s 192.168.0.0/255.255.255.0 -p tcp --dport 3128 -j QUEUE
iptables -t nat -A PREROUTING -m tcp -p tcp -s 192.168.0.0/255.255.255.0 -d !
192.168.0.0/255.255.255.0 --dport 80 -j REDIRECT --to-ports 3128
iptables -A INPUT -s 192.168.0.0/255.255.255.0 -m tcp -p tcp --dport 3128 -j ACCEPT
iptables -A OUTPUT -p tcp -d 192.168.0.0/255.255.255.0 --sport 3128 -j QUEUE
# проброс портов для почтового сервера
# smtp
iptables -t nat -A PREROUTING -p tcp -s any/0 -d 12.34.56.78 --dport 25 -j DNAT --to-destination 192.168.0.220:25
iptables -A FORWARD -i eth0 -d 192.168.0.220 -p tcp --dport 25 -j QUEUE
# pop3s
iptables -t nat -A PREROUTING -p tcp -s any/0 -d 12.34.56.78 --dport 995 -j DNAT --to-destination 192.168.0.220:995
iptables -A FORWARD -i eth0 -d 192.168.0.220 -p tcp --dport 995 -j QUEUE
# imaps
iptables -t nat -A PREROUTING -p tcp -s any/0 -d 12.34.56.78 --dport 993 -j DNAT --to-destination 192.168.0.220:993
iptables -A FORWARD -i eth0 -d 192.168.0.220 -p tcp --dport 993 -j QUEUE
# smtps
iptables -t nat -A PREROUTING -p tcp -s any/0 -d 12.34.56.78 --dport 465 -j DNAT --to-destination 192.168.0.220:465
iptables -A FORWARD -i eth0 -d 192.168.0.220 -p tcp --dport 465 -j QUEUE
# загрузка модулей для поддержки ftp
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
Будем считать что сама система ТраффПро у нас установлена и настроена.
Работа Traffpro со Squid.
Как и обещал, отмечу эту тему особо. Ибо в различных вариациях и комбинациях параметров поведение системы может быть самым разным и зачастую непредсказуемым :-) Можно, скажем, настроить так чтобы в отчётах учитывался только трафик, идущий через сквид, а весь остальной по прочим портам банально игнорировался. Вам такой вариант учёта нужен? :-) Лично мне не особо он приглянулся. Или, например, можно сделать так чтобы демон постоянно падал в связке со сквид – тоже малопривлекательная тема :-). Но тем не менее, в результате многочисленных экспериментов, заставить его работать как надо мне всё же удалось.
По поводу версии - тут пожалуй снова вопрос религиозно-философский. По большому счёту нет разницы какой сквид мы будем использовать - 2.хх или 3.0. Работают и тот, и этот, моменты их настройки тоже идентичны, так что особой разницы какую версию использовать нет. У меня вот разве что возникла мысль о преимуществах 3.0, если прикрутить к нему проверку всего проходящего трафика на вирусы (например с использованием clamav), благо дело это там вроде как доступно чуть ли не «из коробки», но пока я это не реализовал, соответственно как оно будет работать, насколько увеличит нагрузку на сервер и т.д. я сказать не могу. Пока это лишь на уровне идеи, над которой есть смысл подумать. :-)
Так вот собственно о самой настройке. В дефолтном конфиге надо проверить и поменять в случае необходимости ряд параметров. Отмечу сразу что в нашей конфигурации сквид работает самостоятельно, т.е. независимо от траффпро. Следовательно к нему можно прикручивать всё что угодно: различные сторонние парсеры логов, «режики» и т.д. Единственное условие – это не отключать прозрачный прокси.
Прежде всего:
http_port 192.168.0.1:3128 transparent
Тут мы указываем где у нас будет слушать сквид, по какому адресу и на каком порту, а также включаем прозрачное проксирование.
Далее надо обратить внимание на acl’ы. В моем примере имеет место быть блокировка некоторых нежелательных сайтов и запрет на загрузку некоторых типов файлов по расширению. Также присутствуют пользователи, которым открыт полный доступ без ограничений.
Итак, для начала добавим следующие списки acl:
acl blockurl url_regex -i \"/etc/squid/blocked\"
acl blockfiles urlpath_regex \"/etc/squid/blocked.files\"
acl anonymizers url_regex -i \"/etc/squid/anonymizers\"
Затем создадим acl, в котором перечислим ip-адреса клиентов, которым мы хотим открыть полный доступ без ограничений:
acl no_limit src 192.168.0.3 192.168.0.4 192.168.0.5
Укажем весь диапазон адресов нашей локальной сети отдельным acl:
acl localnet src 192.168.0.0/24
также я рекомендую закоментировать в дефолтном конфиге все остальные acl localnet
Ну и теперь разруливаем уровни доступа (последовательность http_access важна!)
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow no_limit
http_access deny blockurl
http_access deny anonymizers
http_access deny blockfiles
http_access allow localnet
http_access allow localhost
http_access deny all
Все остальные настройки сквида я не трогал, они остались по умолчанию.
С конфигом вроде всё, теперь создадим в /etc/squid собственно сами файлы с условиями для блокировок.
blocked.files:
\\.[Aa][Vv][Ii]$
\\.[Mm][Pp][Gg]$
\\.[Mm][Pp][Ee][Gg]$
\\.[Mm][Pp]3$