Создание собственного почтового сервера с FreeBSD 11

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

После этого давайте перейдем к запуску нашего собственного почтового сервера.

обзор

Для установки требуется три части программного обеспечения, которые не включены в базовую систему FreeBSD:

  • OpenSMTPd
  • голубятня
  • spamd

OpenSMTPd - агент передачи почты (MTA) и агент доставки почты (MDA). Это означает, что он может связываться с другими почтовыми серверами по SMTPпротоколу, а также обрабатывать доставку почты в почтовые ящики отдельных пользователей. Мы будем настраивать OpenSMTPd, чтобы он мог взаимодействовать с внешними серверами (фильтруется через spamd) и доставлять почту локальным пользователям, а также доставлять локальную почту от пользователя к пользователю.

Dovecot - это MDA, который читает локальные почтовые ящики и передает их пользователям по IMAP или POP3. Он будет использовать почтовые ящики локальных пользователей для обслуживания этого контента.

Spamd - сервис фильтрации почты. Мы можем пересылать почту через spamd, и она будет фильтровать почту на основе множества черных, белых и серых списков.

Общая идея для этого почтового сервера требует нескольких разных путей:

Outside world -> Firewall -> spamd -> OpenSMTPD -> User mail boxes
Outside world -> Firewall (spamd-whitelist) -> OpenSMTPD -> User mailboxes
Outside world -> Firewall (IMAP/POP3) -> Dovecot
Outside world -> Firewall (SMTPD submission)

Для этого урока мы будем использовать версию FreeBSD PF OpenBSD для нашего брандмауэра. Вы также можете использовать ipfw, где конфигурация очень похожа.

Примечание. По умолчанию Vultr блокирует порт 25, который везде используется SMTP-серверами. Если вы хотите запустить полнофункциональный почтовый сервер, вам нужно будет открыть этот порт.

Начальная настройка

Для начала нам нужно установить необходимые программы.

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

Пакеты (рекомендуется)

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

sudo pkg install opensmtpd dovecot spamd

Следующие makeкоманды предоставят вам множество опций компиляции, значения по умолчанию будут работать нормально. Не меняйте их, если вы точно не знаете, что делаете.

sudo portsnap fetch update   # or run portsnap fetch extract if using ports for the first time
cd /usr/ports/mail/opensmtpd  
make install  # Installs openSMTPd
make clean
cd /usr/ports/mail/dovecot
make install  # Installs dovecot
make clean
cd /usr/ports/mail/spamd
make install  # Installs spamd
make clean

Нам нужно будет добавить следующие строки /etc/rc.conf:

pf_enable="YES"
pf_rules="/usr/local/etc/pf.conf"
pflog_enable="YES"
pflog_logfile="/var/log/pflog"

obspamd_enable="YES"
obspamd_flags="-v"
obspamlogd_enable="YES"

dovecot_enable="YES"

Настройка брандмауэра

Чтобы настроить PF, мы можем создать наш /usr/local/etc/pf.conf:

## Set public interface ##
ext_if="vtnet0"

## set and drop IP ranges on the public interface ##
martians = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \
          10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, \
          0.0.0.0/8, 240.0.0.0/4 }"

table <spamd> persist
table <spamd-white> persist

# Whitelisted webmail services
table <webmail> persist file "/usr/local/etc/pf.webmail.ip.conf"

## Skip loop back interface - Skip all PF processing on interface ##
set skip on lo

## Sets the interface for which PF should gather statistics such as bytes in/out and packets passed/blocked ##
set loginterface $ext_if

# Deal with attacks based on incorrect handling of packet fragments 
scrub in all


# Pass spamd whitelist
pass quick log on $ext_if inet proto tcp from <spamd-white> to $ext_if port smtp \
    -> 127.0.0.1 port 25
# Pass webmail servers
rdr pass quick log on $ext_if inet proto tcp from <gmail> to $ext_if port smtp \
    -> 127.0.0.1 port 25
# pass submission messages.
pass quick log on $ext_if inet proto tcp from any to $ext_if port submission modulate state
# Pass unknown mail to spamd
rdr pass log on $ext_if inet proto tcp from {!<spamd-white> <spamd>} to $ext_if port smtp \
    -> 127.0.0.1 port 8025 

## Blocking spoofed packets
antispoof quick for $ext_if

## Set default policy ##
block return in log all
block out all

# Drop all Non-Routable Addresses 
block drop in quick on $ext_if from $martians to any
block drop out quick on $ext_if from any to $martians

pass in inet proto tcp to $ext_if port ssh

# Allow Ping-Pong stuff. Be a good sysadmin 
pass inet proto icmp icmp-type echoreq

# Open up imap/pop3 support
pass quick on $ext_if proto tcp from any to any port {imap, imaps, pop3, pop3s} modulate state


# Allow outgoing traffic
pass out on $ext_if proto tcp from any to any modulate state
pass out on $ext_if proto udp from any to any keep state

Это рабочая конфигурация PF. Это относительно просто, но есть несколько причуд, которые также нужно объяснить.

Во-первых, мы определяем нашу $ext_ifпеременную для нашего vtnet0устройства для последующего использования. Мы также определяем недопустимые IP-адреса, которые должны быть удалены на внешнем интерфейсе.

Мы также определяем две таблицы, spamdи spamd-white- эти две таблицы создаются spamd в конфигурации по умолчанию. Кроме того, мы определяем таблицу с именем, webmailкоторую мы будем использовать, чтобы пропустить через нее некоторых крупных поставщиков веб-почты.

Чтобы просмотреть таблицу, вы можете использовать команду pfctl -t tablename -T showдля вывода списка элементов в таблице.

Мы установили несколько правил PF: пропустить обработку на локальном интерфейсе, включить статистику на внешнем интерфейсе и очистить входящие пакеты.

Далее идет одна из наиболее важных частей, где мы управляем отправкой нашего трафика через spamd или OpenSMTPd.

Прежде всего, это правило перенаправления (обратите внимание на синтаксис здесь, FreeBSD 11 использует синтаксис PF старого стиля (pre-OpenBSD 4.6), поэтому синтаксис может показаться странным. Если мы получим что-нибудь по smtp от хоста, указанн��го в spamdтаблице или не указанного в spamd-whiteстол, мы перенаправлять соединение через к spamd демона, который имеет дело с этими соединениями. следующие три правила являются PASSTHROUGH правила , так что мы можем реально получать почту. мы проходим через сообщения из IP - адресов , перечисленных в spamd-whiteи webmailтаблицах прямо через OpenSMTPd. Также мы принимаем сообщения через порт отправки ( 587).

Затем есть несколько правил обслуживания, которые устанавливают нашу политику по умолчанию и принимают сообщения SSH и ICMP.

Затем мы передаем IMAP и POP3 через наш внешний интерфейс для доступа к Dovecot.

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

Начать ПФ:

sudo service pf start

Теперь, когда у нас есть настройка брандмауэра, мы можем перейти к настройке нашего почтового сервера.

OpenSMTPd

OpenSMTPd имеет очень простой и легко читаемый синтаксис конфигурации. Вся рабочая конфигурация может уместиться в 14 строк, как вы можете видеть ниже:

#This is the smtpd server system-wide configuration file.
# See smtpd.conf(5) for more information.

ext_if=vtnet0

# If you edit the file, you have to run "smtpctl update table aliases"
table aliases   file:/etc/mail/aliases
table domains   file:/etc/mail/domains

# Keys
pki mail.example.com key "/usr/local/etc/letsencrypt/live/mail.example.com/privkey.pem"
pki mail.example.com certificate "/usr/local/etc/letsencrypt/live/mail.example.com/fullchain.pem"
# If you want to listen on multiple subdomains (e.g. mail.davidlenfesty) you have to add more lines
# of keys, and more lines of listeners

# Listen for local SMTP connections
listen on localhost hostname mail.example.com

# listen for filtered spamd connections
listen on lo0 port 10026

# Listen for submissions
listen on $ext_if port 587 tls-require auth pki mail.example.com tag SUBMITTED

# Accept mail from external sources.
accept from any for domain <domains> alias <aliases> deliver to maildir "~/mail"

accept for local alias <aliases> deliver to maildir "~/mail"
accept from local for any relay tls
accept tagged SUBMITTED for any relay tls

Во-первых, мы снова определяем наш внешний интерфейс, а также несколько таблиц, псевдонимов и доменов. Затем мы переходим к ключу SSL и сертификату для любых доменов, под которыми мы хотим обрабатывать почту.

В следующем разделе мы определим интерфейсы и порты, которые мы хотим прослушивать. Во-первых, мы прослушиваем localhost для нашего mail.example.comдомена, для любых локальных соединений. Затем мы прослушиваем наши спам-фильтрованные сообщения и отправляем сообщения на внешний интерфейс. Наконец, мы прислушиваемся к представлениям, они происходят через порт, 587и мы требуем, чтобы они проходили аутентификацию по соображениям безопасности.

Наконец, наши acceptнастройки. Мы принимаем любое сообщение для любого из наших доменов, определенных в нашей domainsтаблице, для псевдонимов в нашей aliasesтаблице, чтобы доставить их в домашний каталог в maildirформате. Затем мы принимаем все локальные соединения для локальных почтовых ящиков и ретранслируем наши сообщения, чтобы мы могли отправлять электронную почту. Наконец, мы принимаем отправленные нами сообщения для ретрансляции. Если бы мы не требовали аутентификацию для нашего порта отправки, это было бы большой угрозой безопасности. Это позволило бы любому использовать наш сервер в качестве спам-реле.

Псевдонимы

FreeBSD поставляется с файлом псевдонимов по умолчанию /etc/mail/aliasesв следующем формате:

vuser1:  user1
vuser2:  user1
vuser3:  user1
vuser4:  user2

Это определяет различные почтовые ящики и куда мы хотим пересылать сообщения, отправленные на эти определенные почтовые ящики. Мы можем определить наших пользователей как локальных системных пользователей или внешние почтовые ящики для пересылки. Файл FreeBSD по умолчанию довольно описательный, поэтому вы можете обратиться к нему для справки.

Домены

FreeBSD не предоставляет файл доменов по умолчанию, но это невероятно просто:

# Domains
example.com
mail.example.com
smtp.example.com

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

SSL сертификаты

Существует два способа обеспечить безопасность связи с почтовым сервером: самоподписанные и подписанные сертификаты. Конечно, можно подписать сертификаты самостоятельно, однако такие сервисы, как Let's Encrypt, предоставляют бесплатную и невероятно простую в использовании подпись.

Сначала мы должны установить программу certbot.

sudo pkg install py-certbot

Кроме того, он может быть установлен с портами:

cd /usr/ports/security/py-certbot
make install
make clean

Затем, чтобы получить сертификат, вам нужно убедиться, что вы открыли порт 80на внешнем интерфейсе. Добавьте следующие строки в ваши правила фильтрации /usr/local/etc/pf.conf:

pass quick on $ext_if from any to any port http

Затем запустите, pfctl -f /usr/local/etc/pf.confчтобы перезагрузить набор правил.

Затем вы можете запустить команду для любых доменов, для которых вы хотите получить сертификат:

certbot certonly --standalone -d mail.example.com

Рекомендуется настроить запись в crontab так, чтобы она запускалась certbot renewраз в 6 месяцев, чтобы срок действия ваших сертификатов не истек.

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

pki mail.example.com key "/usr/local/etc/letsencrypt/live/mail.example.com/privkey.pem"
pki mail.example.com certificate "/usr/local/etc/letsencrypt/live/mail.example.com/fullchain.pem"

Редактировать ценные бумаги:

sudo chmod 700 /usr/local/etc/letsencrypt/archive/mail.example.com/*

Примечание. Это необходимо сделать для каждого исходного файла ключей, иначе OpenSMTPd не откроет их.

Теперь мы можем запустить сервис:

sudo service smtpd start

Настройка спама

Здесь мы используем демон spamd в OpenBSD, чтобы уменьшить количество спама, получаемого из Интернета. По сути, это отфильтровывает сообщения с IP-адресов, которые известны как плохие, из различных источников спама, а также (по умолчанию) «серые» входящие соединения. Spamd также пытается тратить время спама, «заикаясь» в черный и черный списки соединений, что означает, что он распространяет свой ответ в течение нескольких секунд, что заставляет клиента оставаться открытым дольше, чем обычно.

Создание серого списка соединения выполняется, когда подключается любой новый IP-адрес, которого нет ни в черном, ни в белом списке. После подключения нового адреса spamd удаляет сообщение с безобидным сообщением об ошибке, а затем добавляет его во временный список. Поскольку спамерам платят за доставленные сообщения, они не попытаются повторить ошибку, тогда как законная служба повторит попытку относительно скоро.

Вам нужно выполнить следующее для монтирования fdescfs:

mount -t fdescfs null /dev/fd

Затем вам нужно будет добавить эту строку в /etc/fstab:

fdescfs     /dev/fd     fdescfs rw      0       0

Файл конфигурации по умолчанию (находится в /usr/local/etc/spamd/spamd.conf.sample) будет работать нормально. Вы можете отредактировать его, чтобы добавить новые источники или изменить используемые вами источники:

sudo cp /usr/local/etc/spamd/spamd.conf.sample /usr/local/etc/spamd/spamd.conf

Мы можем запустить сервис со следующим:

sudo service obspamd start

На данный момент spamd настроен.

Включение веб-служб

Одна проблема с подходом «серых списков» заключается в том, что крупные почтовые службы часто отправляют почту через одну из множества разных спул, и вы не гарантируете, что один и тот же сервер будет отправлять сообщение каждый раз. Одним из решений этой проблемы является внесение в белый список диапазонов IP-адресов, используемых различными службами веб-почты. Это то, для чего используется таблица веб-почты в конфигурации PF. Эта стратегия может иметь неприятные последствия, если вы включите IP-адрес, который использует спамер, но если вы будете осторожны с теми диапазонами, которые вы указали в таблице, у вас все будет хорошо.

Чтобы добавить диапазон адресов электронной почты в таблицу веб-почты, вы можете выполнить следующую команду:

pfctl -t webmail -T add 192.0.2.0/24

голубятня

Если вы хотите, чтобы пользователи имели доступ к своей почте без входа в систему через SSH, вам понадобится MDA, поддерживающий IMAP и / или POP3. Очень популярная программа - Dovecot, с довольно простой конфигурацией и мощными функциями.

Мы можем скопировать конфигурацию по умолчанию:

cd /usr/local/etc/dovecot
cp -R example-config/* ./

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

sudo doveconf -n

Ниже приведена простая рабочая конфигурация:

# 2.3.2.1 (0719df592): /usr/local/etc/dovecot/dovecot.conf
# OS: FreeBSD 11.2-RELEASE amd64  
# Hostname: mail.example.com
hostname = mail.example.com
mail_location = maildir:~/mail
namespace inbox {
  inbox = yes
  location = 
  mailbox Archive {
    auto = create
    special_use = \Archive
  }
  mailbox Archives {
    auto = create
    special_use = \Archive
  }
  mailbox Drafts {
    auto = subscribe
    special_use = \Drafts
  }
  mailbox Junk {
    auto = create
    autoexpunge = 60 days
    special_use = \Junk
  }
  mailbox Sent {
    auto = subscribe
    special_use = \Sent
  }
  mailbox "Sent Mail" {
    auto = no
    special_use = \Sent
  }
  mailbox "Sent Messages" {
    auto = no
    special_use = \Sent
  }
  mailbox Spam {
    auto = no
    special_use = \Junk
  }
  mailbox Trash {
    auto = no
    autoexpunge = 90 days
    special_use = \Trash
  }
  prefix = 
  separator = /
}
passdb {
  args = imap
  driver = pam
}
ssl = required
ssl_cert = </usr/local/etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_dh = </usr/local/etc/dovecot/dh.pem
ssl_key = </usr/local/etc/letsencrypt/live/mail.example.com/privkey.pem
userdb {
  driver = passwd
}

Большинство конфигурационных файлов будут в conf.d

Важными из них 10-auth.conf, 10-mail.confи 10-ssl.conf.

Вы можете настроить различные почтовые ящики, в которых вы используете 15-mailboxes.conf. То, что вы видите выше, является хорошей конфигурацией для многих систем, но ваш пробег может отличаться. Рекомендуется поиграть с этим как можно большим количеством разных клиентов.

Аутентификация

Большинство настроек по умолчанию будут правильными. Если вы хотите использовать пользователей системы для аутентификации, вам придется редактировать 10-auth.conf.

Раскомментируйте следующую строку:

! включить auth-system.conf.ext

шифрование

Мы должны сгенерировать параметры Диффи-Хеллмана:

sudo nohup openssl dhparam -out /usr/local/etc/dovecot/dh.pem

Примечание: это займет много времени для запуска. Намного дольше, чем вы могли ожидать.

Теперь мы можем запустить Dovecot:

sudo service dovecot start

Вывод

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

Здесь есть еще кое-что, что можно использовать, используя SpamAssassin для эвристического избавления от спама, а также находя больше черных списков спама, опубликованных источниками, которым вы доверяете.


Tags: #BSD #Email

Leave a Comment

Изучение 26 методов анализа больших данных: часть 1

Изучение 26 методов анализа больших данных: часть 1

Изучение 26 методов анализа больших данных: часть 1

6 невероятных фактов о Nintendo Switch

6 невероятных фактов о Nintendo Switch

Многие из вас знают Switch, который выйдет в марте 2017 года, и его новые функции. Для тех, кто не знает, мы подготовили список функций, которые делают «Switch» обязательным гаджетом.

Технические обещания, которые все еще не выполнены

Технические обещания, которые все еще не выполнены

Вы ждете, когда технологические гиганты выполнят свои обещания? проверить, что осталось недоставленным.

Функциональные возможности уровней эталонной архитектуры больших данных

Функциональные возможности уровней эталонной архитектуры больших данных

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

Как ИИ может вывести автоматизацию процессов на новый уровень?

Как ИИ может вывести автоматизацию процессов на новый уровень?

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

CAPTCHA: как долго она может оставаться жизнеспособным методом различения между человеком и ИИ?

CAPTCHA: как долго она может оставаться жизнеспособным методом различения между человеком и ИИ?

CAPTCHA стало довольно сложно решать пользователям за последние несколько лет. Сможет ли он оставаться эффективным в обнаружении спама и ботов в ближайшем будущем?

Технологическая сингулярность: далекое будущее человеческой цивилизации?

Технологическая сингулярность: далекое будущее человеческой цивилизации?

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

Телемедицина и удаленное здравоохранение: будущее уже здесь

Телемедицина и удаленное здравоохранение: будущее уже здесь

Что такое телемедицина, дистанционное здравоохранение и их влияние на будущее поколение? Это хорошее место или нет в ситуации пандемии? Прочтите блог, чтобы узнать мнение!

Вы когда-нибудь задумывались, как хакеры зарабатывают деньги?

Вы когда-нибудь задумывались, как хакеры зарабатывают деньги?

Возможно, вы слышали, что хакеры зарабатывают много денег, но задумывались ли вы когда-нибудь о том, как они зарабатывают такие деньги? Давайте обсудим.

Обновление дополнения к macOS Catalina 10.15.4 вызывает больше проблем, чем решает

Обновление дополнения к macOS Catalina 10.15.4 вызывает больше проблем, чем решает

Недавно Apple выпустила macOS Catalina 10.15.4, дополнительное обновление для исправления проблем, но похоже, что это обновление вызывает больше проблем, приводящих к поломке компьютеров Mac. Прочтите эту статью, чтобы узнать больше