Original article: http://jth.net/virtual.html

Виртуальные домены с использованием GNU pop3d и Postfix

GNU pop3d 0.10.2

GNU pop3d 0.10.2 готов. Вы можете скачать его здесь GNU pop3d 0.10.2

ИЗМЕНЕНИЯ / ИСТОРИЯ

22 / марта / 2014 г. 0.10.2 Jørgen Thomsen [email protected], http://jth.net/virtual.html

Новые возможности

————

Поддержка IPv6 с конфигурацией –disable – ipv6 и во время выполнения –ipv6

Поддержка POP3S с помощью –enable-pop3s

Установит рабочую конфигурацию xinetd, используя stunnel вкл. Образец сертификата и ключ

Предварительное условие: xinetd и stunnel установлены

Поддержка зашифрованных (C Crypt) паролей в виртуальных доменах (без APOP)

Поддержка запуска Daemon extended –enable-service = SERVICE

Теперь поддерживающая конфигурация для sysvinit, init, event.d, systemd и одиночного пользователя inetd, xinetd

(Вероятно, не идеально 🙂 Проверьте вашу установку)

Корневой каталог установки можно указать во время настройки –enable-rootdir = DIR, а также

Make install ROOT = DIR

Добавлена ​​функция удаления

Pop3client.pl программа для простого тестирования и стресс-тестирования сервера pop3

Mkpwd.pl для создания и / или шифрования паролей для виртуальных доменов, совместимых с glibc crypt ()

Kill -SIGUSR2 отобразит несколько переменных состояния в syslog

Daemon: количество просмотров и количество активных дочерних элементов, значение флага, определяющего завершение, а также количество сеансов до сих пор.

Ребенок: используется время отображения и команды для пользователя, подключенного с IP-адреса

Изменения

——-

Extra.c / pop3_syslog теперь может регистрироваться в STDERR (debug = 0x1yy).

Отдельные приоритеты syslog хранятся в pop3_syslog.

Больше регистрации через pop3_syslog.

Уменьшено использование библиотечных процедур в pop3_syslog для повышения стабильности.

Устаревшие gethostbyname и gethostbyaddr заменены getaddrinfo и getnameinfo

Inet_ntoa заменен на inet_ntop

Задержка 1 секунда для возврата BAD LOGIN для сдерживания проверки роботами слабых паролей.

Тексты справки очищены и улучшены.

Улучшенный сценарий установки

– обработка дополнительных систем запуска daemon

– настройка pop3s с помощью stunnel + xinetd

– спецификация корневого каталога установки

– Поддержка IPv6

– поддерживается брандмауэр firewalld

– возможность удаления

Пожалуйста, обратите внимание, что тестирование установки было сделано только на Linux Fedora 12, 15, 18, 20, поэтому он может быть не идеальным во всех случаях.

Поскольку GNU-pop3d – это только одна программа без необходимых файлов конфигурации, ее можно вручную поместить в / usr / local / sbin / gnu-pop3d

И вписывается в сценарий запуска ваших системных служб

Обновлен код MD5 (Gray Watson), добавлена ​​поддержка большого / маленького байта

Последние GNU config.guess и config.sub установлены.

Исправлены ошибки

———-

Более надежное дочернее управление (занятый сервер, DoS-атаки).

Недавние изменения функций crypt или strcmp, по-видимому, вызвали бесконечный цикл во время входа в систему в определенных случаях.

Запрещен вход с использованием зашифрованного пароля в виртуальных доменах.

07 / февраля / 2011 г. 0.9.13 Jørgen Thomsen [email protected], http://jth.net

Журналирование Syslog из подпрограммы обработчика сигнала pop3_signal вызвало зависание процессов, особенно во время DoS-атак или

Множеством одновременных клиентов. Частично исправлено (может появиться при использовании этого бита (08) в маске отладки)

Исправление: некоторые методы входа в систему не работали (David B. Cortarello)

Глобальный дочерний счетчик child_procs изменился с int на «volatile sig_atomic_t», чтобы уменьшить вероятность

Он не обновляется должным образом.

Счетчик не всегда уменьшался, поэтому программа использовала только один экземпляр, когда max child

Процессы были неправильно достигнуты.

Последние GNU config.guess и config.sub установлены.

Makefile.in и configure.in улучшены, а поддержка обнаружения процессоров Atom добавлена и больше поддержки для

Сервисная установка (/ etc / init)

Каталог RFC удален, поскольку RFC-файлы доступны в Интернете

26 / Апрел / 2010 0.9.12 Jørgen Thomsen [email protected], http://jth.net

Возможна двойная отмена имени переменной почтового ящика в особых ситуациях, например, при одновременном входе в систему

Тот же почтовый ящик.

Config.guess и config.sub отсутствуют в дистрибутиве

Добавлено стартовое сообщение в syslog

18 апреля 2010 г. 0.9.11 Jørgen Thomsen [email protected], http://jth.net

Программа поддерживается на платформе Linux Fedora без тестирования на других платформах, но

С попыткой избежать специфических особенностей Linux.

Усовершенствования сценария configure, включая поддержку 64-разрядных процессоров.

Алгоритм Nagle (TCP No Delay) был отключен, что вызвало значительное улучшение скорости.

SO_REUSEADDR добавлен в сокет daemon для немедленного повторного использования сокета после перезапуска.

Обработка сигналов улучшилась, чтобы быть более портативными (sigaction) и небезопасными вызовами, удаленными из обработчика сигналов. Прекращение действия

После сигнала теперь должно быть намного лучше, не оставляя файлы mailbox.lock.

* Bug * переменная sock в дочернем элементе всегда равна -1, а не фактический сокет (sock2), поэтому pop3_signal в дочернем элементе не закрывал сокет.

Удалены вызовы sync (), например,. Копирование больших файлов на USB-диск приведет к зависанию, пока все данные не будут записаны на диск (несколько минут)

Условная компиляция отладочных операторов удалена, так как накладные расходы настолько малы.

Параметр отладки был изменен на битовую маску из двух шестнадцатеричных цифр (дети, демон) и дополнительные

Добавлены отладочные операторы.

MAXHOSTNAMELEN увеличился до 128 из-за доменных имен IDNA

Файл gnu-pop3d для /etc/event.d включен

Обновлена ​​страница man

18 / июля / 2007 0.9.10 Йорген Томсен [email protected], http://jth.net

Блокировка fcntl для почтового ящика изменена на блокировку записи

Sync () всегда вызывается при разблокировке

Считывать данные с клиента, когда включен тайм-аут (select), теперь проверяет наличие сломанного канала, также вызывающего немедленный выход,

Если клиент внезапно исчезает.

Когда почтовый ящик был скопирован в новый почтовый ящик, некоторые MTA (e, g, postfix) могут продолжить запись в старый почтовый ящик.

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

24 августа 2003 г. 0.9.9-5 Jørgen Thomsen [email protected], http://jth.net

Тест для строк заголовка не был достаточно строгим. Статус: и X-Status: считается равным (Jem Berkes)

Командные строки не были собраны в одну строку, если они были получены в виде отдельных TCP-пакетов (Nicolas Gregoire)

18 / января / 2003 0.9.9-4 Jørgen Thomsen [email protected], http://jth.net

Поддержка строки заголовка Postfix X-Original-To: для уведомления об отправке сообщений.

Вычисление UIDL больше не будет включать в себя заголовки X-заголовков, так как они могут быть добавлены некоторыми почтовыми программами.

«%» Разрешено вместо разделителя @ в качестве виртуального имени пользователя (адрес электронной почты)

Незначительные внутренние изменения.

Дополнительная поддержка автора virtdomain.pl автором (как найти почтовый ящик)

18 / окт. / 2002 г. 0.9.9-3 Jørgen Thomsen [email protected], http://jth.net/

Исправлена ​​ошибка, когда в неправильном почтовом ящике в первой строке не было «От».

05 / Sep / 2002 0.9.9-2 Jørgen Thomsen [email protected], http://jth.net/

Исправление для полного заполнения диска предотвратило запись измененного почтового ящика в .новый файл. Он был сохранен без изменений

04 / сентября / 2002 0.9.9-1 Jørgen Thomsen [email protected], http://jth.net/

Если почтовый ящик не завершился фидом линии (если произошел сбой при записи сообщения в него)

Произошел бесконечный цикл. Если почтовый ящик модифицирован GNU pop3d, он будет исправлен.

Когда диск заполнялся при записи нового почтового ящика, он не был обнаружен, и новый почтовый ящик был усечен

19 / Августа / 2002 0.9.9 Йорген Томсен [email protected], http://jth.net/

Совместимость с внедренными файлами passwd vm-pop3d (не полностью протестирована)

Добавлена ​​грациозная остановка путем улавливания сигналов (SIGHUP и SIGTERM).

Последние штрихи и номер версии изменены на 0.9.9

19 / октября / 2001 Jørgen Thomsen [email protected], http://jth.net/

Добавлено уведомление об отправке сообщения (получение квитанции, RFC 2298)

Добавлены опции настройки, чтобы избежать редактирования config.h в большинстве случаев

Изменено обновление почтового ящика от копирования внутри файла до создания нового файла (mailbox.new)

Если необходимо, и улучшено копирование внутри файла. Это значительно повышает скорость, особенно для почтовых программ.

Введена поддержка классической строки заголовка Status: RFC 2076 (поддерживаемая e.q. Null Webmail

Http://nullwebmail.sourceforge.net/)

17 / октября / 2001 Jørgen Thomsen [email protected], http://jth.net/

Добавлен старый патч для лучшей обработки создания и смерти детских процессов.

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

VirtDomain 1,05

Интерфейс веб-интерфейса функционален как для стандартных виртуальных доменов Postfix, так и для моего вкуса: виртуальные домены jth. Он поставляется в виде единой программы Perl, которая вызывается из командной строки для создания виртуального домена и с веб-сервера для его администрирования. Требуется последняя версия Postfix VirtDomain 1.05

#! / Usr / bin / perl -w

# ************************************************* *********************

#

# Утилита для администрирования виртуальных доменов в postfix (как стандартная

# Те и те, которые определены в http://jth.net/virtual.html)

#

# Эта программа должна находиться в /var/www/cgi-bin/virtdomain.pl с глобальной

# Читать и выполнять права (chmod o + rx /var/www/cgi-bin/virtdomain.pl).

#

# Не забудьте указать $ main :: postfixadmin ниже!

#

# Первый аргумент программы определяет его функцию:

# CREATE: вызов из командной строки с правами root: создать виртуальный домен путем обновления

# / Etc / postfix / virtual и virtual_regexp

# И создание / etc / virtual / domain / passwd и / var / spool / virtual / domain

# CREATE <имя домена> <реальный пользователь, администрирующий домен>

# <Passwd> [постфикс]

# DELETE: вызов из командной строки с правами root: удаление виртуального домена путем обновления

# / Etc / postfix / virtual и virtual_regexp

# И удаление / etc / virtual / domain / passwd и / var / spool / virtual / domain как

# Также как файлы .forward в администраторах homedir

# DELETE <имя домена> <реальный пользователь, администрирующий домен> <пароль>

# <Blank>

# MAILBOUNCE

# Если вызывается из postfix как почта для пользователя @ domain, будет обработано письмо на STDIN

# В соответствии с настройкой пользователя в / etc / virtual / domain / passwd.

# MAILBOUNCE: электронная почта отказов неизвестным пользователям сохраняется в почтовом ящике postmaster

# <Blank>, если вызывается из postfix как почта в postmaster @ domain или <postfixadmin + postmaster>

# С темой “*** Обновление виртуального домена ***”, а строка 1 – trans = UPDATE ….

# Пользователь будет создан / обновлен / удален

# В противном случае обрабатывать электронную почту как обычно

# <Blank>: если вызов с веб-сервера отображает веб-страницы для обновления пользователя

# Base в виртуальном домене например, http://jth.net/cgi-bin/virtdomain.pl

#

# В качестве основы пользователь postmaster должен быть определен для домена.

# В файле / etc / virtual / domain / passwd. Идентификаторы пользователя и группы:

# Также как homedir от этого пользователя используется для виртуального домена.

# Для каждого виртуального пользователя создается файл homedir / .forward + user-domain.

# Веб-сервер должен иметь доступ на чтение этих файлов, а также

# Файл / etc / virtual / domain / passwd.

# GNU pop3d deamon, поддерживаемый мной, поддерживает это

# Реализация виртуального домена.

#

# Использование этой программы для доставки почты для доменов стиля j не подходит для

# Система с большими объемами, как загрузка интерпретатора Perl

# Имеет довольно высокое начальное использование ЦП по сравнению с этой программой (90% от общего времени выполнения).

# Однако, используя условие для подключения другой программы для доставки почты

# Может быть полезным. Утилита awk может использоваться вместо virtual.awk

#

# © 2002 Jørgen Thomsen [email protected], http://jth.net/virtual.html

# 1.01 2002-08-22 Официальный релиз

# 1.02 2003-01-24 Поддержка новых параметров virtual_alias_map и relay_domains

# 1.03 2003-04-26 Улучшена поддержка языков и исправлен URL-адрес веб-почты в инфо

# 1.04 2003-05-30 Chars | И “были удалены из форвардов на входе. Теперь пользователь не должен вводить |, но запускать команды с”

# 1.05 2004-08-06 Изменения, специфичные для jth.net: / var / www / perl, фон тела изменен, CGI не используется

#

# ************************************************* *********************

Старый, но в основном все еще действительный

Изменения в GNU pop3d 0.9.8

(Включая некоторые изменения, не связанные с виртуальными доменами, например, POP-before-SMTP)

Основываясь на собственных потребностях, я сделал патч для GNU-pop3d vers. 0,9

Я также прослушал некоторые запросы в списке рассылки GNU pop3d.

Патч можно применять также, если вам не нужен материал виртуального домена.

За основу я взял виртуальный патч Джереми Рида, сделал его более общим и добавил мои собственные изменения GNU pop3d:

Поиск почтового ящика пользователей выполняется как

  1. Поиск MAILSPOOLHOME (например, / home / user / Mail / mailbox)
  2. Найти _MAILDIR (например, / var / mail / user)
  3. Поиск VIRTUAL_MAILDIR (например, / var / spool / virtual / domain / user)
  4. Отказаться и использовать / dev / null

Исправление GNU pop3d

Вместо всех, применяющих патчи, я сделал это.

Загрузите пропатченный источник gnu-pop3d-0.9.11.tar.gz

Создайте файл config.h командой

./configure

или

./configure –enable-ip-based-virtual

(См. Также другой вызов ниже)

Если необходимо / нужно определить MAILSPOOLHOME (например, «/ Mail / mailbox») и / или DEFAULT_DOMAIN в config.h

Скомпилируйте, выполнив make

Технические изменения

Реализация виртуальных доменов в Postfix и GNU pop3d

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

1) эта реализация фокусируется на виртуальных доменах с каждым своим собственным администратором

2) следующие ограничения (цитата из документации Postfix (мой акцент)):

Этот агент изначально был основан на локальном агенте доставки Postfix. Модификации главным образом состояли в удалении кода, который либо не был применим, либо был небезопасен в этом контексте: псевдонимы, файлы ~ user / .forward, доставка в “| command” или в / file / name

Ниже показан один из способов реализации виртуального домена kvt.dk в Postfix и GNU pop3d.

В системе был определен реальный пользователь kvt_dk. Домашний каталог этого пользователя содержит некоторые данные для виртуального домена kvt.dk.

Два пользователя определены в kvt.dk: [email protected] (только для виртуальных пользователей) и [email protected] (реальный пользователь kvt_dk на почтовом сервере)

Реализация основана на Redhat Linux 7.0

GNU pop3d

Джереми Ридз оригинальное описание виртуального патча

Виртуальный патч предполагает следующие файловые структуры:

/ Etc / virtual / <domain> / passwd

Для определения пользователей, паролей и каталога почтовых ящиков

В этом примере создайте каталог /etc/virtual/kvt.dk

Почтовый ящик по умолчанию для виртуального пользователя:

/ Var / spool / virtual / <domain> / <user>

В этом примере создайте каталог /var/spool/virtual/kvt.dk

На моем сервере почта хранится в домашней папке пользователя / home / <usr> / Mail / mailbox, что требует определения MAILSPOOLHOME в config.h.

У меня также есть только один IP-адрес, и я хочу, чтобы мой основной домен «jth.net» автоматически удалялся из почтовых запросов GNU pop3d.

Я сгенерировал файл config.h командой

./configure –enable-64bit –enable-maildir -enable-default-domain = jth.net –enable-language = DA

Перед компиляцией GNU pop3d я убедился, что в config.h определены следующие константы:

#define MAILSPOOLHOME “/ Mail / mailbox”

#define USE_VIRTUAL 1

#define DEFAULT_DOMAIN “jth.net”

/etc/virtual/kvt.dk/passwd

Создайте этот файл со следующим содержимым:

Kvt: kvtpasswd: 601: 100: kvtname: / home / kvt_dk /:

Abc: abcpasswd: 601: 100: abcname:.:

601 – это идентификатор пользователя kvt_dk. 100 – это groupid (групповая почта на моем сервере). ‘.’ Homedir для abc – это просто сделать pwck счастливым.

Почта для [email protected] доставляется в / home / kvt_dk / Mail / mailbox (см. Ниже).

Почта для [email protected] доставляется в /var/spool/virtual/kvt.dk/abc

Если вы доверяете пользователю kvt_dk, создайте файл passwd в домашнем каталоге пользователя kvt_dk. И связать его в каталоге /etc/virtual/kvt.dk

Ln -s / home / kvt_dk / passwd /etc/virtual/kvt.dk/passwd

Обратите внимание, что здесь может возникнуть риск безопасности, поскольку GNU pop3d будет выполняться с любым идентификатором пользователя, указанным в файле passwd. Остается ли анализировать, является ли это реальной угрозой.

Владелец и разрешения для файлов и каталогов должны быть kvt_dk.mail и 700 e.g.

Chmod 700 /etc/virtual/kvt.dk/etc/virtual/kvt.dk/passwd/var/spool/virtual/kvt.dk

Chown kvt_dk.100 /etc/virtual/kvt.dk/etc/virtual/kvt.dk/passwd/var/spool/virtual/kvt.dk

Postfix

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

/etc/postfix/main.cf

recipient_delimiter = +

home_mailbox = Mail/mailbox

allow_mail_to_commands = forward

allow_mail_to_files = forward

/home/kvt_dk

-rw-r–r– 1 kvt_dk mail 12 Dec 10 02:52 .forward

-rw-r–r– 1 kvt_dk mail 25 Dec 10 01:55 .forward+abc–kvt.dk

-rw-r–r– 1 kvt_dk mail 20 Dec 10 02:53 .forward+kvt–kvt.dk

/home/kvt_dk/.forward

|”exit 67″

Отклонить любое сообщение не для [email protected] или [email protected]

/home/kvt_dk/.forward+abc–kvt.dk

|/usr/local/bin/virtual

Отправьте всю почту для [email protected] в почтовый ящик виртуального домена, чтобы abc изменить строку заголовка «Доставляется до:» до нужного.

/home/kvt_dk/.forward+kvt–kvt.dk

/home/kvt_dk/Mail/mailbox

Доставить всю почту для [email protected] в почтовый ящик kvt_dk

/etc/postfix/virtual

kvt.dk anything

[email protected] postmaster

[email protected] jth

Настоящие пользователи: postmaster и jth должны получать всю почту для почтмейстера и веб-мастера виртуального домена

/etc/postfix/virtual_regexp

/^(.+)@(.+\.)?(kvt\.dk)$/ kvt_dk+$1–$2$3

Это выражение заставит postfix доставлять любую почту с адресами [email protected] и [email protected] реальному пользователю kvt_dk, сохраняя получателя исходного конверта в качестве расширения к новому адресу получателя.

/usr/local/bin/virtual

awk -F: -f /usr/local/bin/virtual.awk

/usr/local/bin/virtual.awk

# J. Thomsen 2002-04-11 Утилита Postfix

# /usr/local/bin/virtual.awk

#

# Используется Postfix для доставки почты в виртуальный домен GNU-pop3d

# Mailbox.

#

# Postfix будет использовать эту утилиту для доставки сообщения локальному

# Mailbox, переписывающий строку заголовка Delivered-To исходному получателю

# адрес.

# 2002-04-11 Исправьте строки «From» в теле сообщения и добавьте пустую строку в сообщения, чтобы обеспечить разделение сообщений

#

Доставить почтовый ящик виртуального домена, например. [email protected] в /var/spool/virtual/kvt.dk/abc.

Заголовок Delivered-To: изменяется, чтобы содержать оригинальный адрес получателя конверта (после возможного изменения псевдонимами).