Установка Интернет-сервера на Debian

Установка Интернет-сервера на Debian
Эта пошаговая инструкция по установке интернет сервера написана для Debian 3.1 Sarge и Debian 4 Etch и Debian 5 Lenny разных сборок, по аналогии
и на базе инструкции «Установка интернет-сервера на Alt Linux».
Официальная инструкция по установке находится на www.debian.org/releases/stable/i386/
Имеем:
— сеть с тремя подсетями:10.0.0.0/24, 10.0.10.0/24, 10.0.20.0/24.
— выход во внешний мир (есть спул адресов 192.168.100.16/28, т.е. у нас 14 внешних адресов).
— компьютер с двумя сетевыми картами.
Хотим: получить полностью функциональный Интернет-сервер со следующими возможностями:
Функция ПО, описание
1. Маршрутизатор между нашими
сетями и внешним миром route
2 Брандмауэр (файрвол) iptables
3 DNS сервер Bind (named) со своей зоной teo.mynetwork.ru
4 FTP сервер vsftpd
5 Прокси сервер
Squid
+ квотирование трафика на день (любой период) и отчёт по
использованию. Настраивать будем по статье Квотирование доступа в
Интернет через Squid
6 Web сервер Apache + php4 + ssl + mysql
7 СУБД MySQL
8 Почтовый сервер
(приём почты)
Postfix — smtp сервер.
+ виртуальный домен
+ MySQL — база данный пользователей
+ Postfix Admin — управление ящиками
+ TLS — шифрация трафика
+ ClamAV — проверка почты на вирусы
9 Почтовый сервер
(отдача почты) + Courier — pop3, imap сервер
10 Введение в «боевой» режим
Отступление
1) Начиная с версии 1.02 этого документа, инструкция по настройке квотирования доступа в Интернет вынесена в отдельный документ.
2) При настройке всего сервера, из исходников собирать ничего не будем, что даёт нам возможность в будущем без опасений обновлять нашу ОС
целиком командой:
# apt-get dist-upgrade
3) Обычно я настраиваю сервер в тестовом режиме с временными ip адресами, а потом перевожу в «боевой» режим. Список изменений, которые
нужно будет внести в конфигурацию сервера приведён в конце инструкции.
Шаг 1. установка ОС, настройка маршрутов
— Прежде чем устанавливать можно ознакомиться с дополнительной иформацией используя функциональные клавиши F1 — F10. Это будет просто
необходимо, если вдруг Debian не захочет устанавливаться с установками по умолчанию. Мы будем использовать ядро 2.6. В Debian 4 оно будет
установлено по умолчанию, а в Debian 3.x инсталятор запустим командой:
boot: linux26
Для установки в графическом режиме нужно запустить инсталятор командой:
boot: installgui
Если на каком-то этапе установки инсталятор выдаст ошибку о невозможности выполнить такой-то шаг, то это ещё не значит, что дальше установка
невозможна. Нажмите продолжить и появиться меню установки, вернувшись на один или несколько пунктов назад можно будет повторить настройку в
более подробном виде.
1) Язык: Русский; Регион: Россия; Раскладка клавиатуры: Русская
2) Основным сетевым интерфейсом выбираем тот, который будет смотреть в Интернет. Через него во время установки будут закачены обновления
безопасности. У нас eth0 будет смотреть в локальную сеть, а eth1 во внешнюю. Таким образом, основной интерфейс eth1. Мастер настройки в Debian 4
Etch настроит только основной интерфейс, а в Sarge предложит настроить все.
eth1:
IP-адрес: 192.168.100.18
Маска сети: 255.255.255.240
Шлюз: 192.168.100.17
eth0:
IP-адрес: 10.0.0.2
Маска сети: 255.255.255.0
Шлюз: [не указываем, т.к. этот интерфейс смотрит в локальную сеть]
Адреса серверов имён: 10.0.0.85 217.116.158.3 [первый DNS-сервер локальной сети, второй — внешней, но это не принципиально]
(Чтобы изменить эти настройки после установки см. статью «Решение проблем в Linux»)
3) Имя компьютера: teo
Имя домена: mynetwork.ru
4) Разбиение жесткого диска. На ваш выбор, в зависимости от планируемых задач. Мы сделаем простую разбивку из расчёта, что у нас жёсткий диск
более 20Гб. Позволим Debian разбить диск, выбрав пункт «Использовать самое большое непрерывное свободное место», затем «Все файлы в одном
разделе». Если на диске уже были установлены другие ОС в своих разделах, то Debian займёт неразмеченное место на диске, разбив его на 2 раздела:
для подкачки (swap) и для всего остального (с точкой монтирования / и файловой системой ext3)
Вариант с программным (софтовым) RAID1 — зеркалирование:
Пусть у нас есть 2 жёстких диска по 80Гб — sda, sdb
1. Каждый диск разабьём на 3 раздела:
300Мб — загрузочный. Включаем метку «загрузочный»
2,4Гб — подкачка
77,3Гб — для данных
2. Добавить каждый раздел в Linux RAID. В меню появляется пункт «Настройка програмного RAID»
3. Записать данные на диск
4. Создать по очереди 3 MD устройства (multidisk), создав таким образом зеркало для каждого раздела.
4.1. Тип MD: RAID1
4.2. Число активных разделов: 1, резервных: 1
4.3. Выбор активных разделов: /dev/sda1 ( /dev/sda2, /dev/sda3 )
4.4. Выбор резервных разделов: /dev/sdb1 ( /dev/sdb2, /dev/sdb3 )
4.5. Повторить 4.1-4.4 для оставшихся двух разделов.
5. Настраиваем разделы. Чтобы в будущем можно было легко изменять размер нашего основного раздела, используем LVM:
RAID1 устройство #0 296 Mb — ext3, точка монтирования — /boot
RAID1 устройство #1 2.4 Gb — Использовать как раздел подкачки
RAID1 устройство #2 77.3 Gb — Физический том для LVM
6. В меню появляется пункт «Настройка менеджера логических томов (LVM)»
6.1. Создать группу томов. Название group_store
6.2. Устройство для новой группы: /dev/md2
6.3. Создать логический том. Выбрать группу group_store
6.4. Название логического тома store1
6.5. Размер максимальный
7. Настраиваем созданный LVM. Использовать как ext3, точка монтирования — /
8. lilo на md0 (dev/md/0)
5) На этом этапе Debian 3.х попросится в перезагрузку, а Debian 4 и 5 сразу перейдёт к следующему шагу.
6) Выбираем часовой пояс
7) Задаём пароль административного пользователя root. Создаём обычного пользователя (у меня это pavel).
8) Для Debian 3.x указываем метод доступа к архиву для программы apt: компакт-диск. Debian полее поздних версий уже добавит установчный CD в
репозиторий apt. По очереди вставляем все имеющиеся у нас диски из дистрибутива, чтобы apt знала что у нас есть.
9) На этом этапе будет установлена базовая система, и будет предложено подключить зеркало репозитория из сети, если такого нет — отказываемся.
Если нет доступа в Интернет, то получим предупреждение «Нет доступа к обновлениям безопасности» — подтверждаем, что видели это предупреждение.
Этот шаг может длиться очень долго.
10) Выбор программного обеспечения. Помечаем «Веб-сервер», «Сервер имён», «Почтовый сервер» или что нужно по выбору. Остальные пакеты
доустановим сами уже после установки ОС. Чтобы сразу выбрать нужные пакеты, можно вернуться на шаг назад, т.к. при возвращении установщик
предлагает нам более подробный вариант установки ПО.
11) Перезагружаем компьютер
— После перезагрузки заходим пользователем root. Для Debian 4 добавим интерфейс eth0. Добавляем маршруты между нашими подсетями, где 10.0.0.1
маршрутизатор между локальными подсетями. Эти маршруты будут автоматически добавляться и убираться в зависимости от подключения или
отключения интерфейса. Также можно добавить уведомление об этих событиях в журнал /var/log/messages. Это нам обеспечат последние две
строки в описаниях каждого интерфейса:
auto lo eth0 eth1
iface lo inet loopback
iface eth0 inet static
address 10.0.0.2
netmask 255.255.255.0
broadcast 255.255.255.255
up route add -net 10.0.10.0 netmask 255.255.255.0 gw 10.0.0.1 dev $IFACE
up route add -net 10.0.20.0 netmask 255.255.255.0 gw 10.0.0.1 dev $IFACE
up echo Interface $IFACE going up | /usr/bin/logger -t ifup
down echo Interface $IFACE going down | /usr/bin/logger -t ifdown
iface eth1 inet static
address 192.168.100.18
netmask 255.255.255.240
broadcast 217.116.144.31
gateway 192.168.100.17
up echo Interface $IFACE going up | /usr/bin/logger -t ifup
down echo Interface $IFACE going down | /usr/bin/logger -t ifdown
В качестве альтернативы можно управлять статическими маршрутами, добавляя команды в /etc/network/if-up.d и /etc/network/ifdown.
d, также в эти каталоги можно добавить любые командные файлы по управлению ПО, зависящего от интерфейсов, например vpn.
— Проверяем работоспособность сетевых настроек. Для этого пингуем адреса из сети локальной, внешней, и проверяем внешний DNS сервер пингуя
какой-нибудь узел по имени (само сабой мы должны быть 100% уверены, что все эти ресурсы сейчас доступны):
# ping 10.0.0.35
PING 10.0.0.35 (10.0.0.35) 56(84) bytes of data.
64 bytes from 10.0.0.35: icmp_seq=1 ttl=128 time=0.171 ms
# ping 213.180.204.8
PING 213.180.204.8 (213.180.204.8) 56(84) bytes of data.
64 bytes from 213.180.204.8: icmp_seq=1 ttl=57 time=63.6 ms
# ping ya.ru
PING ya.ru (213.180.204.8) 56(84) bytes of data.
64 bytes from ya.ru (213.180.204.8): icmp_seq=1 ttl=57 time=78.4 ms
Если пинги не проходят, то, может быть, проблема с сетевой картой.
Например, 3Com 3C905-TX не единожды себя компрометировала тем, что вроде бы работает и даже пингует сама себя, но в сеть через неё выходить не
удавалось.
добавляем имеющиеся компакт диски в репозиторий:
# apt-cdrom add
— Доустанавливаем пакеты:
# apt-get install mc ssh tcpdump gcc-4.1
— Обновляем установленную ОС через Интернет (не обязательно, но желательно).
# apt-get update
# apt-get dist-upgrade
Если нет прямого доступа в интернет, то можно обновиться через прокси сервер, экспортировав соответсвующую переменную для apt-get:
# export http_proxy=http://10.0.0.254:3128
— Теперь можно заходить на сервер с рабочего места администратора по протоколу ssh, если из Windows, то можно использовать PuTTY (см статью
«Терминальное подключение к серверу Linux с помощью ключей ssh без паролей»). Подключаемся пользователем pavel и меняем пользователя на
root:
$ su —
!!! Не забываем создавать резервные копии всех оригинальных конфигурационных файлов (напр. переименовывая в *.old) !!!
!!! Все пакеты, которые собираем из исходников, собираем в домашнем каталоге, у меня /home/pavel/app/ !!!
Шаг 2. настройка firewall (брендмауэр). iptables
— Включаем iptables при загрузке системы. Для этого добавляем его последней строчкой в /etc/modules:
ide-cd
ide-disk
ide-generic
psmouse
sd_mod
iptables
— Делаем из компьютера маршрутизатор. Раньше для этого нужно было указать в файле /etc/network/options:
ip_forward=yes
В Debian 5 отказались от использования этого файла, поэтому я сделал по старинке универсальным способом — изменил в
/proc/sys/net/ipv4/ip_forward 0 на 1:
# echo 1 > /proc/sys/net/ipv4/ip_forward
— На этом можно закончить шаг 2 и приступить к шагу 3, а можно дать доступ к Интернету для наших пользователей в локальной сети. Для этого
добавим правило прямого доступа (без прокси сервера) к Интернет для адреса 10.0.0.244
# iptables -t nat -A POSTROUTING -s 10.0.0.244 -o eth1 -j SNAT —to 192.168.100.18
или для всей подсети
# iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth1 -j MASQUERADE
— Проверяем добавленную запись
# iptables -t nat -L
— Если ошиблись, то удаляем, изменяем и прописываем заново
# iptables -t nat -D POSTROUTING 1
где 1 это номер правила по порядку, или удаляем все правила из таблицы POSTROUTING
# iptables -t nat -F POSTROUTING
— В целях отладки можно добавить правило на пропуск пингов от клиентов во внешний мир
# iptables -t nat -A POSTROUTING -o eth1 -p icmp -j SNAT —to-source 192.168.100.18
— Запомнить конфигурацию файрвола можно командой iptables-save, восстановить iptables-restore, хранится она в
/etc/sysconfig/iptables.
— После установки прокси-сервера нужно не забыть добавленные правила убрать, иначе останется возможность попадать в Интернет в обход прокси.
Шаг 3 . настройка DNS. Bind
На этом шаге мы будем поднимать свой DNS сервер, если этого не требуется и достаточно внешнего, то этот шаг можно пропустить. Однако, если у нас
не будет своего DNS, то нужно будет просить кого-нибудь (напр. провайдера) разместить у себя нашу зону teo.mynetwork.ru
Для Debian 4 потребуется установленный пакет resolvconf.
— Добавляем DNS серверы. Для Debian 3.x в /etc/resolv.conf, для Debian 4 в /etc/resolvconf/resolv.conf.d/base:
search mynetwork.ru
nameserver 127.0.0.1
nameserver 217.116.158.3
nameserver 10.0.0.85
— В Debian bind не чрутится, поэтому все пути задаём относительно корня системы, т.е. «/». В /etc/bind/named.conf.options добавляем
следующие изменения:
1) Создаём группу SVOY, чтобы к внутренней DNS зоне (local.net) имели доступ только пользователи нашей сети.
2) Журналы named очень плодовиты, поэтому будем писать их в отдельные файлы, при этом журнал безопастности будем вести отдельно. Для этого
определяем два канала: по умолчанию и по безопасности. Нам хватит 4 файла для каждого журнала, и следующий будет заполняться, когда текущий
достигнет 100 Kb. Если всё же хочется видеть записи в системном журнале, то уменьшить объём можно убрав определённые категории сообщений,
определив параметр logging, например, так:
logging { category lame-servers { null; }; };
3) Перечисляем DNS сервера:
10.0.0.85 в нашей сети и обслуживает только локальную сеть, находится на Windows сервере;
217.116.129.9 и 217.116.158.3 — внешние DNS серверы.
После этих добавлений /etc/bind/named.conf.options будет выглядеть следующим образом:
options {
directory «/var/cache/bind»;
auth-nxdomain no; # conform to RFC1035
};
acl all { any;};
acl SVOY {
192.168.100.16/28;
10.0.0.0/24;
10.0.10.0/24;
10.0.20.0/24;
};
logging {
channel default_ch {
file «/var/log/named/named.log» versions 4 size 100k;
severity info;
print-time yes;
print-category yes;
};
channel security_ch {
file «/var/log/named/security.log» versions 4 size 100k;
severity info;
print-time yes;
print-category yes;
};
category default { default_ch; };
category security { security_ch; };
};
server 217.116.158.3 {
bogus yes;
transfers 3;
transfer-format one-answer;
};
server 217.116.129.9 {
bogus yes;
transfers 3;
transfer-format one-answer;
};
server 10.0.0.85{
bogus yes;
transfers 3;
transfer-format one-answer;
};
include «/etc/local.conf»;
include «/etc/rndc.conf»;
— Создаём директорию для журналов:
# mkdir /var/log/named
-В конец файла /etc/bind/named.conf добавляем подключение файла, где будут перечислены все поддерживаемые нами зоны:
include «/etc/bind/zones.of_my_own»;
— Создаём этот файл. Создадим вторичные зоны для neighbour.ru и локальной сети local.net и основную зону для нашей новой сети teo.mynetwork.ru:
zone «neighbour.ru» {
type slave;
file «/etc/bind/zone/neighbour.ru.slave»;
masters { 81.211.66.200; };
};
zone «local.net» {
type slave;
file «/etc/bind/zone/local.net»;
masters port 53 { 10.0.0.85; };
allow-transfer { none; };
allow-query { SVOY; };
};
// Zones for domain teo.mynetwork.ru
zone «teo.mynetwork.ru» {
type master;
file «/etc/bind/zone/teo.mynetwork.ru»;
};
zone «100.168.192.in-addr.arpa» {
type master;
file «/etc/bind/zone/teo.reversed»;
};
— Создаём указанные файлы описания зон.
Файл /etc/bind/zone/teo.mynetwork.ru изменяем по усмотрению. Далее при любых изменениях в этом файле увеличиваем серийный номера,
который, строго говоря, может быть просто счётчиком, как в Windows, либо, как принято многими другими будет отражать дату изменения зоны (у нас
формат серийного номера YYYYMMDDNN, где NN номер изменения зоны в указанный день, для случая когда мы меняем зону по несколько раз на
дню):
$ORIGIN .
$TTL 86400 ; 1 day
teo.mynetwork.ru IN SOA teo.mynetwork.ru. postmaster.teo.mynetwork.ru. (
2004100506 ; serial
86400 ; refresh (1 day)
21600 ; retry (6 hours)
3600000 ; expire (5 weeks 6 days 16 hours)
3600 ; minimum (1 hour)
)
IN NS teo.mynetwork.ru.
IN NS neighbour.ru.
MX 10 teo.mynetwork.ru.
$ORIGIN teo.mynetwork.ru.
@ IN A 192.168.100.18
ns A 192.168.100.18
* MX 10 teo.mynetwork.ru.
Файл /etc/bind/zone/my.reversed изменяем по усмотрению:
$ORIGIN .
$TTL 86400 ; 1 day
100.168.192.in-addr.arpa IN SOA teo.mynetwork.ru. postmaster.teo.mynetwork.ru. (
2004100504 ; serial
28800 ; refresh (8 hours)
14400 ; retry (4 hours)
3600000 ; expire (5 weeks 6 days 16 hours)
86400 ; minimum (1 day)
)
IN NS teo.mynetwork.ru.
IN NS neighbour.ru.
$ORIGIN 100.168.192.in-addr.arpa.
$TTL 3600 ; 1 hour
18 PTR teo.mynetwork.ru.
— В дальнейшем нужно будет не забыть создать почтовый ящик (или лучше алиас) postmaster для человека, ответственного за поддержание зоны.
Перезапускаем bind:
# /etc/init.d/bind9 restart
— Теперь от клиента можно выходить в Интернет. Для этого указываем в настройках IP протокола на машине клиента в качестве шлюза и DNS сервера,
локальный IP адрес нашего нового сервера, т.е. 10.0.0.2. Заодно проверим от клиента созданную зону. В командной строке введём:
C:\>ping teo.mynetwork.ru
— Чтобы проверить правильно ли создана обратная зона нужно с другого компьютера (*nix) выполнить:
# host 192.168.100.18
— Чтобы можно было забирать зону с 10.0.0.85 дадим там на это разрешение (напомню, что это Windows):
Пуск — Программы — Администрирование — DNS — Свойства (контекстное меню сервера) — Пересылка (закладка) — Добавить
Полезные ссылки:
man resolver
Шаг 4. настройка FTP-сервера. vsftpd
— В качестве клиентов используем lftp или sftp.
— Редактируем /etc/vsftpd.conf:
#pasv_enable=NO # разкоментировав эту строку мы запретим пассивные соединения, (т.е. через прокси
сервер)
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
ftpd_banner=Welcome to Teo FTP service.
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
chroot_local_user=YES
Маску ставим 022, чтобы остальные могли читать выложенные по ftp файлы, если требуется обеспечить конфиденциальность, то ставим маску 077.
Последние три строки chroot`ят всех подключающихся по ftp локальных пользователей в их домашние каталоги (т.е. те не могут выйти на уровни
выше), кроме пользователей перечисленных в файле /etc/vsftpd.chroot_list (по одному в строку). Остальные параметры можно оставить без
изменения. Полный конфигурационный файл можно взять здесь. Файл /etc/vsftpd.chroot_list, если нет необходимости, лучше оставлять
пустым и добавлять пользователей на время.
Шаг 5. настройка прокси. Squid
— Проверяем, установлен ли squid.
# dpkg -l squid
— Если не установлен, то делаем:
# apt-get install squid
— Вносим изменения в конфигурационный файл /etc/squid/squid.conf:
Прокси сервер будет отвечать только на запросы из локальной сети и компьютера, где установлен:
http_port 10.0.0.2:3128
http_port 127.0.0.1:3128
Squid позволяет обмениваться закэшированной информацией с другими сервермами, если не будем устанавливать их у себя, то отключаем эту
возможность (по умолчанию squid прослушивает для этого порт 3130):
icp_port 0
Отводим под кэш 9 Гб, 32 и 256 это 1-й и 2-й уровни каталогов для хранения кэша.
cache_dir ufs /var/spool/squid/ 9000 32 256
Для безопасности ограничим количество портов, которые будет обрабатывать наш прокси сервер. Для этого правилах acl Safe_ports port
закомментируем всё кроме
80 — соединение по http,
21 — соединение по ftp,
443 — соединение по https
После заголовка # INSERT YOUR OWN RULE(S) HERE TO ALLOW: можно вставить правила на ограничения доступа к сервису ICQ и нежелательным
сайтам:
acl pool_icq src ‘/etc/squid/icq.txt’
acl icq dstdomain .icq.com
http_access allow pool_icq icq
http_access deny icq
acl pool_blacklist dstdomain ‘/etc/squid/blacklist.txt’
http_access deny pool_blacklist
Здесь же можно указать запрет на загрузку mp3, avi и др. мультимедиа файлов:
acl music urlpath_regex -i \.mp3 \.wav \.ogg \.avi \.mpg \.mpeg \.wmf
http_access deny music
Указываем кому писать если есть проблемы
cache_mgr 24pm@mail.ru
Задаём размер оперативной памяти, в которой squid будет хранить часть кэша. Параметр зависит от общего объёма оперативной памяти и
загруженности сервера остальными задачами. Squid по умолчанию ставит 5 MB.
memory_pools_limit 100 MB
Статистику по клиентам будем собирать внешней программой, т.ч. здесь выключим
client_db off
Сообщения об ошибках показывать на русском языке
error_directory /usr/share/squid/errors/Russian-koi8-r
— В /etc/squid/ создаём файлы:
icq.txt — пользователи, кому разрешено использовать эту службу
blacklist.txt — список запрещённых для пользователя сайтов, можно указывать как IP адреса так и DNS имена (к сожалению одно другое не
заменяет, т.е. если IP занесён, а имя нет, то по последнему можно будет получить доступ к странице). Список можно взять либо где-нибудь в интернете
(забыл, где брал, но таких мест несколько), либо здесь.
— Создаём кэш сквида:
# /usr/sbin/squid -z
— Настройка ротации уже сделана с помощью программы logrotate. Посмотреть и изменить можно в /etc/logrotate.d/squid. Если в дальнейшем
будем использовать Calamaris, то здесь нужно исправить для файла access.log ротацию на ежедневную (можно оставить недельную, но тогда нужно
будет подправить скрипты calam_rep.sh и calam_rep_ip.sh), сделать 6 архивных файлов и убрать компрессию. Для журналов cache.log и
store.log компрессию можно оставить:
/var/log/squid/access.log {
daily
rotate 6
copytruncate
nocompress
notifempty
missingok
}
/var/log/squid/cache.log {
daily
rotate 6
copytruncate
compress
notifempty
missingok
}
/var/log/squid/store.log {
daily
rotate 6
copytruncate
compress
notifempty
missingok
postrotate
/usr/sbin/squid -k rotate
endscript
}
— Запускаем:
# /etc/init.d/squid start
— Всё. Прокси-сервер работает. Проверяем с клиентской машины. Теперь, чтоб пользователь был в курсе остатка своей квоты, положим в
общедоступное место небольшой веб-интерфейс к stacc. Взять его можно здесь. Подредактируйте шаблонный файл ip_quota.html для своих нужд.
Опубликуем на внутреннем сайте ссылку на ip_quota.php.
— Для того, чтобы увидеть все запрошенные ресурсы по определённому пользователю за сегодня (например, на какие сайты он ходил и что скачал),
создадим скрипт /etc/squid/grap_ip_traffic.sh:
#!/bin/sh
# This Script grabs todays’ traffic from squid log on given ip.
# Pavel Malakhov 25.02.05
#
# Usage: grab_ip_traffic.sh ip_address
#
PATH_TO_LOG=’/var/log/squid’;
# check for parameter
IP=»;
if [ «$1» = «» ]; then
IP=$CHECK_IP;
else
IP=$1;
fi
REPNAME=`date +%b_%d`’_ip_’$IP’.txt’;
cat $PATH_TO_LOG/access.log | grep $IP > $REPNAME
— Немного другую статистику по пользователю и в более красивом виде сделаем позже по статье «Статистика прокси сервера Squid». Но если
статистика нас не интересует, либо вполне хватает журнальных файлов, то полезно будет изменить представление даты и времени из юниксового в
человеческий, для этого в /usr/local/squid/etc/squid.conf указываем:
emulate_httpd_log on
Если позже решим использовать Calamaris или Sarg, то нужно вернуть родной для squid формат журнала, выключив эту опцию. LightSquid может
работать с журналами обоих видов.
Шаг 6. настройка web-сервера. Apache
— В будущем нам понадобиться поддержка php и perl скриптов. Эти модули должны быть установлены при установке ОС (если мы сказали
устанавливать веб-сервер). Проверить что установлено вместе с Apache можно командой:
# dpkg -l *apache2*
А установить Apache c этими модулями можно командами:
# apt-get install apache2
# apt-get install libapache2-mod-perl2
# apt-get install libapache2-mod-php4
— Главный конфигурационный файл /etc/apache2/apache2.conf нам пока не понадобится. Нас интересуют 4 каталога в /etc/apache2/:
mods-available — установленые в систему модули, хранит сами модули и их конфигурационные файлы
mods-enabled — подключенные модули, хранит ссылки на файлы в mods-available
sites-available — доступные сайты, хранит файлы описывающие виртуальные хосты
sites-enabled — подключенные сайты, хранит ссылки на файлы в sites-available
и четыре команды, которыми будем создавать и удалять ссылки в диалоговом режиме:
a2enmod — подключает модуль
a2dismod — отключает модуль
a2ensite — подключает сайт
a2dissite — отключает сайт
после выполнения этих команд нужно попросить Apache обновить свою конфигурацию:
# /etc/init.d/apache2 reload
Также можно настроить несколько сайтов на одном веб-сервере. В этой же статье описано как изменить доступ к каталогам и файлам сайта.
— Переносим сайты со старого сервера (dump MySQL и т.д. см. решение проблем в Linux)
Шаг 7. настройка СУБД. MySQL
— Устанавливаем MySQL сервер:
# apt-get install mysql-server
— После установки он автоматически запускается. Вручную это можно сделать выполнив:
# /etc/init.d/mysql start
— Можно посмотреть как он запустился в /var/log/syslog. Подсоединяемся к серверу:
# mysql -u root mysql
— Меняем пароль администратора и выходим
mysql> UPDATE user SET Password=PASSWORD(‘new_pass’) WHERE user=’root’;
mysql> quit
— Перезагружаем сервер
# /etc/init.d/mysql reload
— Подсоединяемся к серверу ещё раз, только теперь с паролем
# mysql -u root -p mysql
По умолчанию MySQL не журналирует выполняемые на нём команды. Нам может это понадобиться для отладки взаимодействующих с ним
приложений. У меня возникла такая необходимость при настройке Courier. Включить журналирование можно в файле /etc/init.d/mysql,
закоментировав оригинальный запуск программы в секции start и добавив параметр —log:
# /usr/bin/mysqld_safe > /dev/null 2>&1 &
/usr/bin/mysqld_safe —log &
Базы храняться в /var/lib/mysql.
Несколько полезных команд:
SHOW TABLES; # показать таблицы в БД
SHOW COLUMNS FROM db; # показать поля таблицы db
USE mysql; # перейти в БД mysql
SELECT host,user FROM user; # показать поля host, user таблицы user
DROP TABLE transport; # удалить таблицу transport
DELETE FROM user WHERE user=’acct’ AND
host=’%’;
# удалить конкретную запись
UPDATE db SET Delete_priv=’Y’ WHERE
user=’acct’;
# изменить значение поля в записи
FLUSH PRIVILEGES; # применить внесённые изменения
mysql -u root -p12345 postfix < DB.sql # пакетное выполнение SQL выражений для базы
данных postfix
ALTER TABLE mailbox ADD (uid int(10) unsigned
DEFAULT ‘107’ NOT NULL);
# добавляем в таблицу mailbox обязательное поле uid
со значением по умолчанию = 107
ALTER TABLE mailbox DROP uid; # удаляем поле uid из таблицы mailbox
Шаг 8. Настройка почтового сервера. Postfix
8.1. Установка Postfix c поддержкой TLS и MySQL
Postfix отвечает только за приём почты и раскладке его по нужным каталогам.
— Устанавливаем необходимые пакеты, также будет весьма полезно установить документацию:
# apt-get install postfix
# apt-get install postfix-mysql
# apt-get install postfix-tls
# apt-get install postfix-doc
— Почту будем раскладывать по каталогам и забирать от туда пользователем postfix. Можно для этих целей добавить отдельного пользователя,
например vmail и от его имение работать с каталогами и файлами почтовых ящиков. Узнаем какой у postfix номер пользователя (uid) и группы (gid) в
ситсеме:
# id postfix
uid=107(postfix) gid=108(postfix) groups=108(postfix)
— Вносим изменения в /etc/postfix/main.cf:
myhostname = teo.mynetwork.ru
alias_maps = hash:/etc/postfix/aliases
mydomain = teo.mynetwork.ru
mynetworks = 10.0.0.0/24 10.0.10.0/24 10.0.20.0/24
В список mynetworks также можно добавить адреса доменов, которые воспринимаются как спамеры, но письма с них получать нужно. Делать это стоит
только если не удалось настроить приложение отвечающее за борьбу со спамом. Переменную relayhost можно закоментировать или вообще убрать, так
как мы будем использовать транспортную таблицу, которая перекрывает её.
— Добавляем в конец файла следующие строки конфигурации:
# устанавливаем ограничение на ящик в 100Мб и на письмо в 10Мб
mailbox_size_limit = 102400000
message_size_limit = 10240000
# Создаём виртуальный домен, учитывая что uid=107(postfix) gid=108(postfix)
vivirtual_mailbox_base = /var/spool/postfix/vmail
virtual_mailbox_domains = mysql:/etc/postfix/virt_domain.cf
virtual_alias_maps = mysql:/etc/postfix/virt_alias.cf
virtual_mailbox_maps = mysql:/etc/postfix/virt_mailbox.cf
transport_maps = mysql:/etc/postfix/transport.cf
virtual_minimum_uid = 100
virtual_uid_maps = static:107
virtual_gid_maps = static:108
# Добавим небольшой фильтр от спама
header_checks = regexp:/etc/postfix/header_checks
# Различные ограничения, призванные помочь в борьбе со спамом
smtpd_etrn_restrictions = permit_mynetworks, reject
smtpd_helo_required = yes
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination
— Создаём каталог, где будет храниться почта и изменяем владельца и права доступа:
# mkdir /var/spool/postfix/vmail
# chown postfix.postfix /var/spool/postfix/vmail
# chmod 700 /var/spool/postfix/vmail
— Создаём файл /etc/postfix/header_checks, в котором пропишем правило отсева сообщений в теме которых содержаться слова sex, viagra,
seduce, naked:
/^Subject.*(sex|viagra|seduce|naked)/ FILTER REJECT:
— Создадим файлы доступа к MySQL. Пользователь postfixadmin в MySQL будет создан позже, при установке Postfix Admin. Создаём файл
/etc/postfix/virt_alias.cf:
user = postfixadmin
password = postfixadmin
hosts = 127.0.0.1
dbname = postfix
table = alias
select_field = goto
where_field = address
— Создаём файл /etc/postfix/virt_domain.cf:
user = postfixadmin
password = postfixadmin
hosts = 127.0.0.1
dbname = postfix
table = domain
select_field = description
where_field = domain
— Создаём файл /etc/postfix/virt_mailbox.cf:
user = postfixadmin
password = postfixadmin
hosts = 127.0.0.1
dbname = postfix
table = mailbox
select_field = maildir
where_field = username
— Создаём файл /etc/postfix/transport.cf:
user = postfixadmin
password = postfixadmin
hosts = 127.0.0.1
dbname = postfix
table = transport
select_field = destination
where_field = domain
указывая в hosts IP адрес, мы принуждаем Postfix соединяться с MySQL через порт, если же указать localhost, то он будет стараться соединиться через
сокет.
— Посмотреть настройки Posfix, отличающиеся от настроек по умолчанию, можно командой:
# postconf -n
В будущем в целях отладки возможно будет полезно для некоторых компонентов Postfix включить более детальное журналирование. Для этого в
/etc/postfix/master.cf в колонке commnads + args добавляем ключ -v. Например для virtual строка будет выглядеть так:
virtual unix — n n — — virtual -v
8.2. Устанавливаем Postfix Admin для настройки postfix через веб-интерфейс.
Доустановим пакет позволяющий PHP работать с MySQL:
# apt-get install php4-mysql
Автоматически подгружаем расширение PHP для MySQL. Для этого убираем комментарий в /etc/php4/apache2/php.ini:
extension=mysql.so
Берём последнюю версию пакета с http://high5.net/postfixadmin/ (на данный момент последняя версия 2.3.0). Распаковываем в кокой-нибудь каталог
нашего административного сайта (например в postfixadmin) и запускаем установочный скрипт в браузере http://youserver/postfixadmin/setup.php
Удобно, что сейчас весь труд по созданию и настройке базы данных разработчики взяли на себя. Проблемы с языком тоже нет.
На всякий случай пока оставлю инструкцию для установки предыдущих версий:
Устанавливаем по прилагающемуся алгоритму, только права доступа к файлам вопреки советам лучше не изменять, т.е. делаем следующее:
— Распаковываем и копируем всё содержимое каталога postfixadmin-2.1.0 в /var/www/admin/postfixadmin:
# tar -zxvf postfixadmin-2.1.0.tgz
— Создаём таблицы:
# cd postfixadmin
# mysql -u root -p < DATABASE_MYSQL.TXT
— Копируем config.inc.php.sample в config.inc.php (Shift+F5 в mc, также как и в Far) и редактируем:
$CONF[‘default_language’] = ‘ru’;
$CONF[‘admin_email’] = ‘postmaster@teo.mynetwork.ru’;
$CONF[‘default_aliases’] = array (
// ‘abuse’ => ‘abuse@change-this-to-your.domain.tld’,
// ‘hostmaster’ => ‘hostmaster@change-this-to-your.domain.tld’,
‘postmaster’ => ‘pm@teo.mynetwork.ru’,
‘webmaster’ => ‘pm@teo.mynetwork.ru’
);
$CONF[‘domain_path’] = ‘NO’;
$CONF[‘domain_in_mailbox’] = ‘YES’;
// Specify your default values below. Quota in MB.
$CONF[‘aliases’] = ’10’;
$CONF[‘mailboxes’] = ’10’;
$CONF[‘maxquota’] = ’10’;
$CONF[‘show_footer_text’] = ‘NO’;
поставляемый с программой руссифицирующий файл создан в кодировке windows-1251, да к тому же с длинными строками, чего программа не
предусматривает. В результате невозможно работать из-за наезжания кнопок друг на друга. Попытки сменить кодировку не увенчались успехом.
Программа упорно выдаёт свои страницы на русском языке невзирая на значение переменной default_language. Хотя бороться с этаким русофилом
оказалось довольно просто, переименовав en.lang в ru.lang я таки получил английский интерфейс, но мы — русские люди, поэтому
русификацию пришлось доработать. Руссификацию в koi8-r с укороченными строками можно взять здесь. Правда трюк с переименованием ru_koi8-
r.lang в ru.lang придётся всё-таки провернуть.
— Cоздаём таблицу transport в MySQL и заносим туда данные:
# mysql -u root -p postfix
mysql> CREATE TABLE IF NOT EXISTS transport (domain varchar(128) not null primary key,
destination varchar(128) not null);
mysql> INSERT INTO transport (domain,destination) VALUES (‘teo.mynetwork.ru’,’virtual’);
mysql> SELECT * FROM transport;
— Даём пользователю postfixadmin право на подключение к базе через порт. Для этого переходим в базу mysql:
mysql> USE mysql;
mysql> INSERT INTO db (host,db,user) VALUES (‘127.0.0.1′,’postfix’,’postfixadmin’);
mysql> INSERT INTO user (host,user,password) VALUES
(‘127.0.0.1′,’postfixadmin’,password(‘postfixadmin’));
mysql> UPDATE db SET Select_priv=’Y’, Insert_priv=’Y’, Update_priv=’Y’, Delete_priv=’Y’,
Create_priv=’Y’, Drop_priv=’Y’, Grant_priv=’Y’, References_priv=’Y’, Index_priv=’Y’,
Alter_priv=’Y’, Create_tmp_table_priv=’Y’, Lock_tables_priv=’Y’ WHERE user=’postfixadmin’;
mysql> SELECT * FROM db WHERE user=’postfixadmin’;
— Активируем все изменения и покидаем командную оболочку MySQL:
mysql> flush privileges;
mysql> quit
— Запускаем postfix:
# /etc/init.d/postfix start
— Проверяем из браузера страницу http://admin_site.local.net/admin/postfixadmin/admin/list-virtual.php
На запрошенные имя пользователя и пароль отвечаем admin/admin.
— Если русский язык некорректно отображается, то меняем кодировку в файле /var/www/admin/postfixadmin/templates/header.tpl. с iso-
8859-1 на windows-1251 (koi8-r):
<meta http-equiv=»Content-Type» content=»text/html; charset=<?php print isset ($PALANG[‘charset’]) ? $PALANG[‘charset’] : ‘windows-1251’ ?>» />
— Смотрим конфигурацию (если возникли проблемы, то здесь можно найти подсказку) на http://admin_site.local.net/postfixadmin/setup.php
— Добавляем домен teo.mynetwork.ru и почтовые ящики pm и p.
— Можно сделать резервную копию всех таблиц в виде SQL выражений. Для этого на странице администратора нажать кнопку Backup.
— Теперь в консоли проверяем как работает доставка почты, т.е. smtp:
# telnet localhost 25
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
220 teo.mynetwork.ru ESMTP Postfix
helo teo.mynetwork.ru
250 teo.mynetwork.ru
mail from: pm@teo.mynetwork.ru
250 Ok
rcpt to: p@teo.mynetwork.ru
250 Ok
data
354 End data with <CR><LF>.<CR><LF>
this is the test
.
250 Ok: queued as A7CAC36B52
quit
221 Bye
Connection closed by foreign host.
— Идём в наш почтовый каталог /var/spool/postfix/vmail/ там, если не был, появился каталог p@teo.mynetwork.ru, а в нём (в каталоге
new) сообщение.
8.3. Настраиваем шифрование почты.
Если отказались от TLS, то пропускаем этот шаг.
— Конфигурируем Postfix. Добавляем настройки tls в конец файла /etc/postfix/main.cf:
# TLS
tls_random_source = dev:/dev/urandom
smtp_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtp_tls_loglevel = 1
smtp_tls_key_file = /etc/apache2/ssl/server.key
smtp_tls_cert_file = /etc/apache2/ssl/server.crt
smtp_tls_CAfile = /etc/apache2/ssl/ca.crt
smtpd_use_tls = yes
smtpd_tls_auth_only = no
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
smtpd_tls_loglevel = 1
smtpd_tls_key_file = /etc/apache2/ssl/server.key
smtpd_tls_cert_file = /etc/apache2/ssl/server.crt
smtpd_tls_CAfile = /etc/apache2/ssl/ca.crt
Сертификаты я взял со старого сервера под Alt Linux. Как создавать в Debian ещё на смотрел.
Проверяем:
# postfix reload
# telnet localhost 25
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
220 teo.mynetwork.ru ESMTP Postfix
ehlo teo.mynetwork.ru
250-teo.mynetwork.ru
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-STARTTLS
250 8BITMIME
starttls
220 Ready to start TLS
close
Connection closed by foreign host.
— В случае сбоев смотреть лог-файлы /var/log/mail.err, mail.warn, mail.log:
8.4. настройка антивируса ClamAV
Мы установим из пакета, но можно скачать исходники с http://www.clamav.net/
— Устанавливаем антивирус ClamAV:
# apt-get install clamsmtp
— В конфигурационном меню выбираем:
Режим работы: «daemon»,
Ближайший сервер для обновлений,
Прокси (если нужен),
Нужно ли перегружать демон при обновлении баз: Yes,
Удалять ли карантин при удалении всего пакета: Yes,
Обновляем библиотеку: Yes,
Перезагружаем сервисы,
— Смотрим в файле /etc/clamsmtpd.conf какой порт clamsmtpd прослушивает (Listen) и на какой отдаёт обратотанную почту (OutAddress)
OutAddress: 10025
Listen: 127.0.0.1:10026
— Добавляем антивирусный фильтр в /etc/postfix/main.cf (я добавил после антиспам фильтра):
# anti-virus
content_filter = scan:127.0.0.1:10026
receive_override_options = no_address_mappings
— Добавляем в конец файла /etc/postfix/master.cf:
# AV scan filter (used by content_filter)
scan unix — — n — 16 smtp
-o smtp_send_xforward_command=yes
# For injecting mail back into postfix from the filter
127.0.0.1:10025 inet n — n — 16 smtpd
-o content_filter=
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o smtpd_authorized_xforward_hosts=127.0.0.0/8
— Запускаем:
# /etc/init.d/clamav-daemon start
Проверим, что демон действительно запущен и прослушивает порт 10026:
# netstat -apn | grep 10026
tcp 0 0 127.0.0.1:10026 0.0.0.0:* LISTEN 27910/clamsmtpd
На этом с Postfix всё. Можно ещё раз проверить с помощью telnet, что почта, проходя через антивирусную защиту, доходит в ящик пользователя.
Дополнительную информаци по настройке postfix, защите от спама и полезные ссылки смотрите в дополнительной статье по Postfix.
Шаг 9. Устанавливаем Courier-IMAP с поддержкой MySQL.
Сourier-IMAP отвечает за отдачу почты пользователю. Исходники можно взять с ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/
9.1. Устанавливаем Courier.
Courier отвечает за отдачу почты пользователю.
# apt-get install courier-imap
# apt-get install courier-pop
# apt-get install courier-authmysql
# apt-get install courier-authdaemon
— Настраиваем демон авторизации, редактируя его конфигурационный файл /etc/courier/authdaemonrc:
authmodulelist=»authmysql»
daemons=10
— Настраиваем доступ к БД MySQL. Редактируем /etc/courier/authmysqlrc:
MYSQL_SERVER localhost #или 127.0.0.1, если не работает
MYSQL_USERNAME postfixadmin
MYSQL_PASSWORD postfixadmin
#MYSQL_SOCKET /var/lib/mysql/mysql.sock
MYSQL_PORT 3306
MYSQL_OPT 0
MYSQL_DATABASE postfix
MYSQL_USER_TABLE mailbox
MYSQL_CRYPT_PWFIELD password
DEFAULT_DOMAIN teo.mynetwork.ru
MYSQL_UID_FIELD ‘107’
MYSQL_GID_FIELD ‘108’
MYSQL_LOGIN_FIELD username
MYSQL_HOME_FIELD ‘/var/spool/postfix/vmail’
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD maildir
— Запускаем:
# /etc/init.d/courier-authdaemon start
# /etc/init.d/courier-pop start
# /etc/init.d/courier-imap start
— Проверяем можем ли забрать почту, т.е. работоспособность pop3:
# telnet localhost 110
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
+OK Hello there.
user pm@teo.mynetwork.ru
+OK Password required.
pass password
+OK logged in.
list
+OK POP3 clients that break here, they violate STD53.
1 470
.
quit
+OK Bye-bye.
Connection closed by foreign host.
Как видим одно письмо на 470 байт лежит. Можно его просмотреть командой retr 1 (конечно перед quit)
Если telnet выдаёт ошибку «ERR chdir Maildir failed», то может помочь изменение переменной:
MYSQL_MAILDIR_FIELD concat(‘/var/spool/postfix/vmail/’,maildir)
(проблему с описанием прислал Андрей Кудрин)
— Можно дополнительно указать, чтобы регистрировались все подключения пользователей. Это удобно, чтобы ответить на вопрос: «когда пользователь
забрал почту?» для этого в файлах /etc/courier/pop3d, imapd указываем:
DEBUG_LOGIN=1
Если указать 2, то будут также показываться пароли, с которыми пользователи пытались подключиться.
9.2. Устанавливаем Cyrus-SASL2 для шифрования отдаваемой почты.
см инструкцию для Alt Linux.
9.3. Создаём сертификат
см инструкцию для Alt Linux.
— Теперь наша почтовая система установлена окончательно.
Полезные ссылки:
Virtual Users and Domains with Courier-IMAP and MySQL
http://www.irbs.net/internet/postfix/ — полезныей troubleshoot (решение проблем) по Postfix
http://www.postfix.org/postconf.5.html — описание конфигурационных параметров
также см. раздел Ссылки
Шаг 10. Введение сервера в «боевой» режим
Если мы устанавливали и отлаживали свой сервер, как часто бывает, в тестовом режиме, паралельно с работающим старым сервером, то перед
установкой сервера в «боевой» режим нужно внести следующие изменения:
— Изменить настройки сетевых интерфейсов на боевые (ip адрес, маска, шлюз, DNS).
— Прописать реальные имена в /etc/hosts. Как это сделать можно узнать из статьи «Решение проблем. Linux.»
— Squid. Внести изменения в конфигурационный файл /etc/squid/squid.conf, чтобы прокси сервер принимал запросы только из локальной сети и
компьютера, где установлен:
http_port 10.0.0.2:3128
http_port 127.0.0.1:3128
— SAMS. Исправить IP адрес на административной странице «SAMS» — «Администрирование SAMS»
— Postfix. Исправить IP адреса в параметре mynetworks в файле /etc/postfix/main.cf
— Courier. Если менялось имя почтового домена, то исправить в /etc/courier-authlib/authdaemon-mysql.conf и пересоздать сертификаты.
— Apache. Исправить директивы NameVirtualHost и VirtualHost в конфигурациях виртуальных хостов (если создавались).