Uw eigen mailserver bouwen met FreeBSD 11

Het runnen van uw eigen e-mailserver kan behoorlijk lonend zijn. U bent de baas over uw gegevens. Het geeft u ook meer flexibiliteit met uw bezorgopties. Er zijn echter een paar uitdagingen. U loopt het risico uw server open te stellen voor kwetsbaarheden en uw server een potentieel relais te maken dat spammers kunnen gebruiken.

Nu dat uit de weg is, gaan we verder met het runnen van onze eigen mailserver.

Overzicht

Er zijn drie vereiste softwareonderdelen die niet in het FreeBSD-basissysteem zijn opgenomen:

  • OpenSMTPd
  • Duiventil
  • spamd

OpenSMTPd is een mail transfer agent (MTA) en mail delivery agent (MDA). Dit betekent dat het via het SMTPprotocol met andere mailservers kan communiceren en dat het ook de bezorging van mail naar de mailboxen van de individuele gebruikers afhandelt. We zullen OpenSMTPd instellen zodat het kan communiceren met externe servers (gefilterd door spamd) en e-mail kan bezorgen aan lokale gebruikers, en lokale mail kan bezorgen van gebruiker naar gebruiker.

Dovecot is een MDA die lokale mailboxen leest en deze via IMAP of POP3 aan de gebruikers aanbiedt. Het zal de mailboxen van de lokale gebruikers gebruiken om deze inhoud weer te geven.

Spamd is een e-mailfilterservice. We kunnen e-mail doorsturen via spam, en het filtert e-mail op basis van een verscheidenheid aan zwarte lijsten, witte lijsten en een grijze lijst.

Het algemene idee voor deze mailserver vereist een paar verschillende paden:

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)

Voor deze tutorial gebruiken we de FreeBSD-versie van OpenBSD's PF voor onze firewall. U kunt ook gebruiken ipfw, waar de configuratie erg op elkaar lijkt.

Opmerking: Vultr blokkeert standaard poort 25, die overal door SMTP-servers wordt gebruikt. Als u een volledig functionele e-mailserver wilt gebruiken, moet u die poort openen.

Initiële setup

Eerst moeten we de vereiste programma's installeren.

Ervan uitgaande dat u als gebruiker draait met sudo access set-up, kunnen we de volgende opdrachten uitvoeren. Ze zijn afhankelijk van het feit of u poorten of pakketten gebruikt.

Pakketten (aanbevolen)

Tenzij u specifieke functionaliteit nodig heeft die in deze hulpprogramma's is ingebouwd, wordt het aanbevolen om via pakketten te installeren. Het is eenvoudiger, kost minder servertijd en middelen en biedt een intuïtieve, gebruiksvriendelijke interface.

sudo pkg install opensmtpd dovecot spamd

De volgende makeopdrachten geven je veel compileeropties, de standaardinstellingen werken prima. Wijzig deze niet tenzij u precies weet wat u doet.

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

We zullen de volgende regels moeten toevoegen aan /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-installatie

Om PF te configureren, kunnen we onze maken /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

Dit is een werkende PF-configuratie. Het is relatief eenvoudig, maar er zijn ook een paar eigenaardigheden die moeten worden uitgelegd.

Ten eerste definiëren we onze $ext_ifvariabele voor ons vtnet0apparaat om later te gebruiken. We definiëren ook ongeldige IP-adressen die op de externe interface moeten worden verwijderd.

We definiëren ook twee tabellen, spamden spamd-white- deze twee tabellen worden gemaakt door spamd in de standaardconfiguratie. We definiëren ook een tabel met de naam webmaildie we zullen gebruiken om enkele grote webmailproviders door te laten.

Om een ​​tabel te bekijken, kunt u de opdracht gebruiken pfctl -t tablename -T showom de elementen in een tabel weer te geven.

We hebben een paar PF-regels ingesteld: sla de verwerking op de lokale interface over, schakel statistieken in op de externe interface en scrub binnenkomende pakketten.

Het volgende is een van de belangrijkste onderdelen, waarbij we erin slagen ons verkeer door te sturen naar spamd of OpenSMTPd.

Allereerst is er een omleidingsregel (let op de syntaxis hier, FreeBSD 11 gebruikt de oudere stijl PF syntaxis (pre-OpenBSD 4.6), dus de syntaxis lijkt misschien vreemd. Als we iets op smtp ontvangen van een host die in de spamdtabel staat of niet wordt vermeld in de spamd-whitetabel, we leiden de verbinding door naar de spamd-daemon, die deze verbindingen behandelt. De volgende drie regels zijn passthrough-regels zodat we daadwerkelijk e-mail kunnen ontvangen. We passeren berichten van de IP's in de spamd-whiteen de webmailtabellen rechtstreeks naar OpenSMTPd We accepteren ook berichten op de inzendingspoort ( 587).

Dan zijn er een paar huishoudregels om ons standaardbeleid in te stellen en SSH- en ICMP-berichten te accepteren.

Vervolgens geven we IMAP en POP3 door aan onze externe interface om toegang te krijgen tot Dovecot.

Ten slotte staan ​​we al het uitgaande verkeer toe. Als je extra beveiliging wilde toevoegen, zou je de poorten die je doorlaat kunnen beperken, maar voor een server voor eenmalig gebruik is het geen probleem om alles door te geven.

Start PF:

sudo service pf start

Nu we onze firewall hebben ingesteld, kunnen we verder gaan met onze mailserverconfiguratie.

OpenSMTPd

OpenSMTPd heeft een zeer eenvoudige en gemakkelijk te lezen configuratiesyntaxis. Een volledige werkconfiguratie past in 14 regels, zoals u hieronder kunt zien:

#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

Ten eerste definiëren we opnieuw onze externe interface, evenals een paar tabellen, aliassen en domeinen. Vervolgens gaan we verder met de SSL-sleutel en het certificaat voor alle domeinen waaronder we mail willen afhandelen.

In de volgende sectie definiëren we de interfaces en poorten waarnaar we willen luisteren. Ten eerste luisteren we op localhost voor ons mail.example.comdomein, voor eventuele lokale verbindingen. Vervolgens luisteren we naar onze door spam gefilterde berichten en verzonden berichten op de externe interface. Ten slotte luisteren we naar inzendingen, deze gebeuren op de poort 587en we vereisen dat ze om veiligheidsredenen worden geverifieerd.

Ten slotte zijn onze acceptinstellingen. We accepteren elk bericht voor een van onze domeinen dat in onze domainstabel is gedefinieerd voor aliassen in onze aliasestabel, om in hun thuismap in het maildirformaat af te leveren. Vervolgens accepteren we alle lokale verbindingen voor lokale mailboxen en geven we onze berichten door, zodat we e-mail kunnen verzenden. Ten slotte accepteren we onze verzonden berichten om door te sturen. Als we geen authenticatie nodig hadden voor onze aanmeldingspoort, zou dit een groot veiligheidsrisico vormen. Hierdoor kan iedereen onze server gebruiken als spamrelay.

Aliassen

FreeBSD wordt geleverd met een standaard aliasbestand /etc/mail/aliasesin het volgende formaat:

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

Dit definieert de verschillende mailboxen en waar we berichten naar deze gedefinieerde mailboxen willen doorsturen. We kunnen onze gebruikers definiëren als lokale systeemgebruikers of externe mailboxen om naar door te sturen. Het standaard FreeBSD-bestand is vrij beschrijvend, dus u kunt dat ter referentie raadplegen.

Domeinen

FreeBSD levert geen standaarddomeinsbestand, maar dit is ongelooflijk eenvoudig:

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

Dit is gewoon een gewoon tekstbestand met elk domein dat u wilt beluisteren op een nieuwe regel. Met het #symbool kun je een opmerking plaatsen . Dit bestand bestaat simpelweg zodat u minder configuratieregels kunt gebruiken.

SSL-certificaten

Er zijn twee manieren om uw communicatie met uw mailserver te beveiligen: zelfondertekende en ondertekende certificaten. Het is zeker mogelijk om uw certificaten zelf te ondertekenen, maar services zoals Let's Encrypt bieden gratis en ongelooflijk eenvoudig te gebruiken ondertekening.

Eerst moeten we het certbot-programma installeren.

sudo pkg install py-certbot

Als alternatief kan het worden geïnstalleerd met poorten:

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

Om vervolgens uw certificaat te krijgen, moet u ervoor zorgen dat u de poort 80op uw externe interface hebt geopend . Voeg de volgende regels ergens toe in uw filterregels in /usr/local/etc/pf.conf:

pass quick on $ext_if from any to any port http

Ren pfctl -f /usr/local/etc/pf.confdan om de regelset opnieuw te laden.

Vervolgens kunt u de opdracht uitvoeren voor alle domeinen waarvoor u een certificaat wilt krijgen:

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

Het wordt aanbevolen om een ​​crontab-vermelding in te stellen die certbot renewelke 6 maanden wordt uitgevoerd om ervoor te zorgen dat uw certificaten niet verlopen.

Vervolgens kunt u voor elk relevant domein de regels wijzigen om naar het juiste sleutelbestand te verwijzen:

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"

Bewerk de effecten:

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

Opmerking: u moet dit voor elk origineel sleutelbestand doen, anders zal OpenSMTPd ze niet openen.

Nu kunnen we de service starten:

sudo service smtpd start

Spamd configureren

Hier gebruiken we de spamd-daemon van OpenBSD om de hoeveelheid spam die we van internet ontvangen te verminderen. Dit filtert in wezen berichten van IP-adressen die bekend staan ​​als slecht uit verschillende spambronnen, evenals (standaard) "greylisting" van inkomende verbindingen. Spamd probeert ook de tijd van spammer te verspillen door verbindingen op de zwarte en grijze lijst te "stotteren", wat betekent dat het zijn reactie over enkele seconden verspreidt, waardoor de klant langer dan normaal open moet blijven.

Een verbinding op een grijze lijst plaatsen wordt gedaan wanneer een nieuw IP-adres verbinding maakt dat niet op een zwarte of witte lijst staat. Zodra het nieuwe adres is verbonden, laat spamd het bericht vallen met een onschadelijk foutbericht en voegt het vervolgens toe aan een tijdelijke lijst. Omdat spammers worden betaald voor afgeleverde berichten, zullen ze niet opnieuw proberen bij een fout, terwijl een legitieme service relatief snel opnieuw zal proberen.

U moet het volgende uitvoeren om te koppelen fdescfs:

mount -t fdescfs null /dev/fd

Dan moet je deze regel toevoegen aan /etc/fstab:

fdescfs     /dev/fd     fdescfs rw      0       0

Het standaard configuratiebestand (gevonden in /usr/local/etc/spamd/spamd.conf.sample) werkt prima. Je kunt het bewerken om nieuwe bronnen toe te voegen of de bronnen die je gebruikt wijzigen:

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

We kunnen de service starten met het volgende:

sudo service obspamd start

Op dit punt is spamd ingesteld.

Webmailservices inschakelen

Een probleem met de greylisting-benadering is dat grote e-maildiensten vaak e-mail verzenden via een van de vele verschillende spoelen, en u krijgt niet gegarandeerd dezelfde server die het bericht elke keer verzendt. Een oplossing hiervoor is om de IP-bereiken die door verschillende webmailservices worden gebruikt op de witte lijst te zetten. Dit is waar de webmailtabel voor wordt gebruikt in de PF-configuratie. Deze strategie kan averechts werken als u een IP-adres opneemt dat een spammer gebruikt, maar zolang u voorzichtig bent met de bereiken die u in de tabel plaatst, komt alles goed.

Om een ​​e-mailbereik aan de webmailtabel toe te voegen, kunt u de volgende opdracht uitvoeren:

pfctl -t webmail -T add 192.0.2.0/24

Duiventil

Als je wilt dat gebruikers toegang hebben tot hun e-mail zonder in te loggen via SSH, heb je een MDA nodig die IMAP en / of POP3 ondersteunt. Een erg populair programma is Dovecot, met een vrij eenvoudige configuratie en krachtige functies.

We kunnen de standaardconfiguratie kopiëren:

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

De configuratie bestaat uit nogal wat verschillende bestanden. Voer de onderstaande opdracht uit om de verschillen tussen uw configuratie en de standaardinstellingen van de duiventil te zien:

sudo doveconf -n

Het volgende is een eenvoudige, werkende configuratie:

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

De meeste configuratiebestanden staan ​​in conf.d

De belangrijkste zijn 10-auth.conf, 10-mail.confen 10-ssl.conf.

U kunt de verschillende mailboxen waarin u gebruikt configureren 15-mailboxes.conf. Wat u hierboven ziet, is voor veel systemen een goede configuratie, maar uw aantal kilometers kan variëren. Het wordt aanbevolen om hiermee te spelen met zoveel mogelijk verschillende klanten.

Authenticatie

De meeste standaardinstellingen zijn correct. Als u de systeemgebruikers wilt gebruiken om te verifiëren, moet u bewerken 10-auth.conf.

Maak een commentaar op de volgende regel:

! Inclusief auth-system.conf.ext

Versleuteling

We moeten Diffie-Hellman-parameters genereren:

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

Opmerking: dit duurt erg lang. Veel langer dan je zou verwachten.

We kunnen Dovecot nu starten:

sudo service dovecot start

Gevolgtrekking

Op dit moment hebben we een functionele, veilige en relatief spamvrije mailserver.

Hier zijn nog meer dingen waar u naar moet kijken: SpamAssassin gebruiken om heuristisch van spam af te komen en om meer spam-blacklists te vinden die zijn opgesteld door bronnen die u vertrouwt.


Tags: #BSD #Email

Leave a Comment

Kan AI vechten met toenemend aantal ransomware-aanvallen?

Kan AI vechten met toenemend aantal ransomware-aanvallen?

Ransomware-aanvallen nemen toe, maar kan AI helpen het nieuwste computervirus het hoofd te bieden? Is AI het antwoord? Lees hier weten is AI boezem of vloek

ReactOS: is dit de toekomst van Windows?

ReactOS: is dit de toekomst van Windows?

ReactOS, een open source en gratis besturingssysteem is hier met de nieuwste versie. Kan het voldoen aan de behoeften van moderne Windows-gebruikers en Microsoft uitschakelen? Laten we meer te weten komen over deze oude stijl, maar een nieuwere OS-ervaring.

Blijf verbonden via WhatsApp Desktop-app 24 * 7

Blijf verbonden via WhatsApp Desktop-app 24 * 7

WhatsApp heeft eindelijk de Desktop-app voor Mac- en Windows-gebruikers gelanceerd. Nu heb je eenvoudig toegang tot WhatsApp vanuit Windows of Mac. Beschikbaar voor Windows 8+ en Mac OS 10.9+

Hoe AI procesautomatisering naar een hoger niveau kan tillen?

Hoe AI procesautomatisering naar een hoger niveau kan tillen?

Lees dit om te weten hoe kunstmatige intelligentie populair wordt onder de kleinschalige bedrijven en hoe het de kansen vergroot om ze te laten groeien en hun concurrenten voorsprong te geven.

macOS Catalina 10.15.4 Supplement Update veroorzaakt meer problemen dan het oplost

macOS Catalina 10.15.4 Supplement Update veroorzaakt meer problemen dan het oplost

Onlangs heeft Apple macOS Catalina 10.15.4 uitgebracht, een aanvullende update om problemen op te lossen, maar het lijkt erop dat de update meer problemen veroorzaakt die ertoe leiden dat mac-machines worden gemetseld. Lees dit artikel voor meer informatie

13 Commerciële data-extractietools voor big data

13 Commerciële data-extractietools voor big data

13 Commerciële data-extractietools voor big data

Wat is een logboekbestandssysteem en hoe werkt het?

Wat is een logboekbestandssysteem en hoe werkt het?

Onze computer slaat alle gegevens op een georganiseerde manier op, het zogenaamde Journaling-bestandssysteem. Het is een efficiënte methode waarmee de computer bestanden kan zoeken en weergeven zodra u op zoeken drukt.https://wethegeek.com/?p=94116&preview=true

Technologische singulariteit: een verre toekomst van de menselijke beschaving?

Technologische singulariteit: een verre toekomst van de menselijke beschaving?

Naarmate de wetenschap zich snel ontwikkelt en veel van onze inspanningen overneemt, nemen ook de risico's toe om onszelf te onderwerpen aan een onverklaarbare singulariteit. Lees, wat singulariteit voor ons kan betekenen.

Een inzicht in 26 Big Data-analysetechnieken: deel 1

Een inzicht in 26 Big Data-analysetechnieken: deel 1

Een inzicht in 26 Big Data-analysetechnieken: deel 1

De impact van kunstmatige intelligentie in de gezondheidszorg 2021

De impact van kunstmatige intelligentie in de gezondheidszorg 2021

AI in de zorg heeft de afgelopen decennia grote sprongen gemaakt. De toekomst van AI in de gezondheidszorg groeit dus nog steeds met de dag.