Budowanie własnego serwera pocztowego za pomocą FreeBSD 11

Prowadzenie własnego serwera e-mail może być bardzo satysfakcjonujące. Odpowiadasz za swoje dane. Umożliwia także większą elastyczność dzięki opcjom dostawy. Jest jednak kilka wyzwań. Ryzykujesz otwarcie swojego serwera na luki, a także uczynienie go potencjalnym przekaźnikiem dla spamerów.

W ten sposób przejdźmy do uruchomienia własnego serwera pocztowego.

Przegląd

Do zainstalowania potrzebne są trzy elementy oprogramowania, które nie są zawarte w systemie podstawowym FreeBSD:

  • OpenSMTPd
  • Gołębnik
  • spam

OpenSMTPd to agent przesyłania poczty (MTA) i agent dostarczania poczty (MDA). Oznacza to, że może komunikować się z innymi serwerami pocztowymi za pośrednictwem SMTPprotokołu, a także obsługuje dostarczanie poczty do skrzynek pocztowych poszczególnych użytkowników. Będziemy konfigurować OpenSMTPd, aby mógł komunikować się z serwerami zewnętrznymi (filtrowanymi przez spam) i dostarczać pocztę lokalnym użytkownikom, a także dostarczać pocztę lokalną od użytkownika do użytkownika.

Dovecot to MDA, która odczytuje lokalne skrzynki pocztowe i podaje je użytkownikom przez IMAP lub POP3. Będzie używać skrzynek pocztowych użytkowników lokalnych do udostępniania tej zawartości.

Spamd to usługa filtrowania poczty. Możemy przekazywać pocztę przez spam, a ona będzie filtrować pocztę na podstawie różnych czarnych list, białych list i szarej listy.

Ogólny pomysł na ten serwer pocztowy wymaga kilku różnych ścieżek:

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)

W tym samouczku użyjemy wersji PBS OpenBSD dla naszego firewalla. Możesz także użyć ipfw, gdy konfiguracja jest bardzo podobna.

Uwaga: Vultr domyślnie blokuje port 25, z którego wszędzie korzystają serwery SMTP. Jeśli chcesz uruchomić w pełni funkcjonalny serwer pocztowy, musisz otworzyć ten port.

Początkowe ustawienia

Najpierw musimy zainstalować wymagane programy.

Zakładając, że działasz jako użytkownik z skonfigurowanym dostępem sudo, możemy uruchomić następujące polecenia. Będą się różnić w zależności od tego, czy korzystasz z portów, czy pakietów.

Pakiety (zalecane)

O ile nie potrzebujesz specjalnych funkcji wbudowanych w te narzędzia, zaleca się instalację za pomocą pakietów. Jest to łatwiejsze, zajmuje mniej czasu i zasobów serwera oraz zapewnia intuicyjny, przyjazny dla użytkownika interfejs.

sudo pkg install opensmtpd dovecot spamd

Następujące makepolecenia dadzą ci wiele opcji kompilacji, domyślne będą działać dobrze. Nie zmieniaj ich, chyba że dokładnie wiesz, co robisz.

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

Będziemy musieli dodać następujące wiersze /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"

Konfiguracja zapory ogniowej

Aby skonfigurować PF, możemy utworzyć /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

To działa konfiguracja PF. Jest to stosunkowo proste, ale należy wyjaśnić kilka dziwactw.

Po pierwsze, definiujemy naszą $ext_ifzmienną, aby nasze vtnet0urządzenie mogło z niej później korzystać. Definiujemy również nieprawidłowe adresy IP, które należy upuścić na interfejsie zewnętrznym.

Definiujemy również dwie tabele, spamdi spamd-white- te dwie tabele są tworzone przez spamd w domyślnej konfiguracji. Ponadto definiujemy tabelę o nazwie, webmailktórej będziemy używać, aby umożliwić niektórym głównym dostawcom poczty internetowej.

Aby wyświetlić tabelę, możesz użyć polecenia, pfctl -t tablename -T showaby wyświetlić listę elementów w tabeli.

Ustawiliśmy kilka reguł PF: pomiń przetwarzanie na interfejsie lokalnym, włącz statystyki na interfejsie zewnętrznym i przeszukuj przychodzące pakiety.

Dalej jest jedna z ważniejszych części, w której zarządzamy wysyłaniem naszego ruchu do spamu lub OpenSMTPd.

Najpierw jest reguła przekierowania (zwróć uwagę na składnię tutaj, FreeBSD 11 używa starszej stylu składni PF (wcześniejszej niż OpenBSD 4.6), więc składnia może wydawać się dziwna. Jeśli otrzymamy cokolwiek na smtp od hosta wymienionego w spamdtabeli lub niewymienionego w spamd-whitestół, możemy przekierować połączenie przez do spamd demona, który zajmuje się tymi połączeniami. kolejne trzy zasady są pASSTHROUGH reguły tak, że rzeczywiście możemy odbierać pocztę. Mijamy wiadomości z adresów IP wymienionych w sekcji spamd-whitei webmailtabel prosto do OpenSMTPd. Ponadto akceptujemy wiadomości wysyłane przez port przesyłania ( 587).

Następnie istnieje kilka zasad porządkowania, które ustawiają nasze domyślne zasady i akceptują wiadomości SSH i ICMP.

Następnie przekazujemy IMAP i POP3 na naszym interfejsie zewnętrznym w celu uzyskania dostępu do Dovecot.

Wreszcie zezwalamy na cały ruch wychodzący. Jeśli chcesz dodać dodatkowe zabezpieczenia, możesz ograniczyć liczbę przekazywanych portów, ale w przypadku serwera jednorazowego użytku nie jest problemem przejście wszystkich.

Uruchom PF:

sudo service pf start

Po skonfigurowaniu zapory możemy przejść do konfiguracji serwera pocztowego.

OpenSMTPd

OpenSMTPd ma bardzo prostą i łatwą do odczytania składnię konfiguracji. Cała konfiguracja robocza może zmieścić się w 14 liniach, jak widać poniżej:

#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

Po pierwsze, ponownie definiujemy nasz interfejs zewnętrzny, a także kilka tabel, aliasów i domen. Następnie przechodzimy do klucza SSL i certyfikatu dla wszystkich domen, w których chcemy obsługiwać pocztę.

W następnej sekcji definiujemy interfejsy i porty, na których chcemy nasłuchiwać. Po pierwsze, nasłuchujemy na localhost dla naszej mail.example.comdomeny, dla wszelkich połączeń lokalnych. Następnie nasłuchujemy wiadomości odfiltrowanych przez spam i przesłanych wiadomości w interfejsie zewnętrznym. Wreszcie nasłuchujemy zgłoszeń, 587które odbywają się na porcie i ze względów bezpieczeństwa wymagamy ich uwierzytelnienia.

Wreszcie są nasze acceptustawienia. Akceptujemy każdą wiadomość dla którejkolwiek z naszych domen zdefiniowanych w naszej domainstabeli dla aliasów w naszej aliasestabeli, aby dostarczyć ją do katalogu domowego w maildirformacie. Następnie akceptujemy wszystkie połączenia lokalne dla lokalnych skrzynek pocztowych i przekazujemy nasze wiadomości, abyśmy mogli wysyłać wiadomości e-mail. Wreszcie, akceptujemy nasze przesłane wiadomości do przekazania. Gdybyśmy nie wymagali uwierzytelnienia dla naszego portu przesyłania danych, stanowiłoby to duże zagrożenie bezpieczeństwa. Pozwoliłoby to każdemu wykorzystać nasz serwer jako przekaźnik spamu.

Skróty

FreeBSD jest dostarczany z domyślnym plikiem aliasu /etc/mail/aliasesw następującym formacie:

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

Określa różne skrzynki pocztowe i miejsce, w którym chcemy przekazywać wiadomości wysłane do tych zdefiniowanych skrzynek pocztowych. Możemy zdefiniować naszych użytkowników jako użytkowników systemu lokalnego lub zewnętrzne skrzynki pocztowe, do których będziemy przekazywać dalej. Domyślny plik FreeBSD jest dość opisowy, więc możesz odwoływać się do niego w celach informacyjnych.

Domeny

FreeBSD nie dostarcza domyślnego pliku domen, ale jest to niezwykle proste:

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

To tylko zwykły plik tekstowy z każdą domeną, której chcesz słuchać w nowej linii. Możesz dodać komentarz za pomocą #symbolu. Ten plik istnieje po prostu, aby można było użyć mniejszej liczby wierszy konfiguracji.

Certyfikaty SSL

Istnieją dwa sposoby zabezpieczenia komunikacji z serwerem poczty, samopodpisanymi i podpisanymi certyfikatami. Z pewnością możliwe jest samopodpisanie certyfikatów, jednak usługi takie jak Let's Encrypt zapewniają bezpłatne i niezwykle łatwe w użyciu podpisywanie.

Najpierw musimy zainstalować program certbot.

sudo pkg install py-certbot

Alternatywnie można go zainstalować z portami:

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

Następnie, aby uzyskać certyfikat, musisz upewnić się, że otworzyłeś port 80na zewnętrznym interfejsie. Dodaj następujące wiersze gdzieś w regułach filtrowania w /usr/local/etc/pf.conf:

pass quick on $ext_if from any to any port http

Następnie uruchom, pfctl -f /usr/local/etc/pf.confaby ponownie załadować zestaw reguł.

Następnie możesz uruchomić polecenie dla wszystkich domen, dla których chcesz uzyskać certyfikat:

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

Zalecane jest skonfigurowanie wpisu pliku crontab, aby był uruchamiany certbot renewco 6 miesięcy, aby upewnić się, że certyfikaty nie wygasają.

Następnie dla każdej odpowiedniej domeny możesz zmodyfikować linie, aby wskazywały właściwy plik klucza:

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"

Edytuj zabezpieczenia:

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

Uwaga: Musisz to zrobić dla każdego oryginalnego pliku klucza, w przeciwnym razie OpenSMTPd ich nie otworzy.

Teraz możemy uruchomić usługę:

sudo service smtpd start

Konfigurowanie spamu

Tutaj używamy demona spamd OpenBSD, aby zmniejszyć ilość spamu, który otrzymujemy z Internetu. Zasadniczo odfiltrowuje wiadomości z adresów IP, które są znane jako złe z różnych źródeł spamu, a także (domyślnie) przychodzące połączenia „szarej listy”. Spamd próbuje również zmarnować czas spamera, „jąkając się” na czarnych i szarych połączeniach, co oznacza, że ​​rozkłada swoją odpowiedź na kilka sekund, co zmusza klienta do pozostania otwartym dłużej niż zwykle.

Szare listy połączeń są wykonywane, gdy łączy się nowy adres IP, który nie znajduje się na żadnej czarnej liście ani białej liście. Gdy nowy adres się połączy, spamd upuszcza wiadomość z niepotrzebnym komunikatem o błędzie, a następnie dodaje ją do listy tymczasowej. Ponieważ spamerzy otrzymują wynagrodzenie za dostarczone wiadomości, nie ponawiają próby wystąpienia błędu, natomiast legalna usługa spróbuje ponownie stosunkowo szybko.

Będziesz musiał uruchomić następujące polecenia, aby zamontować fdescfs:

mount -t fdescfs null /dev/fd

Następnie musisz dodać ten wiersz do /etc/fstab:

fdescfs     /dev/fd     fdescfs rw      0       0

Domyślny plik konfiguracyjny (znaleziony w /usr/local/etc/spamd/spamd.conf.sample) będzie działał dobrze. Możesz go edytować, aby dodać nowe źródła lub zmienić źródła, z których korzystasz:

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

Możemy uruchomić usługę w następujący sposób:

sudo service obspamd start

W tym momencie konfigurowany jest spam.

Włączanie usług poczty internetowej

Jednym z problemów związanych z szarą listą jest to, że duże usługi pocztowe często wysyłają pocztę za pośrednictwem jednego z wielu różnych buforów i nie ma gwarancji, że ten sam serwer będzie wysyłał wiadomość za każdym razem. Jednym z rozwiązań jest dodanie do białej listy zakresów adresów IP używanych przez różne usługi poczty internetowej. Do tego służy tabela poczty internetowej w konfiguracji PF. Ta strategia może przynieść odwrotny skutek, jeśli podasz adres IP, z którego korzysta spamer, ale dopóki będziesz ostrożny z tym, jakie zakresy umieścisz w tabeli, nic ci nie będzie.

Aby dodać zakres wiadomości e-mail do tabeli poczty internetowej, możesz uruchomić następujące polecenie:

pfctl -t webmail -T add 192.0.2.0/24

Gołębnik

Jeśli chcesz, aby użytkownicy mieli dostęp do swojej poczty bez logowania przez SSH, potrzebujesz MDA obsługującej IMAP i / lub POP3. Bardzo popularnym programem jest Dovecot, z dość prostą konfiguracją i potężnymi funkcjami.

Możemy skopiować domyślną konfigurację:

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

Konfiguracja składa się z kilku różnych plików. Aby zobaczyć różnice między konfiguracją a wartościami domyślnymi dovecot, uruchom poniższe polecenie:

sudo doveconf -n

Oto prosta, działająca konfiguracja:

# 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
}

Większość plików konfiguracyjnych będzie w conf.d

Ważnymi nich są 10-auth.conf, 10-mail.confi 10-ssl.conf.

Możesz skonfigurować różne skrzynki pocztowe, w których używasz 15-mailboxes.conf. To, co widać powyżej, jest dobrą konfiguracją dla wielu systemów, ale przebieg może się różnić. Zaleca się, aby bawić się tym z jak największą liczbą różnych klientów.

Poświadczenie

Większość ustawień domyślnych będzie poprawna. Jeśli chcesz użyć użytkowników systemu do uwierzytelnienia, będziesz musiał dokonać edycji 10-auth.conf.

Odkomentuj następujący wiersz:

! include auth-system.conf.ext

Szyfrowanie

Musimy wygenerować parametry Diffie-Hellmana:

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

Uwaga: Uruchomienie zajmie dużo czasu. Znacznie dłużej niż można się spodziewać.

Możemy teraz uruchomić Dovecot:

sudo service dovecot start

Wniosek

W tym momencie mamy funkcjonalny, bezpieczny i stosunkowo wolny od spamu serwer pocztowy.

Kilka innych rzeczy do rozważenia tutaj to wykorzystanie SpamAssassin do heurystycznego pozbycia się spamu, a także znalezienie większej ilości spamowanych czarnych list zamieszczanych przez zaufane źródła.


Tags: #BSD #Email

Leave a Comment

Funkcjonalności warstw architektury referencyjnej Big Data

Funkcjonalności warstw architektury referencyjnej Big Data

Przeczytaj blog, aby w najprostszy sposób poznać różne warstwy w architekturze Big Data i ich funkcjonalności.

Rewolucyjne wynalazki Google, które ułatwią Twoje życie.

Rewolucyjne wynalazki Google, które ułatwią Twoje życie.

Chcesz zobaczyć rewolucyjne wynalazki Google i jak te wynalazki zmieniły życie każdego człowieka dzisiaj? Następnie czytaj na blogu, aby zobaczyć wynalazki Google.

13 komercyjnych narzędzi do ekstrakcji danych z Big Data

13 komercyjnych narzędzi do ekstrakcji danych z Big Data

13 komercyjnych narzędzi do ekstrakcji danych z Big Data

Pozostań w kontakcie dzięki aplikacji WhatsApp na komputer 24*7

Pozostań w kontakcie dzięki aplikacji WhatsApp na komputer 24*7

Whatsapp w końcu uruchomił aplikację Desktop dla użytkowników komputerów Mac i Windows. Teraz możesz łatwo uzyskać dostęp do Whatsapp z systemu Windows lub Mac. Dostępne dla Windows 8+ i Mac OS 10.9+

5 przykładów, które dowodzą, że energetyka jądrowa nie zawsze jest zła

5 przykładów, które dowodzą, że energetyka jądrowa nie zawsze jest zła

Energia jądrowa jest zawsze pogardzana, nigdy jej nie szanujemy z powodu przeszłych wydarzeń, ale nie zawsze jest zła. Przeczytaj post, aby dowiedzieć się więcej na ten temat.

Friday Essential: Co się stało z samochodami sterowanymi przez sztuczną inteligencję?

Friday Essential: Co się stało z samochodami sterowanymi przez sztuczną inteligencję?

Koncepcja autonomicznych samochodów, które wyjadą na drogi za pomocą sztucznej inteligencji, to marzenie, które mamy już od jakiegoś czasu. Ale pomimo kilku obietnic nigdzie ich nie widać. Przeczytaj ten blog, aby dowiedzieć się więcej…

Czy AI może walczyć z rosnącą liczbą ataków ransomware?

Czy AI może walczyć z rosnącą liczbą ataków ransomware?

Wzrasta liczba ataków ransomware, ale czy sztuczna inteligencja może pomóc w radzeniu sobie z najnowszym wirusem komputerowym? Czy AI jest odpowiedzią? Przeczytaj tutaj, wiedz, że sztuczna inteligencja jest zmorą lub zgubą

5 przydatnych narzędzi sztucznej inteligencji, które uproszczą Twoje życie

5 przydatnych narzędzi sztucznej inteligencji, które uproszczą Twoje życie

Sztuczna inteligencja nie jest dla ludzi nową nazwą. Ponieważ sztuczna inteligencja jest włączona do każdego strumienia, jednym z nich jest opracowywanie narzędzi zwiększających ludzką wydajność i dokładność. Skorzystaj z tych niesamowitych narzędzi uczenia maszynowego i uprość swoje codzienne zadania.

Wgląd w 26 technik analizy Big Data: część 2

Wgląd w 26 technik analizy Big Data: część 2

Zawsze potrzebujemy Big Data Analytics do efektywnego zarządzania danymi. W tym artykule omówiliśmy kilka technik analizy Big Data. Sprawdź ten artykuł.

Ataki DDOS: krótki przegląd

Ataki DDOS: krótki przegląd

Czy jesteś również ofiarą ataków DDOS i nie masz pewności co do metod zapobiegania? Przeczytaj ten artykuł, aby rozwiązać swoje pytania.