суббота, 18 января 2014 г.

Шейпинг трафика в Ubuntu 12.04 LTS

Задача: разделить небольшой интернет-канал между большим количеством пользователей с  приоритизацией трафика.

Использованные источники:
1. http://www.opennet.ru/docs/RUS/LARTC/index.html
2. http://habrahabr.ru/post/133076/

Проблема была в том, что 100 пользователям интернет (10 Мбит/с) раздавал обычный Wi-Fi роутер. Среди этих пользователей были те, кто пользовался интернетом мало, те, кто весь день подключен к удаленному серверу Windows 2008 через RDP, и те, кому в течение дня требуется быстро качать файлы размером 30-300 Мб. Во-первых, когда кто-нибудь начинал усиленно качать какой-нибудь торрент, то у остальных все начинало тормозить. Во-вторых, даже если никто торренты не качал, а, к примеру, несколько человек просто копировали большие файлы с удаленного корпоративного файлового сервера, то страдали программисты 1С, которым всегда нужна высокая скорость соединения с Windows 2008 через RDP.

Итак, было выявлено 2 подзадачи:
1) Сделать равномерное распределение интернет-канала между пользователями. Нужно было исключить ситуацию, при которой один пользователь забирал большую часть скорости.
2) Установить RDP-трафику программистов 1С высокий приоритет.

Прокси-сервер squid не позволял решить вышеозначенные задачи, т.к. не умел контролировать HTTPS-трафик. Во-вторых, для контроля скорости другого трафика все равно нужно было использовать что-то другое.
Поэтому основным инструментом была выбрана утилита tc (traffic control). TC может ограничивать только исходящую скорость, поэтому все правила будем настраивать для сетевого интерфейса, смотрящего в локальную сеть.

Итак, схема распределения скорости выглядит так.



Реализация:
1) Пишем shell-скрипт

#!/bin/sh
tc=/sbin/tc
ipt=/sbin/iptables

#----Интерфейс, смотрящий в локальную сеть----
local_iface=eth0

# RDP использует TCP потр 3389
RDP_port=3389

#----Общая скорость Интернет-канала (10 Мбит/c или 1250Кбайт/c)----
channel_sp=1250kbps

#----Максимальные и минимальные скорости----
#__скорость для всего RDP-трафика__
sp_rdp=400kbps
m_sp_rdp=500kbps
#_скорость для RDP-трафика программистов 1С_
sp_rdp_progr=150kbps
m_sp_rdp_progr=500kbps
#_скорость для RDP-трафика всех остальных сотрудников_
sp_rdp_every=350kbps
m_sp_rdp_every=500kbps

#__скорость для остального (не RDP) трафика__
sp_oth_tr=850kbps
m_sp_oth_tr=1250kbps
#_минимальная и максимальная скорость на один IP_
sp_every=25kbps
m_sp_every=300kbps

# --IP-адреса программистов 1С
progr_ip1=192.168.0.10/32
progr_ip2=192.168.0.11/32
#----Диапазон IP-адресов локальной сети----
first_localnet_ip=2
last_localnet_ip=254
localnet_pr=192.168.0

#------------Маркируем пакеты средствами iptables--------------

# Маркируем пакеты RDP-трафика, а именно пакеты, идущие с порта 3389, меткой 22
$ipt -t mangle -A POSTROUTING -o $local_iface -p tcp --sport $RDP_port -j MARK --set-mark 0x0022

# Маркируем пакеты RDP-трафика программистов 1С
$ipt -t mangle -A POSTROUTING -o $local_iface -p tcp --sport $RDP_port -d $progr_ip1 -j MARK --set-mark 0x0021
$ipt -t mangle -A POSTROUTING -o $local_iface -p tcp --sport $RDP_port -d $progr_ip2 -j MARK --set-mark 0x0021

# Настройка TC для сетевого интерфейса, смотрящего в локальную сеть.

# Удаляем корневую дисциплину
$tc qdisc del dev $local_iface root

# Определяем корневую дисциплину с префиксом 1 и планировщиком htb. Трафик, не отфильтрованный фильтрами, будет попадать в класс 1:15
$tc qdisc add dev $local_iface root handle 1: htb default 15

# Определяем корневой класс 1:1 с планировщиком htb и задаем общую скорость Интернет-канала (1250 Кбайт/c)
$tc class add dev $local_iface parent 1: classid 1:1 htb rate $channel_sp

# Определяем дочерний для класса 1:1 класс 1:15 с планировщиком htb для трафика, не отфильтрованного фильтрами, т.е. для не RDP-трафика, и задаем гарантированную (минимальную) (850 Кбайт/c) и максимальную скорость (1250 Кбайт/c).
$tc class add dev $local_iface parent 1:1 classid 1:15 htb prio 3 rate $sp_oth_tr ceil $m_sp_oth_tr

# Определяем дочерний для класса 1:1 класс 1:11 с планировщиком htb для всего RDP-трафика и задаем гарантированную (минимальную) (400 Кбайт/c) и максимальную скорость (500 Кбайт/c).
$tc class add dev $local_iface parent 1:1 classid 1:11 htb prio 1 rate $sp_rdp ceil $m_sp_rdp

# Определяем дочерний для класса 1:11 класс 1:12 с планировщиком htb для RDP-трафика программистов 1С и задаем гарантированную (минимальную) (150 Кбайт/c) и максимальную скорость (500 Кбайт/c).
$tc class add dev $local_iface parent 1:11 classid 1:12 htb prio 1 rate $sp_rdp_progr ceil $m_sp_rdp_progr

# Определяем дочерний для класса 1:11 класс 1:13 с планировщиком htb для RDP-трафика всех остальных и задаем гарантированную (минимальную) (350 Кбайт/c) и максимальную скорость (500 Кбайт/c).
$tc class add dev $local_iface parent 1:11 classid 1:13 htb prio 2 rate $sp_rdp_every ceil $m_sp_rdp_every

# Задаем фильтр для фильтрования RDP-трафика программистов 1С (метка 21). Фильтр будет привязан к дисциплине 1: . Отфильтрованный трафик будет направлен в класс 1:12
$tc filter add dev $local_iface prio 1 protocol ip parent 1: u32 match mark 0x0021 0xffff flowid 1:12

# Задаем фильтр для фильтрования всего RDP-трафика всех остальных (метка 22). Фильтр будет привязан к дисциплине 1: . Отфильтрованный трафик будет направлен в класс 1:13
$tc filter add dev $local_iface prio 1 protocol ip parent 1: u32 match mark 0x0022 0xffff flowid 1:13

# Определяем правила TC для каждого IP-адреса локальной сети
net="$localnet_pr"
i=$first_localnet_ip
while [ "$i" -ne "$last_localnet_ip" ]
do

# Определяем дочерний для класса 1:15 (не RDP-трафик) класс 1:$((${i}+15)) с планировщиком htb для IP-адреса локальной сети и задаем гарантированную (минимальную) (25 Кбайт/c) и максимальную скорость (300 Кбайт/c).
$tc class add dev $local_iface parent 1:15 classid 1:$((${i}+15)) htb prio 3 rate $sp_every ceil $m_sp_every
# Задаем фильтр для фильтрования трафика, идущего на IP-адрес локальной сети. Фильтр будет привязан к дисциплине 1: . Отфильтрованный трафик будет направлен в класс 1:$((${i}+15))
$tc filter add dev $local_iface prio 3 protocol ip parent 1: u32 match ip dst ${net}.${i} flowid 1:$((${i}+15))
# Определяем дисциплину с планировщиком sfq для класса 1:$((${i}+15)) IP-адреса локальной сети. Эта дисциплина будет равномерно распределять не RDP-трафик каждого IP-адреса локальной сети
$tc qdisc add dev $local_iface parent 1:$((${i}+15)) handle $((${i}+15)): sfq perturb 10

i=$((${i}+1))
done

Если данная инструкция оказалась полезной для вас, напишите, пожалуйста, об этом в комментарии.

суббота, 15 декабря 2012 г.

Turbo Pascal на ALT Linux школьный 5 ( ALT Linux 6)

Задача: установить на Altlinux школьный Turbo Pascal 7.1

Использованные источники:
1. http://www.cyberforum.ru/pascal/thread89342.html
2. http://www.old-games.ru/forum/showthread.php?t=20813&page=71

Выполнение:
1. Скачиваем Turbo Pascal 7.1 здесь
2. Распаковываем скачанный архив.
3. Нам понадобится DosBox. В  ALT Linux школьный 5 DosBox уже установлен. Если не установлен, то через Synaptic ставим его. На день написания настоящей инструкции в репозитории была доступна версия 0.72
4. Предположим, школьники входят в  ALT Linux под логином user. Входим под ним и создаем каталоги для dosbox:
mkdir /home/user/dosbox
mkdir /home/user/dosbox/drive_c

каталог drive_c будет для turbo pascal диском C:\

Далее нужно переместить каталог tp7_1 из распакованного ранее архива в каталог
/home/user/dosbox/drive_c так, чтобы путь до turbo.exe был:
/home/user/dosbox/drive_c/tp7_1/BIN/turbo.exe

5. Теперь сделаем файл конфигурации для DosBox. Он будет стандартный, но с небольшими изменениями. Во-первых, в нем параметру autolock будет присвоено значение false, чтобы курсор автоматически освобождался, когда он выходит за границы окна DosBox. В противном случае придется нажимать CTRL+F10, что, конечно, неудобно. Во-вторых, в конец файла добавим несколько строк для того, чтобы при запуске DosBox автоматически запускался Turbo Pascal.
Итак:
mkdir /home/user/.dosbox
gedit /home/user/.dosbox/dosbox-0.74.conf

Содержимое dosbox-0.74.conf:

# Это конфигурационный файл DOSBox 0.74. (Пожалуйста, используйте самую свежую версию DOSBox.)
# Строки, начинающиеся с # являются комментариями и игнорируются DOSBox.
# Они используются, чтобы кратко описать каждую опцию.
#
# #24306 - Включена поддержка русского языка. Для ее работы нужно скопировать данный файл в
# домашнюю директорию: ~/.dosbox/dosbox-0.74.conf или ~/.dosbox/dosbox.conf
#

[sdl]
#       fullscreen: Запускает DOSBox сразу в полноэкранном режиме. (Для отключения нажмите ALT_ENTER)
#       fulldouble: Использовать двойную буферизацию при полноэкранном режиме. Может уменьшить мерцание экрана, но возможно приведёт к замедлению DOSBox.
#   fullresolution: Какое разрешение использовать для полного экрана: оригинальное или фиксированное значение (например, 1024x768).
#                   Использование "родного" разрешения монитора с параметром aspect=true может дать наилучшие результаты.
#                   Если вы получаете маленькое окошко на большом экране, попробуйте метод вывода отличный от surface.
# windowresolution: Масштабировать окно к этому размеру, ECЛИ устройство
#                   вывода поддерживает аппаратное масштабирование.
#                   (Режим вывода output=surface не поддерживает!)
#           output: Какую видеосистему использовать для вывода.
#                   Возможные значения: surface, overlay, opengl, openglnb, ddraw.
#         autolock: Мышь будет автоматически закреплена при щелчке по экрану. (Чтобы освободиь мышь нажмитеCTRL-F10.)
#      sensitivity: Чувствительность мыши.
#      waitonerror: Ждать перед закрытием консоли, если в DOSBox происходит ошибка.
#         priority: Уровни приоритета процесса DOSBox. Второй параметр (после запятой) используется,
#                   когда DOSBox не активен или свернут.
#                   Значение 'pause' поддерживается только для второго параметра.
#                   Возможные значения: lowest, lower, normal, higher, highest, pause.
#       mapperfile: Файл, используемый для загрузки/сохранения раскладки клавиш. Параметр resetmapper работает только со значением по умолчанию.
#     usescancodes: Обойти использование symkeys, может не работать на всех ОС.

fullscreen=false
fulldouble=false
fullresolution=original
windowresolution=original
output=surface
autolock=false
sensitivity=100
waitonerror=true
priority=higher,normal
mapperfile=mapper-0.74.map
usescancodes=true

[dosbox]
# language: Выбирает другой языковой файл.
#  machine: Тип машины, который будет эмулироваться.
#           Возможные значения: hercules, cga, tandy, pcjr, ega, vgaonly, svga_s3, svga_et3000, svga_et4000, svga_paradise, vesa_nolfb, vesa_oldvbe.
# captures: Директория, куда будут сохраняться такие вещи, как wave, midi, скриншоты.
#  memsize: Величина памяти для DOSBox в мегабайтах.
#             Это значение лучше оставить по умолчанию, чтобы избежать проблем с некоторыми играми,
#             хотя некоторые другие могут потребовать больших значений.
#             Увеличение этого значения в общем случае не повышает быстродействие.

language=/usr/share/doc/dosbox-0.74/DOSBox-russian-lang/russian.txt
machine=svga_s3
captures=capture
memsize=16

[render]
# frameskip: Сколько кадров DOSBox пропускает перед тем, как отрисовать один.
#    aspect: Выполнять коррекцию соотношения сторон. Если ваш метод вывода не поддерживает
#            масштабирование, это может замедлить работу!
#    scaler: Используется для увеличения/улучшения режимов с низким разрешением.
#            Если после основного значения указано включено 'forced', масштабирование
#            будет использовано, даже если результат может быть нежелательным.
#            Возможные значения: none, normal2x, normal3x, advmame2x, advmame3x, advinterp2x, advinterp3x, hq2x, hq3x, 2xsai, super2xsai, supereagle, tv2x, tv3x, rgb2x, rgb3x, scan2x, scan3x.

frameskip=0
aspect=false
scaler=normal2x

[cpu]
#      core: Ядро ЦПУ используемое в эмуляции. 'auto' переключает 'normal' на 'dynamic', если возможно.
#            Возможные значения: auto, dynamic, normal, simple.
#   cputype: Тип ЦПУ используемый в эмуляции. 'auto' выбирает самый быстрый вариант.
#            Возможные значения: auto, 386, 386_slow, 486_slow, pentium_slow, 386_prefetch.
#    cycles: Число инструкций, которое DOSBox пытается эмулировать каждую  миллисекунду.
#            Установка выше возможностей вашей машины может привести к прерываниям звука и лагам.
#            Может быть установлено тремя способами:
#              'auto'          пытается подобрать нужное игре значение.
#                              Это обычно работает, но для некоторых игр создает проблемы.
#              'fixed #число'  устанавливает фиксированное число циклов. Это то, что обычно нужно, если не сработало 'auto'.
#                              (Например: fixed 4000)
#              'max'           выставит максимальное число циклов, на которое способен ваш компьютер
#          
#            Возможные значения: auto, fixed, max.
#   cycleup: Число циклов для увеличения/уменьшения основного значения по нажатии комбинации клавиш (CTRL-F11/CTRL-F12).
# cycledown: Установка значения менее 100 задаёт изменение основного значения в процентах.

core=auto
cputype=auto
cycles=auto
cycleup=10
cycledown=20

[mixer]
#   nosound: Включает тихий режим, хотя звук все равно эмулируется.
#      rate: Темп микшера. Настройка значения темпа любого другого устройства выше,
#            чем этот возможно ухудшит их качество звука.
#            Возможные значения: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716.
# blocksize: Размер блоков микшера, увеличение блоков может помочь с заиканием
#            звука, но звук будет больше отставать.
#            Возможные значения: 1024, 2048, 4096, 8192, 512, 256.
# prebuffer: Сколько миллисекунд данных держать перед размером блока микшера.

nosound=false
rate=44100
blocksize=1024
prebuffer=20

[midi]
#     mpu401: Тип MPU-401 для эмуляции.
#             Возможные значения: intelligent, uart, none.
# mididevice: Устройство, которое будет получать данные MIDI от MPU-401.
#             Возможные значения: default, win32, alsa, oss, coreaudio, coremidi, none.
# midiconfig: Специальные конфигурационные опции для устройства. Обычно это id
#             устройства, которое хотите использовать. Обратитесь к README/Руководству за подробностями.

mpu401=intelligent
mididevice=default
midiconfig=

[sblaster]
#  sbtype: Тип эмулируемого SoundBlaster. Значение gb означает Gameblaster.
#          Возможные значения: sb1, sb2, sbpro1, sbpro2, sb16, gb, none.
#  sbbase: Адрес порта ввода/вывода (IO) SoundBlaster.
#          Возможные значения: 220, 240, 260, 280, 2a0, 2c0, 2e0, 300.
#     irq: Номер прерывания (IRQ) SoundBlaster.
#          Возможные значения: 7, 5, 3, 9, 10, 11, 12.
#     dma: Номер ПДП (DMA) SoundBlaster.
#          Возможные значения: 1, 5, 0, 3, 6, 7.
#    hdma: Номер верхнего ПДП (High DMA) SoundBlaster.
#          Возможные значения: 1, 5, 0, 3, 6, 7.
# sbmixer: Позволить микшеру SoundBlaster модифицировать микшер DOSBox.
# oplmode: Тип эмуляции OPL. При 'auto' режим определяется типом SoundBlaster.
#          Все режимы OPL совместимы с Adlib, кроме 'cms'.
#          Возможные значения: auto, cms, opl2, dualopl2, opl3, none.
#  oplemu: Реализация эмуляции OPL. Возможно 'compat' сможет обеспечить лучшее качество (см. также 'oplrate').
#          Возможные значения: default, compat, fast.
# oplrate: Темп эмуляции OPL музыки. Укажите 49716 для наилучшего качества (установите соответствующий темп микшера).
#          Возможные значения: 44100, 49716, 48000, 32000, 22050, 16000, 11025, 8000.

sbtype=sb16
sbbase=220
irq=7
dma=1
hdma=5
sbmixer=true
oplmode=auto
oplemu=default
oplrate=44100

[gus]
#      gus: Включить эмуляцию Gravis Ultrasound.
#  gusrate: Темп эмуляции Gravis Ultrasound.
#           Возможные значения: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716.
#  gusbase: Адрес порта ввода/вывода (IO) Gravis Ultrasound.
#           Возможные значения: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300.
#   gusirq: Номер прерывания (IRQ) Gravis Ultrasound.
#           Возможные значения: 5, 3, 7, 9, 10, 11, 12.
#   gusdma: Номер ПДП (DMA) Gravis Ultrasound.
#           Возможные значения: 3, 0, 1, 5, 6, 7.
# ultradir: Путь к директории Gravis Ultrasound. В этой директории должна быть директория
#           MIDI, которая содержит файлы патчей для воспроизведения GUS. Файлы патчей,
#           используемые с Timidity должны работать нормально.

gus=false
gusrate=44100
gusbase=240
gusirq=5
gusdma=3
ultradir=C:\ULTRASND

[speaker]
# pcspeaker: Включить эмуляцию динамика ПК.
#    pcrate: Темп генерации звука динамика ПК.
#            Возможные значения: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716.
#     tandy: Включить эмуляцию звуковой системы Tandy. Для режима 'auto' эмуляция включается,
#            только если тип машины установлен как 'tandy'.
#            Возможные значения: auto, on, off.
# tandyrate: Темп генерации трёхголосого Tandy.
#            Возможные значения: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716.
#    disney: Включить эмуляцию Disney Sound Source. Совместимо с Covox Voice Master and
#            Speech Thing.

pcspeaker=true
pcrate=44100
tandy=auto
tandyrate=44100
disney=true

[joystick]
# joysticktype: Типы джойстиков для эмуляции: auto (установлено по умолчанию), none,
#               2axis (поддерживается два джойстика),
#               4axis (поддерживается один джойстик, используется первый),
#               4axis_2 (поддерживается один джойстик, используется второй),
#               fcs (Thrustmaster), ch (CH Flightstick).
#               none отключает эмуляцию джойстика.
#               auto выбирает значение в зависимости от реально подключенного джойстика(ов).
#               (Не забудьте сбросить настройку раскладки клавиш DOSBox, если вы её сохраняли.)
#               Возможные значения: auto, 2axis, 4axis, 4axis_2, fcs, ch, none.
#        timed: Включить временные интервалы для осей. Поэкспериментируйте с этим параметром, если джойстик "уплывает".
#     autofire: Кнопки продолжают нажиматься постоянно, пока вы их держите нажатыми.
#       swap34: Меняет местами 3ю и 4ю оси джойстика (может быть полезно для некоторых
#               моделей джойстиков).
#   buttonwrap: Осуществляет подмену количества реальных кнопок на количество эмулируемых.

joysticktype=auto
timed=true
autofire=false
swap34=false
buttonwrap=false

[serial]
# serial1: Устанавливает тип устройства, соединенного с COM портом.
#          Может быть: disabled, dummy, modem, nullmodem, directserial.
#          Дополнительные параметры должны быть заданы на той же строке, в виде
#          параметр:значение. Параметры для всех типов: irq  (необязательно).
#          для directserial: realport (необходимо), rxdelay (необязательно).
#                           (realport:COM1 realport:ttyS0).
#          для modem: listenport (необязательно).
#          для nullmodem: server, rxdelay, txdelay, telnet, usedtr,
#                         transparent, port, inhsocket (все - необязательно).
#          Пример: serial1=modem listenport:5000
#          Возможные значения: dummy, disabled, modem, nullmodem, directserial.
# serial2: См. serial1
#          Возможные значения: dummy, disabled, modem, nullmodem, directserial.
# serial3: См. serial1
#          Возможные значения: dummy, disabled, modem, nullmodem, directserial.
# serial4: См. serial1
#          Возможные значения: dummy, disabled, modem, nullmodem, directserial.

serial1=dummy
serial2=dummy
serial3=disabled
serial4=disabled

[dos]
#            xms: Включить поддержку XMS.
#            ems: Включить поддержку EMS.
#            umb: Включает поддержку UMB.
# keyboardlayout: Код языка для клавиатурной раскладки (или 'none').

xms=true
ems=true
umb=true
keyboardlayout=RU

[ipx]
# ipx: Включает эмуляцию ipx над UDP/IP.

ipx=false

[autoexec]
# Команды в этой секции будут выполнены при запуске.
# Вы можете указать здесь ваши команды монтирования устройств (MOUNT).
# Каталог /home/user/dosbox/drive_c будет диском C:\
mount c: /home/user/dosbox/drive_c
# Каталог /home/user/Desktop, т.е. рабочий стол будет диском D:\
mount d: /home/user/Desktop
# Переход на диск D:\, чтобы задать его текущим каталогом для Turbo Pascal
d:
# Запуск Turbo Pascal с автоматическим созданием файла unnamed.pas
c:\tp7_1\BIN\turbo.exe d:\unnamed.pas

6. Далее нужно сказать DosBox, что комбинация клавиш CTRL+F9 не должна закрывать его. Вообще можно запустить DosBox и нажать CTRL+F1 для переназначения клавиш, и там щелкнуть по Shutdown, затем слева щелкнуть по mod1 и mod2. mod1 - это CTRL, mod2 - ALT. Таким образом, DosBox будет закрываться нажатием CTRL+ALT+F9.
Это было отступление. Так как далее будем писать скрипт для автоматизации всего этого дела, то я предлагаю создать файл назначения клавиш для DosBox.
gedit /home/user/.dosbox/mapper-0.74.map

Содержимое mapper-0.74.map:

hand_shutdown "key 290 mod1 mod2"
hand_capmouse "key 291 mod1"
hand_fullscr "key 13 mod2"
hand_pause "key 19 mod2"
hand_mapper "key 282 mod1"
hand_speedlock "key 293 mod2"
hand_recwave "key 287 mod1"
hand_caprawmidi "key 289 mod1 mod2"
hand_scrshot "key 286 mod1"
hand_video "key 286 mod1 mod2"
hand_decfskip "key 288 mod1"
hand_incfskip "key 289 mod1"
hand_cycledown "key 292 mod1"
hand_cycleup "key 293 mod1"
hand_caprawopl "key 288 mod1 mod2"
hand_swapimg "key 285 mod1"
key_esc "key 27"
key_f1 "key 282"
key_f2 "key 283"
key_f3 "key 284"
key_f4 "key 285"
key_f5 "key 286"
key_f6 "key 287"
key_f7 "key 288"
key_f8 "key 289"
key_f9 "key 290"
key_f10 "key 291"
key_f11 "key 292"
key_f12 "key 293"
key_grave "key 96"
key_1 "key 49"
key_2 "key 50"
key_3 "key 51"
key_4 "key 52"
key_5 "key 53"
key_6 "key 54"
key_7 "key 55"
key_8 "key 56"
key_9 "key 57"
key_0 "key 48"
key_minus "key 45"
key_equals "key 61"
key_bspace "key 8"
key_tab "key 9"
key_q "key 113"
key_w "key 119"
key_e "key 101"
key_r "key 114"
key_t "key 116"
key_y "key 121"
key_u "key 117"
key_i "key 105"
key_o "key 111"
key_p "key 112"
key_lbracket "key 91"
key_rbracket "key 93"
key_enter "key 13"
key_capslock "key 301"
key_a "key 97"
key_s "key 115"
key_d "key 100"
key_f "key 102"
key_g "key 103"
key_h "key 104"
key_j "key 106"
key_k "key 107"
key_l "key 108"
key_semicolon "key 59"
key_quote "key 39"
key_backslash "key 92"
key_lshift "key 304"
key_lessthan "key 60"
key_z "key 122"
key_x "key 120"
key_c "key 99"
key_v "key 118"
key_b "key 98"
key_n "key 110"
key_m "key 109"
key_comma "key 44"
key_period "key 46"
key_slash "key 47"
key_rshift "key 303"
key_lctrl "key 306"
key_lalt "key 308"
key_space "key 32"
key_ralt "key 307"
key_rctrl "key 305"
key_printscreen "key 316"
key_scrolllock "key 302"
key_pause "key 19"
key_insert "key 277"
key_home "key 278"
key_pageup "key 280"
key_delete "key 127"
key_end "key 279"
key_pagedown "key 281"
key_up "key 273"
key_left "key 276"
key_down "key 274"
key_right "key 275"
key_numlock "key 300"
key_kp_divide "key 267"
key_kp_multiply "key 268"
key_kp_minus "key 269"
key_kp_7 "key 263"
key_kp_8 "key 264"
key_kp_9 "key 265"
key_kp_plus "key 270"
key_kp_4 "key 260"
key_kp_5 "key 261"
key_kp_6 "key 262"
key_kp_1 "key 257"
key_kp_2 "key 258"
key_kp_3 "key 259"
key_kp_enter "key 271"
key_kp_0 "key 256"
key_kp_period "key 266"
jbutton_0_0
jbutton_0_1
jaxis_0_1-
jaxis_0_1+
jaxis_0_0-
jaxis_0_0+
jbutton_0_2
jbutton_0_3
jbutton_1_0
jbutton_1_1
jaxis_0_2-
jaxis_0_2+
jaxis_0_3-
jaxis_0_3+
jaxis_1_0-
jaxis_1_0+
jaxis_1_1-
jaxis_1_1+
jbutton_0_4
jbutton_0_5
jhat_0_0_0
jhat_0_0_3
jhat_0_0_2
jhat_0_0_1
mod_1 "key 306" "key 305"
mod_2 "key 308" "key 307"
mod_3

7. Готово. Можно запустить DosBox и проверить, что Turbo Pascal запускается.
8. Сейчас напишем скрипт, чтобы автоматизировать процесс. Создадим отдельную папку:
mkdir /home/user/turbo
mkdir /home/user/turbo/dosbox

в каталог dosbox скопируем файлы настроек DosBox:
cp /home/user/.dosbox/* /home/user/turbo/dosbox/

в каталог сам Turbo Pascal:
cp /home/user/dosbox/drive_c/tp7_1 /home/user/turbo/

и, собственно, скрипт:
gedit /home/user/turbo/instp

Пишем ($PWD - текущая директория):

#!/bin/sh
mkdir /home/user/dosbox
mkdir /home/user/dosbox/drive_c
cp -r $PWD/tp7_1 /home/user/dosbox/drive_c/
mkdir /home/user/.dosbox
cp $PWD/dosbox/* /home/user/.dosbox/
# Если скрипт будете выполнять из под root, то нужны еще два строки
chown -R user:user /home/user/dosbox
chown -R user:user /home/user/.dosbox

9. Еще можно было бы ярлык на рабочий стол поставить, но это сами распишите в скрипте.
Вот и все. Папку turbo можно закинуть на флешку или в сетевую папку, а потом с каждого компа заходить в нее и выполнять команду
sh instp

На  ALT Linux 6 Centaurus все это дело ставиться также, как на  ALT Linux школьный 5.

Если данная инструкция оказалась полезной для вас, напишите, пожалуйста, об этом в комментарии.

понедельник, 10 декабря 2012 г.

PPPoE-сервер на Ubuntu 12.04 LTS

Задача: поднять PPPoE-сервер на базе Ubuntu 12.04 LTS.

Выполнение:
1. Установим пакет pppoe:
sudo apt-get install pppoe
2. Создадим файл параметров pppoe-сервера:
sudo gedit /etc/ppp/pppoe-server-options
Пишем:

# PPP options for the PPPoE server
# LIC: GPL
auth
require-chap
lcp-echo-interval 10
lcp-echo-failure 2
#Указываем DNS-серверы, которые наш pppoe-сервер будет давать клиентам
ms-dns 8.8.8.8
ms-dns 8.8.4.4
noipdefault
noipx
nodefaultroute
noproxyarp
# Указываем маску подсети, которую получат клиенты
netmask 255.255.255.255
#Путь к логу
logfile /var/log/log.pppoe

3. Теперь отредактируем файл учетных записей pppoe-сервера:
sudo gedit /etc/ppp/chap-secrets
Пишем:

# Secrets for authentication using CHAP
# client server secret IP addresses
#Параметры в строке отделяются друг от друга пробелами или табуляцией
"testlogin" * "testpass" 192.168.5.10

4. Пропишем запуск pppoe-сервера в автозагрузку:
sudo gedit /etc/rc.local
Пишем:
#Запускаем pppoe-сервер
sudo pppoe-server -I eth1 -L 192.168.5.1 -R 192.168.5.10

, где
eth1 - сетевой интерфейс, на котором будет запускаться pppoe-сервер. У меня eth1 смотрит в локальную сеть;
192.168.5.1 - ip-адрес pppoe-сервера;
192.168.5.10 - ip-адрес, начиная с которого pppoe-сервер будет выдавать ip-адреса клиентам;

5. Готово. Теперь на каком-нибудь компьютере локальной сети можете создать pppoe-соединение (В Windows это "Высокоскоростное подключение, запрашивающее имя и пароль") и попробовать подключиться к нашему PPPoE-серверу.

6. Теперь предположим, что pppoe-сервер предназначен для предоставления доступа к сети Интернет. То есть клиенты должны получать доступ к Интернету.
sudo gedit /etc/rc.local
добавим
#Разрешаем форвардинг
sudo echo 1 > /proc/sys/net/ipv4/ip_forward
#Выполняем скрипт настройки iptables
sudo sh /home/jc/inet

7. Создадим небольшой скрипт для настройки iptables:
sudo gedit /home/jc/inet
Пишем:

#!/bin/sh
#Переменные
iptables_dir='/sbin/iptables'
inet_iface=eth0
#Собственно настройка iptables
#В POSTROUTING таблицы NAT разрешить маскарадинг на тот сетевой интерфейс, который смотрит в сеть провайдера (Интернет) (inet_iface)
$iptables_dir -t nat -A POSTROUTING -o $inet_iface -j MASQUERADE
# Политика по умолчанию - все разрешено (ACCEPT)
$iptables_dir -P INPUT ACCEPT
$iptables_dir -P FORWARD ACCEPT
$iptables_dir -P OUTPUT ACCEPT

Главное - это разрешить маскарадинг и форвардинг. Текущие настройки iptables можно посмотреть командой
sudo iptables-save


8. Готово. Теперь у клиентов PPPoE-сервера есть доступ к Интернет. Сейчас перепишем скрипт настройки iptables для того, чтобы обеспечить безопасность соединения с Интернетом.
sudo gedit /home/jc/inet

#!/bin/sh
# Переменные:
# Сетевой интерфейс, смотрящий с сеть провайдера (Интернет)
inet_iface=eth0
# Сетевые интерфейсы, смотрящиие в локальную сеть
local_iface=ppp+
# Локальная сеть (подсеть PPPoE-сервера)
local_network=192.168.5.0/24
# Предпочитаемый DNS сервер
dns_main=8.8.8.8
# Альтернативный DNS сервер
dns_alt=8.8.4.4
# Шлюз по умолчанию
gateip=10.0.1.1
iptables_dir='/sbin/iptables'

# ----------Установка политик по умолчанию-------------
# 1. Очищаем все цепочки и устанавливаем политику по умолчанию в соответствии с принципом "Все, что не разрешено - запрещено"
$iptables_dir -F INPUT
$iptables_dir -F FORWARD
$iptables_dir -F OUTPUT
$iptables_dir -t mangle -F
$iptables_dir -t nat -F
$iptables_dir -t filter -F

$iptables_dir -P INPUT DROP
$iptables_dir -P FORWARD DROP
$iptables_dir -P OUTPUT DROP

# 2. В POSTROUTING таблицы NAT разрешить маскарадинг на тот сетевой интерфейс, который смотрит в сеть провайдера (Интернет) (inet_iface)
$iptables_dir -t nat -A POSTROUTING -o $inet_iface -j MASQUERADE

# --------------Настройки безопасности-------------------------------
# 4. (проверено) Скидываем все пакеты, пришедшие с интерфейса, смотрящего в сеть провайдера (Интернет) со статусом NEW
$iptables_dir -A FORWARD -i $inet_iface -m state --state NEW -j DROP

# 4.1  Скидываем все пакеты, пришедшие с интерфейса, смотрящего в сеть провайдера (Интернет), и уходящие туда же
$iptables_dir -A FORWARD -i $inet_iface -o $inet_iface -j DROP

# 4.2 Скидываем все пакеты, пришедшие с интерфейса, смотрящего в сеть провайдера (Интернет) с адресов локальных сетей классов A,B,C,D,E и адресов, не использующихся в Интернете
$iptables_dir -A FORWARD -i $inet_iface -s 172.16.0.0/12 -j DROP
$iptables_dir -A FORWARD -i $inet_iface -s 192.168.0.0/16 -j DROP
$iptables_dir -A FORWARD -i $inet_iface -s 10.0.0.0/8 -j DROP
$iptables_dir -A FORWARD -i $inet_iface -s 224.0.0.0/3 -j DROP
$iptables_dir -A FORWARD -i $inet_iface -s 127.0.0.0/8 -j DROP
$iptables_dir -A FORWARD -i $inet_iface -s 0.0.0.0/8 -j DROP

# Активация TCP SYN Cookie Protection
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

# Отключение IP Source Routing
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route

# Отключение ICMP Redirect
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects

# Активация IP Spoofing Protection
echo 1 >  /proc/sys/net/ipv4/conf/all/rp_filter

# Игнорирование Broadcast Request
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

#  Отбрасывать все пакеты, которые не могут быть идентифицированы и поэтому не могут иметь определенного статуса.
$iptables_dir -A FORWARD -m state --state INVALID -j DROP

# ------------Безопасное взаимодействие с DNS серверами-----------------------

# Запрещаем клиентам обмен данными с основным DNS сервером не по порту 53

$iptables_dir -A FORWARD -i $local_iface -p UDP -s $local_network --dport 53 -d $dns_main -o $inet_iface -j ACCEPT
$iptables_dir -A FORWARD -i $local_iface -s $local_network -d $dns_main -o $inet_iface -j DROP

# Запрещаем клиентам обмен данными с альтернативным DNS сервером не по порту 53
$iptables_dir -A FORWARD -i $local_iface -p UDP -s $local_network --dport 53 -d $dns_alt -o $inet_iface -j ACCEPT
$iptables_dir -A FORWARD -i $local_iface -s $local_network -d $dns_alt -o $inet_iface -j DROP

# Запрещаем основному DNS серверу обмен данными с клиентами не по порту 53
$iptables_dir -A FORWARD -i $inet_iface -p UDP -s $dns_main --sport 53 -d $local_network -o $local_iface -j ACCEPT
$iptables_dir -A FORWARD -i $inet_iface -s $dns_main -d $local_network -o $local_iface -j DROP

# Запрещаем альтернативному DNS серверу обмен данными с клиентами не по порту 53
$iptables_dir -A FORWARD -i $inet_iface -p UDP -s $dns_alt --sport 53 -d $local_network -o $local_iface -j ACCEPT
$iptables_dir -A FORWARD -i $inet_iface -s $dns_alt -d $local_network -o $local_iface -j DROP

# ----------------------------------------------------------------------------

# 5. Разрешаем транзитные пакеты с адресов локальной сети, пришедшие с локального сетевого интерфейса local_iface, которые идут в сеть провайдера (Интернет) (inet_iface), со статусами NEW, ESTABLISHED и RELATED
$iptables_dir -A FORWARD -i $local_iface -s $local_network -o $inet_iface -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

# 6. Разрешаем прохождение пакетов с сетевого интерфейса, смотрящего в сеть провайдера (Интернет) на сетевой(ые) интерфейс(ы) ($inet_iface) локальной сети со статусом ESTABLISHED
$iptables_dir -A FORWARD -i $inet_iface -d $local_network -o $local_iface -m state --state ESTABLISHED -j ACCEPT

9. Теперь предположим, что на одном из клиентов PPPoE-сервера работает Web-сервер и, соответственно, он должен быть доступен из Интернета. Внесем в скрипт соответствующие изменения:
sudo gedit /home/jc/inet
В начале, где объявляются переменные, добавим:
# Адрес Web-сервера в локальной сети
web_ip=192.168.5.10
# Порт Web-сервера  в локальной сети
web_port=80

Далее после установки политик по умолчанию
# ----------Настройки для работоспособности Web-сервера-------------

# 1.1 Разрешаем проходящие входящие пакеты на адрес Web-cервера и его порт
$iptables_dir -I FORWARD -i $inet_iface -d $web_ip -p tcp --dport $web_port -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

# 1.2. Перед началом маршрутизации пакетов, идущих к нам на порт Web-сервера меняем адрес получателя на адрес Web-сервера в локальной сети
$iptables_dir -t nat -I PREROUTING -d $inet_ip -p tcp --dport $inet_port -j DNAT --to-destination $web_ip:$web_port

# 1.3. Делаем маскарадинг для пакетов, уходящих на Web-сервер в локальную сеть
$iptables_dir -t nat -I POSTROUTING -d $web_ip -p tcp --dport $web_port -j  MASQUERADE

10. Итак, Web-сервер доступен из Интернет. Допустим, встала следующая задача: ограничить скорость для некоторых (или каждого) клиентов. Приведенное ниже решение может быть корявым, но оно работает и вполне применимо в том случае, если клиентов не очень много. Ограничение скорости будем делать с помощью tc.
sudo gedit /etc/ppp/ip-up
В конец добавим:

# Указываем, где находится tc
traf_control=/sbin/tc
# Поднимаемый сетевой интерфейс
INET_DEV=$1

# Ограничение скорости для Web-сервера. К примеру, имеем канал подключения к Интернету со скоростью 1Мбит/с. Ограничим скорость для Web-сервера до 80Кбайт/c. $5 - ip-адрес поднимаемого сетевого интерфейса.
if [ "$5" = "192.168.5.10" ]; then
# 1. Очищаем все правила tc
$traf_control qdisc del dev $INET_DEV root
# 2. Объявляем главную дисциплину обработки исходяшей очереди для устройства $INET_DEV
$traf_control qdisc add dev $INET_DEV root handle 1: htb default 12
# 3. Объявляем корневой класс главной дисциплины обработки исходящей очереди $INET_DEV
$traf_control class add dev $INET_DEV parent 1: classid 1:1 htb rate 1024kbit ceil 1024kbit
# 4. Объявляем подкласс корневого класса для ограничения скорости
$traf_control class add dev $INET_DEV parent 1:1 classid 1:10 htb rate 80kBps ceil 80kBps
# 5. Объявляем подкласс корневого класса для ограничения скорости пакетов,не попавших под правила
#$traf_control class add dev $INET_DEV parent 1:1 classid 1:12 htb rate 60kBps ceil 60kBps
# Объявляем фильтр для созданного подкласса 1:10
$traf_control filter add dev $INET_DEV protocol ip parent 1: prio 1 u32 match ip dst 192.168.5.10 flowid 1:10
fi

Для того, чтобы ограничить скорость для другого клиента, необходимо добавить приведенный выше блок if ...fi , изменив ip-адрес и, если нужно, скорость. Клиенты, для которых не введены ограничения, могут занимать Интернет-канал полностью.

Если данная инструкция оказалась полезной для вас, напишите, пожалуйста, об этом в комментарии.

пятница, 17 августа 2012 г.

Почтовый сервер на базе Postfix, Dovecot и Ubuntu 12.04 LTS


Задача: поднять почтовый сервер на базе Postfix, Dovecot 2.x и Ubuntu 12.04 LTS.

Настоящая инструкция была проверена на Ubuntu 12.04  и 12.04.1

Использованные источники:
8. man 5 master

Выполнение (старый вариант с ошибками):
I. Для начала поднимем почтовый сервер с авторизацией по паролю, пароли будут храниться в текстовом файле. Тип почтовых ящиков - maildir.
1.Установим Postfix и Dovecot:
sudo apt-get install postfix dovecot-common dovecot-imapd

Отказываемся от предложенных вариантов настроек postfix, т.е. выбираем вариант "Без конфигурации" (No configuration).
2. Создаем основной файл конфигурации Postfix:
sudo touch /etc/postfix/main.cf

3. Редактируем его:
sudo gedit /etc/postfix/main.cf

#Так наш сервер будет представляться при отправке и получении почты
smtpd_banner = $myhostname ESMTP (Ubuntu)
#Отключаем использование comsat
biff = no
#Запрещаем автоматически дополнять неполное доменное имя в адресе письма
append_dot_mydomain = no
#Указываем каталог очереди для Postfix
queue_directory = /var/spool/postfix
#Указываем имя нашего хоста
myhostname = ubuntu.myubuntu.org
# Указываем файл с превдонимами почтовых ящиков
alias_maps = hash:/etc/postfix/aliases
#Указываем, для каких доменов будем принимать почту
mydestination = localhost
#Указываем список доверенных подсетей
#mynetworks = 127.0.0.0/8
# Не будем устанавливать лимит на размер почтовых ящиков
mailbox_size_limit = 0
recipient_delimiter = +
#Указываем прослушивание на всех подсетях
inet_interfaces = all
#Указываем обязательность использование клиентами команды helo
smtpd_helo_required = yes

#Далее идет настройка ограничений для приема почты
#Принимаем всю почту от нашей доверенной подсети
smtpd_recipient_restrictions =  permit_mynetworks,  permit_sasl_authenticated, reject_unauth_destination
#Проверяем, не представились ли нами самими
#check_helo_access = hash:/etc/postfix/helo.list,
#Если отправитель письма из внешнего мира представляется, что он из нашего домена - отвергаем письмо
#check_sender_access = hash:/etc/postfix/ext_sender,
#Отвергаем письмо, если получатель не входит в нашу зону ответственности
#reject_unauth_destination = yes,
#Отклоняем письма от неизвестных доменов
#reject_unknown_sender_domain = yes,
#Отклоняем письма для неизвестных доменов
#reject_unknown_recipient_domain = yes,
#Отклоняем письма для пользователей с неполным именем домена
#reject_non_fqdn_recipient = yes,
#Отклоняем письма от отправителей с неполным именем домена
#reject_non_fqdn_sender = yes,
#Отвергаем сообщения от любого клиента, не предоставившего полностью определенное доменное имя хоста
#reject_non_fqdn_hostname = yes,
#Отвергаем сообщение, если в команде helo неправильно сформировано имя домена
#reject_invalid_hostname = yes,
#Отвергаем сообщения, если клиент представился неизвестным именем хоста
#reject_unknown_hostname = yes

4. Создаем
sudo touch /etc/postfix/helo.list
5. Редактируем
sudo gedit /etc/postfix/helo.list

Пишем:
myubuntu.org 550 Don't use my hostname
6. Прохешируем его:
sudo postmap /etc/postfix/helo.list
7. Создаем
sudo touch /etc/postfix/ext_sender
8. Редактируем
sudo gedit /etc/postfix/ext_sender
Пишем:
myubuntu.org 450 Do not use my domain in your envelope sender
9. Прохешируем его:
sudo postmap /etc/postfix/ext_sender
10. Создадим файл псевдонимов:
sudo touch /etc/postfix/aliases
11. Редактируем файл псевдонимов
sudo gedit /etc/postfix/aliases
запишем туда:
postmaster root
12. Прохешируем его:
sudo postmap /etc/postfix/aliases

   ---настройка dovecot---
13. Редактируем конфигурационный файл dovecot
sudo gedit /etc/dovecot/dovecot.conf

Пишем:
#Описываем поддерживаемые протоколы, pop3 не будем использовать
protocols = imap
#Разрешаем авторизацию в plaintext
disable_plaintext_auth = no
#Описываем логирование
# Каталог
log_path = /var/log/dovecot.err
# Формат даты и времени для регистрируемых событий
log_timestamp = "%Y-%m-%d %H:%M:%S "
#Отключаем SSL
ssl = no
#Строка приветствия при ответе сервера
login_greeting = Dovecot ready.
#Описываем тип (maildir) и местонахождения почтовых ящиков (/var/spool/mail/%d/%n) %d - имя сервера, %n - имя пользователя
mail_location = maildir:/var/spool/mail/myubuntu.org/%n
#Задаем идентификатор пользователя и группы, с которыми будет работать dovecot
mail_uid = 5000
mail_gid = 5000
mail_privileged_group = mail
valid_chroot_dirs = /var/spool/mail/
#Настраиваем вывод отладочных сообщений
auth_verbose = yes
auth_debug = yes
auth_debug_passwords = yes
#Типы допустимых вариантов аутентификации
auth_mechanisms = plain login digest-md5

#Задаем путь к файлу с паролями
passdb {
  driver = passwd-file
  # Each domain has a separate passwd-file:
  args = /etc/dovecot/pass
}
 # Для того, чтобы postfix мог использовать авторизацию через dovecot
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    # Assuming the default Postfix user and group
    user = postfix
    group = postfix       
  }
}

15. Добавляем в систему пользователя virtual и группу virtual
sudo groupadd -g 5000 virtual
sudo useradd -g virtual -u 5000 virtual
16. Создадим каталог, где будут размещаться почтовые ящики пользователей:
sudo mkdir /var/spool/mail/myubuntu.org
sudo chown virtual:virtual  /var/spool/mail/myubuntu.org
sudo chmod 770 /var/spool/mail/myubuntu.org
17. Редактируем конфигурационный файл postfix
sudo gedit /etc/postfix/master.cf
добавляем одну! строку:
dovecot unix - n n - - pipe flags=DRhu user=virtual:virtual argv=/usr/local/libexec/dovecot/deliver -d ${recipient}
18. Редактируем конфигурационный файл postfix
sudo gedit /etc/postfix/main.cf
добавляем:
#Описываем доступ к локальным почтовым ящикам
virtual_mailbox_domains = myubuntu.org
virtual_mailbox_base = /var/spool/mail
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_minimum_uid = 100
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_alias_maps = hash:/etc/postfix/virtual
home_mailbox = Maildir/
local_recipient_maps = $virtual_mailbox_maps
#Описываем авторизацию по SMTP для клиентов не из доверенной зоны
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
#broken_sasl_auth_clients = yes

19. Создаем файлы
sudo touch /etc/postfix/vmailbox
sudo touch /etc/postfix/virtual
20. Редактируем
sudo gedit /etc/postfix/vmailbox

Пишем:
user1@myubuntu.org myubuntu.org/user1/
user2@myubuntu.org myubuntu.org/user2/

21. Редактируем файл алиасов почтовых ящиков
sudo gedit /etc/postfix/virtual

Пишем:
user3@myubuntu.org user1@myubuntu.org

22. Перечитываем файлы конфигурации
sudo postmap /etc/postfix/virtual
sudo postmap /etc/postfix/vmailbox 

23. Перезапускаем postfix:
sudo service postfix restart

24. Создаем файл, в котором будут расположены пользователи почтового сервера и их пароли:
sudo touch /etc/dovecot/pass

Далее получаем хеш для паролей пользователей:
doveadm pw -s SHA512-CRYPT -u user1@myubuntu.org

примерный результат после ввода пароля "123":
{SHA512-CRYPT}$6$7x.iFM/rgVFg7AWV$VFGPXrviBHwvvJ.mVrz/pZVroc76QaAWBtbGohL6ckubUXFeZopucICgQ.y4hrc0EpPDcbNedwKKa0o4JjOmN0

doveadm pw -s SHA512-CRYPT -u user2@myubuntu.org

примерный результат после ввода пароля "456":
{SHA512-CRYPT}$6$AV5kfwlyUPSjOrN.$6tv4iKIqWrgpVQKwy4pl09p4eEvrYv4ttk1rSErhS48XwFKQb/qUCwFIBswTjc/OxDQX.vQLOGZ.2FSaySbmu/

25. Записываем полученные хеши в /etc/dovecot/pass:
sudo gedit /etc/dovecot/pass

Пишем две! строки:
user1:{SHA512-CRYPT}$6$7x.iFM/rgVFg7AWV$VFGPXrviBHwvvJ.mVrz/pZVroc76QaAWBtbGohL6ckubUXFeZopucICgQ.y4hrc0EpPDcbNedwKKa0o4JjOmN0
user2:{SHA512-CRYPT}$6$AV5kfwlyUPSjOrN.$6tv4iKIqWrgpVQKwy4pl09p4eEvrYv4ttk1rSErhS48XwFKQb/qUCwFIBswTjc/OxDQX.vQLOGZ.2FSaySbmu/

26. Настройка завершена. Приведу получившиеся файлы конфигурации Postfix и Dovecot:
/etc/postfix/main.cf :
#Так наш сервер будет представляться при отправке и получении почты
smtpd_banner = $myhostname ESMTP (Ubuntu)
#Отключаем использование comsat
biff = no
#Запрещаем автоматически дополнять неполное доменное имя в адресе письма
append_dot_mydomain = no
#Указываем имя нашего хоста
myhostname = ubuntu.myubuntu.org
# Указываем файл с превдонимами почтовых ящиков
alias_maps = hash:/etc/postfix/aliases
#Указываем, для каких доменов будем принимать почту
mydestination = localhost
# Не будем устанавливать лимит на размер почтовых ящиков
mailbox_size_limit = 0
recipient_delimiter = +
#Указываем прослушивание на всех подсетях
inet_interfaces = all
#Указываем обязательность использование клиентами команды helo
smtpd_helo_required = yes
#Описываем доступ к локальным почтовым ящикам
virtual_mailbox_domains = myubuntu.org
virtual_mailbox_base = /var/spool/mail
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_minimum_uid = 100
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_alias_maps = hash:/etc/postfix/virtual
home_mailbox = Maildir/
local_recipient_maps = $virtual_mailbox_maps
#Описываем авторизацию по SMTP для клиентов не из доверенной зоны
smtpd_sasl_type = dovecot
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
#broken_sasl_auth_clients = yes
#Указываем каталог очереди для Postfix
queue_directory = /var/spool/postfix
smtpd_recipient_restrictions =  permit_mynetworks,  permit_sasl_authenticated, reject_unauth_destination

/etc/postfix/master.cf :

# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
#
smtp      inet  n       -       -       -       -       smtpd
#628      inet  n       -       -       -       -       qmqpd
pickup    fifo  n       -       -       60      1       pickup
cleanup   unix  n       -       -       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
#qmgr     fifo  n       -       n       300     1       oqmgr
tlsmgr    unix  -       -       -       1000?   1       tlsmgr
rewrite   unix  -       -       -       -       -       trivial-rewrite
bounce    unix  -       -       -       -       0       bounce
defer     unix  -       -       -       -       0       bounce
trace     unix  -       -       -       -       0       bounce
verify    unix  -       -       -       -       1       verify
flush     unix  n       -       -       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       -       -       -       smtp
relay     unix  -       -       -       -       -       smtp
#       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq     unix  n       -       -       -       -       showq
error     unix  -       -       -       -       -       error
retry     unix  -       -       -       -       -       error
discard   unix  -       -       -       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       -       -       -       lmtp
anvil     unix  -       -       -       -       1       anvil
scache    unix  -       -       -       -       1       scache
maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail    unix  -       n       n       -       -       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -       n       n       -       -       pipe
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix    -    n    n    -    2    pipe
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman   unix  -       n       n       -       -       pipe
  flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
  ${nexthop} ${user}

dovecot unix - n n - - pipe flags=DRhu user=virtual:virtual argv=/usr/local/libexec/dovecot/deliver -d ${recipient}

/etc/dovecot/dovecot.conf :

#Описываем поддерживаемые протоколы, pop3 не будем использовать
protocols = imap
#Разрешаем авторизацию в plaintext
disable_plaintext_auth = no
#Описываем логирование
# Каталог
log_path = /var/log/dovecot.err
# Формат даты и времени для регистрируемых событий
log_timestamp = "%Y-%m-%d %H:%M:%S "
#Отключаем SSL
ssl = no
#Строка приветствия при ответе сервера
login_greeting = Dovecot ready.
#Описываем тип (maildir) и местонахождения почтовых ящиков (/var/spool/mail/%d/%n) %d - имя сервера, %n - имя пользователя
mail_location = maildir:/var/spool/mail/myubuntu.org/%n
#Задаем идентификатор пользователя и группы, с которыми будет работать dovecot
mail_uid = 5000
mail_gid = 5000
mail_privileged_group = mail
valid_chroot_dirs = /var/spool/mail/
#Настраиваем вывод отладочных сообщений
auth_verbose = yes
auth_debug = yes
auth_debug_passwords = yes
#Типы допустимых вариантов аутентификации
auth_mechanisms = plain login digest-md5
#Задаем путь к файлу с паролями
passdb {
  driver = passwd-file
  # Each domain has a separate passwd-file:
  args = /etc/dovecot/pass
}
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    # Assuming the default Postfix user and group
    user = postfix
    group = postfix       
  }
  }

27. Проверку конфигурации dovecot можно выполнить командой doveconf -a . Если выводится данные конфигурации dovecot, значит все в норме. В противном случае будет выделено сообщение с указанием ошибки.
Для проверки можно попробовать подключиться через telnet:
для проверки postfix:
telnet localhost smtp
В результате должно появиться примерно следующее:
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 имя хоста ESMTP (Ubuntu)

Для проверки dovecot:
telnet localhost imap
В результате должно появиться примерно следующее:
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
* OK [CAPABILITY] IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERALS ID ENABLE IDLE AUTH=PLAIN AUTH=LOGIN AUTH=DIGEST-MD5] Dovecot ready.

28. Для проверки на реальном клиенте установим Mozilla Thunderbird:
sudo apt-get install thunderbird

При добавлении в Thunderbird учетной записи, к примеру, user1 задаем следующие данные:
Your Name: user1
Email address: user1@myubuntu.org
Password: пароль
Incoming: IMAP, Server Hostname: имя нашего хоста (к примеру, localhost), Port: 143, SSL: None, Authentification: normal password
Outcoming: SMTP, Server Hostname: имя нашего хоста (к примеру, localhost), Port: 25, SSL: None, Authentification: normal password
Далее можно попробовать через Thunderbird написать письмо по адресу user2@myubuntu.org или user3@myubuntu.org (в этом случае письмо должно прийти пользователю user1, т.к. user3@myubuntu.org есть псевдоним для user1@myubuntu.org)

Теперь попробуем использовать mysql для хранения данных о почтовых ящиках, учетных записей пользователей и их паролей.

1. Устанавливаем MySQL и др.
sudo apt-get install mysql-server mysql-client postfix-mysql dovecot-mysql sasl2-bin

После установки MySQL задайте пароль для суперпользователя (root) MySQL.
2. Входим в MySQL
mysql -u root -p

Создаем базу данных
CREATE DATABASE mail;
USE mail;

Внимание! Далее будет использоваться пользователь mail_admin и его пароль mail_admin_password для доступа к базе данных почтовых аккаунтов в MySQL. Вместо mail_admin и mail_admin_password Вы можете задать свои значения.

GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';
FLUSH PRIVILEGES;
CREATE TABLE domains ( domain varchar(50) NOT NULL, PRIMARY KEY (domain) );
CREATE TABLE forwardings ( source varchar(80) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source) );
CREATE TABLE users ( user varchar(80) NOT NULL, email varchar(80) NOT NULL, password varchar(20) NOT NULL, PRIMARY KEY (email) );
CREATE TABLE transport ( domain varchar(128) NOT NULL default '', transport varchar(128) NOT NULL default '', UNIQUE KEY domain (domain) );
quit

3. Проверим, что MySQL связана с localhost (127.0.0.1). Для этого откроем файл /etc/mysql/my.cnf и найдем следующую строку:
bind-address = 127.0.0.1

4. Начинаем настройку Postfix для работы с MySQL. Создаем конфигурационные файлы:
файл для работы с почтовыми доменами Postfix:
sudo touch /etc/postfix/mysql-virtual_domains.cf
sudo gedit /etc/postfix/mysql-virtual_domains.cf
пишем туда следующее:
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT domain AS virtual FROM domains WHERE domain = '%s'
hosts = 127.0.0.1       

файл для настройки пересылки почты с ящика на ящик:
sudo touch /etc/postfix/mysql-virtual_forwardings.cf
sudo gedit /etc/postfix/mysql-virtual_forwardings.cf

пишем туда следующее:
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT destination FROM forwardings WHERE source = '%s'
hosts = 127.0.0.1

файл для работы с почтовыми аккаунтами:
sudo touch /etc/postfix/mysql-virtual_mailboxes.cf 
sudo gedit /etc/postfix/mysql-virtual_mailboxes.cf

пишем туда следующее:
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT CONCAT( SUBSTRING_INDEX(email, '@', -1), '/' , SUBSTRING_INDEX(email, '@', 1), '/' ) FROM users WHERE email = '%s'
hosts = 127.0.0.1

вспомогательный файл для виртуального отображения почты:
sudo touch /etc/postfix/mysql-virtual_email2email.cf 
sudo gedit /etc/postfix/mysql-virtual_email2email.cf 

пишем туда следующее:
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT email FROM users WHERE email = '%s'
hosts = 127.0.0.1

5. Установим нужные права и владельца на только что созданные файлы:
sudo chmod o= /etc/postfix/mysql-virtual_*.cf
sudo chgrp postfix /etc/postfix/mysql-virtual_*.cf  

6.
Редактируем файл /etc/postfix/main.cf:
sudo gedit /etc/postfix/main.cf
закомментируем строки:
virtual_mailbox_domains = myubuntu.org
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_alias_maps = hash:/etc/postfix/virtual

и добавим:
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf

proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps

7. Настройка saslauthd для доступа к MySQL.
sudo mkdir -p /var/spool/postfix/var/run/saslauthd
sudo gedit /etc/default/saslauthd

пишем туда следующее:
START=yes
DESC="SASL Authentication Daemon"
NAME="saslauthd"
MECHANISMS="pam"
MECH_OPTIONS=""
THREADS=5
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"

8. Создаем файл и редактируем его
sudo touch /etc/pam.d/smtp 
sudo gedit /etc/pam.d/smtp 

пишем туда следующее:
auth required pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=user passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=user passwdcolumn=password crypt=1

9. Создаем файл и редактируем его
sudo touch /etc/postfix/sasl/smtpd.conf
sudo gedit /etc/postfix/sasl/smtpd.conf  

пишем туда следующее:
pwcheck_method: saslauthd
mech_list: plain login
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: mail_admin
sql_passwd: mail_admin_password
sql_database: mail
sql_select: SELECT password FROM users WHERE user = '%u'

10.  
sudo chmod o= /etc/pam.d/smtp
sudo chmod o= /etc/postfix/sasl/smtpd.conf 

10.1
sudo gedit /etc/postfix/master.cf
 вместо
dovecot unix - n n - - pipe flags=DRhu user=virtual:virtual argv=/usr/local/libexec/dovecot/deliver -d ${recipient}

пишем
dovecot unix - n n - - pipe flags=DRhu user=virtual:virtual argv=/usr/lib/dovecot/deliver -d ${recipient}

11. Добавляем пользователя
sudo adduser postfix sasl

Перезапускаем
postfix и saslauthd
sudo service postfix restart
sudo service saslauthd restart

12.  Настройка dovecot.
sudo gedit /etc/dovecot/dovecot.conf
закомментируем строки
passdb {
 driver = passwd-file
 Each domain has a separate passwd-file:
 args = /etc/dovecot/pass
}

и добавим
passdb {
 driver = sql  
 args = /etc/dovecot/dovecot-sql.conf
}
service auth {
  unix_listener auth-userdb {
    mode = 0660
    user = virtual
    group = virtual
  }
}

 13.
sudo gedit /etc/dovecot/dovecot-sql.conf

driver = mysql
connect = host=127.0.0.1 dbname=mail user=mail_admin password=mail_admin_password
default_pass_scheme = CRYPT
password_query = SELECT email AS user , password FROM users WHERE (user = '%u') or (email = '%u');

14. -

15. Перезапускаем Dovecot
sudo service dovecot restart

16.Настройка почтовых доменов и аккаунтов. Создадим в базе данных домен myubuntu.org и два почтовых ящика: user1@myubuntu.org и user2@myubuntu.org
mysql -u root -p
USE mail;
INSERT INTO domains (domain) VALUES ('myubuntu.org');
INSERT INTO users (user, email, password) VALUES ('
user1', 'user1@myubuntu.org', ENCRYPT('user1_password')); 
INSERT INTO users (user, email, password) VALUES ('user2', 'user2@myubuntu.org', ENCRYPT('user2_password'));
quit 

17. Теперь прикрутим SSL. Сначала сгенерируем сертификат. Пусть он будет лежать в /etc/dovecot. Итак:
cd /etc/dovecot
openssl req -new -outform PEM -out myubuntu.cert -newkey rsa:2048 -nodes -keyout myubuntu.key -keyform PEM -days 365 -x509

,где
365 - количество дней, в течение которых действителен сертификат.

В итоге в каталоге /etc/dovecot будет создан сертификат myubuntu.cert и ключ
myubuntu.key

18. sudo chmod o= /etc/dovecot/myubuntu.key
19. Изменим конфигурационный файл dovecot:
sudo gedit /etc/dovecot/dovecot.conf
вместо
#Отключаем SSL
ssl =no
пишем
#Включаем SSL
ssl = yes
ssl_cert =< /etc/dovecot/myubuntu.cert
ssl_key =< /etc/dovecot/myubuntu.key

и еще вместо
protocols = imap
пишем
protocols = imaps
для того, чтобы соединение шло только через ssl
20. Изменим конфигурационный файл postfix:
gedit /etc/postfix/master.cf
добавим
submission inet n - - - - smtpd
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_sasl_local_domain=$myhostname
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_sender_login_maps=hash:/etc/postfix/virtual
  -o smtpd_sender_restrictions=reject_sender_login_mismatch
  -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject

21. Перезупаскаем postfix, saslauthd и dovecot:
sudo service saslauthd restart
sudo service dovecot restart
sudo service postfix restart

22. В Thunderbird изменяем настройки аккаунта: Edit > Account settings... >  Server Settings > Connection Security: SSL/TLS
23. После этого Thunderbird предложит принять сертификат.

24. Теперь последнее - сделаем так, чтобы postfix тоже использовал шифрование. Редактируем файл конфигурации postfix:
sudo gedit /etc/postfix/master.cf

раскомментируем строки

#smtps inet n - n - - smtpd
# -o syslog_name=postfix/smtps
#-o smtpd_tls_wrappermode=yes
#-o smtpd_sasl_auth_enable=yes

25. Далее правим /etc/postfix/main.cf:
sudo gedit /etc/postfix/main.cf

В конец файла добавляем

smtp_use_tls = yes
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /etc/dovecot/myubuntu.key
smtpd_tls_cert_file = /etc/dovecot/myubuntu.cert
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 1s
tls_random_source = dev:/dev/urandom

, где myubuntu.key и myubuntu.cert - те же сертификат и ключ, которые использует dovecot.

26. Перезапускаем postfix:
sudo service postfix restart

27. В Thunderbird изменяем настройки SMTP-сервера: Edit > Account settings... > Outgoing server (SMTP) > Edit > Connection Security: STARTTLS

Конец. Если настоящая инструкция Вам помогла, пожалуйста, напишите об этом в комментарии. Ваши предложения и замечания также помогут в ее совершенствовании.



Выполнение (новый проверенный вариант от 18.01.2014):
Это предварительная рабочая версия. В самое ближайшее время оформлю и допишу пояснения.
1.       После установки Ubuntu Server 12.04.3 LTS выполним обновление пакетов
sudo apt-get update
sudo apt-get upgrade
2.       Устанавливаем Postfix, Dovecot, MySQL и другие необходимые пакеты
sudo apt-get install postfix dovecot-common dovecot-imapd mysql-server mysql-client postfix-mysql dovecot-mysql sasl2-bin
В процессе установки MySQL задаем пароль root в MySQL: sqlrootpass
В процессе установки Postfix выбираем тип конфигурации «no configuration» (без конфигурации)
3.       Подключаемся к MySQL
mysql -u root p
и создаем базу данных, в которой будут храниться учетные записи почтовых аккаунтов
CREATE DATABASE mail;
USE mail;
Внимание! Далее будет использоваться пользователь mail_admin и его пароль mail_admin_password для доступа к базе данных почтовых аккаунтов в MySQL. Вместо mail_admin и mail_admin_password Вы можете задать свои значения.
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';
FLUSH PRIVILEGES;
создаем таблицу доменов
CREATE TABLE domains ( domain varchar(50) NOT NULL, PRIMARY KEY (domain) );
Создаем таблицу …
CREATE TABLE forwardings ( source varchar(80) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source) );
Создаем таблицу для пользователей
CREATE TABLE users ( user varchar(80) NOT NULL, email varchar(80) NOT NULL, password varchar(20) NOT NULL, PRIMARY KEY (email) );
CREATE TABLE transport ( domain varchar(128) NOT NULL default '', transport varchar(128) NOT NULL default '', UNIQUE KEY domain (domain) );
quit

4.       Проверим, что MySQL связана с localhost (127.0.0.1). Для найдем в файле /etc/mysql/my.cnf  строку bind-address            = 127.0.0.1
grep 'bind-address' /etc/mysql/my.cnf
в результате выполнения команды на экран должно быть выведено
bind-address            = 127.0.0.1
5.       Создаем группу virtual и пользователя virtual, входящего в эту группу.
sudo groupadd -g 5000 virtual
sudo useradd -g virtual -u 5000 virtual
6.       Создадим каталог, где будут размещаться почтовые ящики:
sudo mkdir /var/spool/mail/myubuntu.org
сменим имя и группу владельца созданной директории на virtual:virtual
sudo chown virtual:virtual  /var/spool/mail/myubuntu.org
дадим владельцу и его группе полные права на каталог, а другим все запретим
sudo chmod 770 /var/spool/mail/myubuntu.org
Начинаем конфигурировать Postfix

7.       Создаем конфигурационный файл для доступа к почтовым доменам в базе данных MySQL
sudo nano /etc/postfix/mysql-virtual_domains.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT domain AS virtual FROM domains WHERE domain = '%s'
hosts = 127.0.0.1
8.   Создаем конфигурационный файл для определения автоматической пересылки писем с ящика на ящик
sudo nano /etc/postfix/mysql-virtual_forwardings.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT destination FROM forwardings WHERE source = '%s'
hosts = 127.0.0.1
8.   Создаем конфигурационный файл для доступа к почтовым аккаунтам в базе данных MySQL
sudo nano /etc/postfix/mysql-virtual_mailboxes.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT CONCAT( SUBSTRING_INDEX(email, '@', -1), '/' , SUBSTRING_INDEX(email, '@', 1), '/' ) FROM users WHERE email = '%s'
hosts = 127.0.0.1
10.   Создаем конфигурационный файл для виртуального отображения почты
sudo nano /etc/postfix/mysql-virtual_email2email.cf
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT email FROM users WHERE email = '%s'
hosts = 127.0.0.1
11.   Владельцем данных конфигурационных файлов должен быть root, группой владельца - postfix
sudo chown root /etc/postfix/mysql-virtual_*.cf
sudo chgrp postfix /etc/postfix/mysql-virtual_*.cf
12.   Редактируем конфигурационный файл главного модуля main
sudo nano /etc/postfix/main.cf
Пишем туда следующее:
#Так наш сервер будет представляться при отправке и получении почты
smtpd_banner = $myhostname ESMTP (Ubuntu)
#Отключаем использование comsat
biff = no
#Запрещаем автоматически дополнять неполное доменное имя в адресе письма
append_dot_mydomain = no
#Указываем имя нашего хоста
myhostname = ubuntu.myubuntu.org
# Указываем файл с псевдонимами почтовых ящиков
alias_maps = hash:/etc/postfix/aliases
#Указываем, для каких доменов будем принимать почту
mydestination = localhost
# Не будем ограничивать размер почтовых ящиков
mailbox_size_limit = 0
recipient_delimiter = +
#Указываем прослушивание на всех сетевых интерфейсах
inet_interfaces = all
#Указываем обязательность использование клиентами команды helo
smtpd_helo_required = yes
#Описываем доступ доменам, почтовым ящикам и т.д.
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_mailbox_base = /var/spool/mail
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf
virtual_minimum_uid = 100
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
home_mailbox = Maildir/
local_recipient_maps = $virtual_mailbox_maps
#Описываем авторизацию по SMTP для клиентов не из доверенной зоны
smtpd_sasl_type = dovecot
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
#broken_sasl_auth_clients = yes
#Указываем каталог очереди для Postfix
queue_directory = /var/spool/postfix
smtpd_recipient_restrictions =  permit_mynetworks,  permit_sasl_authenticated, reject_unauth_destination
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps  $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps
smtp_use_tls = yes
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /etc/dovecot/myubuntu.key
smtpd_tls_cert_file = /etc/dovecot/myubuntu.cert
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 1s
tls_random_source = dev:/dev/urandom
13.       Задаем сообщение, которое будет выводить Postfix в случае, если отправитель будет представляться именем нашего сервера
sudo nano /etc/postfix/helo.list
myubuntu.org 550 Don't use my hostname
прохешируем
sudo postmap /etc/postfix/helo.list
14.       Задаем сообщение, которое будет выводить Postfix в случае, если отправитель извне будет говорить, что он из нашей сети
sudo nano /etc/postfix/ext_sender
myubuntu.org 450 Do not use my domain in your envelope sender
прохешируем
sudo postmap /etc/postfix/ext_sender
15.   Настраиваем демон saslauthd для взаимодействия с Postfix
sudo mkdir -p /var/spool/postfix/var/run/saslauthd
sudo nano /etc/default/saslauthd
необходимо проверить, чтобы были закомментированы все строки, и написать следующее:
START=yes
DESC="SASL Authentication Daemon"
NAME="saslauthd"
MECHANISMS="pam"
MECH_OPTIONS=""
THREADS=5
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"
16.   Настраиваем pam-аутентификацию
sudo nano /etc/pam.d/smtp
Пишем туда следующее:
auth required pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=user passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=user passwdcolumn=password crypt=1
17.   Настраиваем Postfix для взаимодействия с saslauthd
sudo nano /etc/postfix/sasl/smtpd.conf
Пишем туда следующее:
pwcheck_method: saslauthd
mech_list: plain login
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: mail_admin
sql_passwd: mail_admin_password
sql_database: mail
sql_select: SELECT password FROM users WHERE user = '%u'
18.   Владельцем данных файлов должен быть root
sudo chown root /etc/pam.d/smtp /etc/postfix/sasl/smtpd.conf
19.   Редактируем конфигурационный файл Postfix
sudo nano /etc/postfix/master.cf
Добавляем следующие строки
dovecot unix - n n - - pipe flags=DRhu user=virtual:virtual argv=/usr/lib/dovecot/deliver -d ${recipient}
submission inet n - - - - smtpd
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_sasl_local_domain=$myhostname
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_sender_login_maps=hash:/etc/postfix/virtual
  -o smtpd_sender_restrictions=reject_sender_login_mismatch
  -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject
smtps inet n - n - - smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
20.   Добавляем пользователя postfix в группу sasl
sudo adduser postfix sasl
21.   Конфигурируем Dovecot
sudo nano /etc/dovecot/dovecot.conf
Нужно убедится в том, что все строки закомментированы и добавить следующее
!include_try /usr/share/dovecot/protocols.d/*.protocol
#
Разрешаем авторизацию в plaintext
disable_plaintext_auth = no
# Журнал будем писать в файл /var/log/dovecot.err
log_path = /var/log/dovecot.err
# Формат даты и времени для регистрируемых событий
log_timestamp = "%Y-%m-%d %H:%M:%S "
#Включаем SSL
ssl = yes
ssl_cert =< /etc/dovecot/myubuntu.cert
ssl_key =< /etc/dovecot/myubuntu.key
#Строка приветствия при ответе сервера
login_greeting = Dovecot ready.
#Описываем тип (maildir) и местонахождения почтовых ящиков (/var/spool/mail/%d/%n) %d - имя сервера, %n - имя пользователя
mail_location = maildir:/var/spool/mail/%d/%n
#Задаем идентификатор пользователя и группы, с которыми будет работать dovecot
mail_uid = 5000
mail_gid = 5000
mail_privileged_group = mail
valid_chroot_dirs = /var/spool/mail/
#Настраиваем вывод отладочных сообщений
auth_verbose = yes
auth_debug = yes
auth_debug_passwords = yes
#Типы допустимых вариантов аутентификации
auth_mechanisms = plain login digest-md5
#Задаем параметры аутентификации
passdb {
 driver = sql 
 args = /etc/dovecot/dovecot-sql.conf
}
service auth {
  unix_listener auth-userdb {
    mode = 0660
    user = virtual
    group = virtual
  }
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    # Assuming the default Postfix user and group
    user = postfix
    group = postfix      
  }
}
service imap-login { 
inet_listener imap { 
port = 0
 }
inet_listener imaps { 
port = 993
ssl = yes
}
}
22.   Настраиваем параметры соединения с базой данных MySQL
sudo nano /etc/dovecot/dovecot-sql.conf
Пишем туда следующее:
driver = mysql
connect = host=127.0.0.1 dbname=mail user=mail_admin password=mail_admin_password
default_pass_scheme = CRYPT
password_query = SELECT email AS user , password FROM users WHERE (user = '%u') or (email = '%u');
23.   Проверяем конфигурацию Dovecot
dovecot -a
24.   Создадим в базе данных MySQL почтовый домен и два пользователя
mysql -u root -p
USE mail;
INSERT INTO domains (domain) VALUES ('myubuntu.org');
INSERT INTO users (user, email, password) VALUES ('user1', 'user1@myubuntu.org', ENCRYPT('user1_password'));
INSERT INTO users (user, email, password) VALUES ('user2', 'user2@myubuntu.org', ENCRYPT('user2_password'));
quit
25.   Создадим сертификат и ключ для SSL
cd /etc/dovecot
sudo openssl req -new -outform PEM -out myubuntu.cert -newkey rsa:2048 -nodes -keyout myubuntu.key -keyform PEM -days 365 -x509
В итоге в каталоге /etc/dovecot будет создан сертификат myubuntu.cert и ключ 
myubuntu.key
26.   Владельцем ключа должен быть root
sudo chown root /etc/dovecot/myubuntu.key
27.   Перезапускаем saslauthd, dovecot и postfix
sudo service saslauthd restart
sudo service dovecot restart
sudo service postfix restart
в Thunderbird настройки:
imap порт 993 имя пользователя user1 SSL/TLS обычный пароль
smtp порт 465 имя пользователя user1 SSL/TLS обычный пароль



В процессе возникали следующие ошибки:

1. При выполнении команды telnet localhost smtp в /var/log/mail.log появляется следующее:
Aug 22 14:14:58 ubuntu postfix/smtpd[3095]: connect from localhost[127.0.0.1]
Aug 22 14:14:58 ubuntu postfix/smtpd[3095]: warning: SASL: Connect to private/auth failed: No such file or directory (или Connection refused)
Aug 22 14:14:58 ubuntu postfix/smtpd[3095]: fatal: no SASL authentication mechanisms
Aug 22 14:14:59 ubuntu postfix/master[3089]: warning: process /usr/lib/postfix/smtpd pid 3095 exit status 1

Это говорит о том, что dovecot не создает сокет /var/spool/postfix/private/auth , используя который postfix должен осуществлять авторизацию, и не слушает его.
Решение: в файле конфигурации dovecot /etc/dovecot/dovecot.conf писать не так
socket listen {
client {
path = /var/spool/postfix/private/auth
mode = 0666
user = postfix
group = postfix
}
}

, а так:
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix       
}
}

2. При попытке отправки сообщения через Thunderbird в /var/log/mail.log появляется следующее:
ubuntu postfix/trivial-rewrite[3223]: warning: do not list domain myubuntu.org in BOTH mydestination and virtual_mailbox_domains

postfix ругается на то, что в файле /etc/postfix/main.cf доменное имя myubuntu.org прописано сразу в двух параметрах: mydestination и virtual_mailbox_domains
Решение: в файле конфигурации postfix /etc/postfix/main.cf в параметре mydestination убрать домен myubuntu.org (у Вас он другой).
3. После отправки сообщения через  Thunderbird к адресату оно не доходит, а в /var/log/dovecot.err пишется следующее:
lda: Error: userdb lookup: connect(/var/run/dovecot/auth-userdb) failed: Permission denied (euid=5000(virtual) egid=5000(virtual) missing +r perm: /var/run/dovecot/auth-userdb, dir owned by 0:0 mode=0755)

Сокет /var/run/dovecot/auth-userdb имеет владельца root и группу root, права srw-rw----, поэтому пользователь virtual не имеет доступа к сокету.
Решение: для того, чтобы владельцем /var/run/dovecot/auth-userdb был virtual, в конфигурационном файле /etc/dovecot/dovecot.conf добавим следующее:
service auth {
  unix_listener auth-userdb {
    mode = 0660
    user = virtual
    group = virtual
  }
}

Немного теории.
В файле /etc/postfix/main.cf  указан параетр  virtual_transport = dovecot . Сам параметр virtual_transport используется для указания того, что будет использоваться в качестве транспорта доставки почты по умолчанию. Значение dovecot указывает на строки в файле /etc/postfix/master.cf, а именно:
dovecot unix - n n - - pipe flags=DRhu user=virtual:virtual argv=/usr/lib/dovecot/deliver -d ${recipient}
, где
dovecot - имя сервиса
unix - тип службы: данная служба прослушивает сокет UNIX и доступна только для локальных клиентов
- - пустое значение параметра private: будет ли для службы ограничен доступ к почтовой системе. Т.к. по умолчанию значение параметра YES, доступ будет ограничен.
n - значение параметра unpriv (unprivileged): указывает, работает служба с правами суперпользователя или с правами владельца postfix. Значение по умолчанию YES.
n - значение параметра chroot: указывает, будет ли служба ограничена каталогом queue_directory, который прописывается в /etc/postfix/main.cf . Значение по умолчанию YES.
- - пустое значение параметра wakeup: автоматическое пробуждение службы после заданного количества секунд. Пробуждение осуществляется путем подключения к службе и отправки wake up запроса. Значение по умолчанию 0, т.е. автоматическое пробуждение отключено.
- - пустое значение параметра maxproc: максимальное количество процессов, которые могут обращаться к службе одновременно. Значение по умолчанию 100.
pipe flags=DRhu user=virtual:virtual argv=/usr/lib/dovecot/deliver -d ${recipient} - значение параметра command + args : команда, которая будет выполнена. Имя команды указывается относительно каталога демона postfix, который можно задать с помощью параметра daemon_directory. Флаги:
D - запускать службу под контролем команды, указанной в параметре debugger_command в файле main.cf .
остальное смотреть в мануалах к службам.

Если данная инструкция оказалась полезной для вас, напишите, пожалуйста, об этом в комментарии.