Изграждане на собствен имейл сървър на FreeBSD

05.05.2021 154 0

Да имате собствен имейл сървър изглежда като много предизвикателна задача, но не се притеснявайте. Ние ще ви помогнем да изградите собствен имейл сървър на FreeBSD.

От какво се нуждаете за вашия имейл сървър?

Трябва ви сървър с отворен порт 25. Може да вземете клауд сървър или нает сървър и след това следния софтуер: 

OpenSMTPd – MTA (message transfer agent), това е преносният агент, който ще използваме. Той ще осъществява комуникацията (през SMTP протокол) с имейл сървърите на други компании и ще доставя пристигащите имейли до съответните пощенски кутии на потребителите в FreeBSD

Dovecot – Това ще е MDA (агент по доставки на съобщения) за този гид. Ще използва IMAP или POP3 за доставки на имейли до потребителите.

Spamd – спам филтър. Може да използвате различни критерии за филтриране на имейли и да ги организирате в списъци. 

Идеята е: 

Външния свят ➡️ Защитна стена (Firewall) ➡️ spamd ➡️ OpenSMTPD ➡️ Пощенските кутии на потребителите

Външния свят ➡️ Защитна стена (Firewall) (spamd-allow списък позволени) ➡️ OpenSMTPD ➡️Пощенските кутии на потребителите

Външния свят ➡️ Защитна стена (Firewall) (IMAP/POP3) ➡️ Dovecot

Външния свят ➡️ Защитна стена (Firewall) (SMTPD submission)

Инсталиране на софтуера за имейл сървъра

Първата стъпка е да инсталираме нужния софтуер. За целта трябва да сте администратор (да имате судо привилегии). Може да следвате тази команда:

sudo pkg install opensmtpd dovecot spamd

Ще трябва да редактираме конфигурацията като добавим следните редове текст към /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“

Конфигурация на защитната стена (firewall) на FreeBSD

Ще използваме защитната стена PF firewall, затова следващата ни стъпка ще е да създадем конфигурация в /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-allow> persist

# Allowed 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 allow list

pass quick log on $ext_if inet proto tcp from <spamd-allow> 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-allow> <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

Тук добавяме  $ext_if променлива за vtnet0 устройство, за да го използваме по-късно. Също така дефинираме невалидни IP адреси, които не бива да бъдат позволявани на външни интерфейси.

Има две таблици spamd и spamd-allow, които идват по подразбиране от spamd. И ние добавяме още една таблица webmailВ тази ще добавим големите уеб мейл доставчици.

За да видите таблицата, може да ползвате тази команда:

pfctl -t tablename -T show 

С тази команда казваме, че искаме да пропуснем обработката по локалния интерфейс, позволяваме статистики за външния интерфейс и пренасочите идващите пакети. Следващата стъпка е да администрираме изходящия трафик към spamd или OpenSMTPd.

Синтаксисът на правилата за пренасочване са старите от PF синтаксиса. Някои неща може да ви се сторят малко странни. Целия трафик, който ще получаваме на SMTP от други устройства от таблицата spamd или, който не е в таблицата spamd-allow, ще бъде пренасочен през spamd deamon, който ще го администрира. Има няколко правила за предаването на получените имейли. Позволяваме съобщения от IP адресите, записани в spam-allow и webmail таблиците от OpenSMTPd. Ще получаваме съобщения на порт 587 (submission port).

Следват няколко правила, за по-подредена администрация, създаване на основни политики, позволяване на SSH и ICMP съобщения.

След това пускаме IMAP и POP3 на външния ни интерфейс и към Dovecot.

Следващата команда ще позволи целия изходящ трафик. 

Стартирайте защитната стена (firewall PF):

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

В началото трябва да дефинираме външния интерфейс (external interface), таблици (tables), имена (aliases) и домейни (domains). След това ще отидем към SSL сертификата за домейна. 

Ще проверим локалния хост (localhost) за примерния домейн – mail.example.com. След това ще прегледаме филтрираните spamd съобщения и тези от външни интерфейси. 

И последно, ще видим тези на порт 587 и ще проверим автентичността им.

След това ще се преместим на настройките за приемане. Ще можем да приемаме съобщения от домейните в нашата таблица „Домейни“ и те ще бъдат доставени до нашата директория maildir (home directory). Ще приемаме всички локални връзки за локалните пощенски кутии и ще ги прекарваме през реле, за да можем да изпратим имейли.

Имена (Aliases)

В FreeBSD по подразбиране има файл с имена alias file /etc/mail/aliases с такъв формат:

vuser1: user1

vuser2: user1

vuser3: user1

vuser4: user2

Това ще са нашите пощенски кутии. Ще създадем локални потребители, които ще имат пощенски кутии на сървъра. 

Домейни (Domains)

Да създадем файл за домейните на FreeBSD не е трудно:

# Domains

example.com

mail.example.com

smtp.example.com

Това е прост текстови файл, който ще поставите на нова линия от текста. Символът “#” е за вас, за да оставите коментар. 

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

Ще използвате подписани от вас сертификати или подписани от други организации. Може да използвате Let’s Encrypt, за да се сдобиете с безплатен сертификат. 

Нека да запишем програмата certbot.

sudo pkg install py-certbot

След това отивате на вашите сертификати, като преди това се уверите, че порт 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

В този случай създаваме за mail.example.com. Вие можете да направите така, че crontab да включва certbot веднъж на 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

Ще ползваме spamd, за да спрем някои спам източници с техните източници, за които се знае, че са извор на спам съобщения. Ще поставим връзките в сив списък (greylist), така че всяко ново устройство, което все още не е в нашия черен списък, да получи съобщение за грешка. Спам изпращачите няма да се опитат да изпратят на ново съобщението след грешка, докато нормалните хора ще опитат. 

Изпълнете следната команда за прикачване на 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 вече е готов за работа.

Позволяване на Уеб Мейл (Webmail Services)

Един проблем, който методът на сивия списък притежава е, че големите уеб мейл доставчици (като Google) изпращат имейли от различни сървъри. Трябва да позволим диапазон от IP адреси специално за тези уеб услуги. Това е частта webmail таблица в PF конфигурацията. 

За да добавим диапазон от IP адреси в webmail таблицата, може да използвате следната команда:

pfctl -t webmail -T add 192.0.2.0/24

Dovecot

Ако искате потребителите да имат по-удобен достъп, ще ви трябва MDA с IPAM/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. Тази конфигурация работи отлично за повечето хора, но вие може да я модифицирате за конкретните ви нужди. 

Удостоверяване (Authentication)

Повечето настройки по подразбиране ще са правилните. Ако искате да използвате системните потребители за удостоверение, ще трябва да редактирате 10-auth.conf.

Премахнете коментара на следния ред:

!include auth-system.conf.ext

Криптиране (Encryption)

Ще трябва да генерираме Diffie-Hellman параметри:

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

Бележка: Командата ще отнеме време. Повече от очакваното.

След като е готова може да стартирате Dovecot:

sudo service dovecot start

Заключение

Вече имате напълно функционален, безопасен и със спам защита имейл сървър на FreeBSD OS. Допълнително може да намалите спама с допълнителен софтуер, но тази конфигурация ще е достатъчна за повечето организации.

Ако имате нужда от друг вид мейл сървър, погледнете следната статия:

Вашият коментар

Вашият имейл адрес няма да бъде публикуван.