Oversigt
											
										
																			
											
												Indledende opsætning
											
										
																			
											
												Firewall opsætning
											
										
																			
											
												ÅbnSMTPd
											
										
																			
											
												Konfigurerer spamd
											
										
																			
											
												Dueslag
											
										
																			
											
												Konklusion
											
										
																	
												
At køre din egen e-mail-server kan være ret givende. Du er ansvarlig for dine data. Det giver dig også mere fleksibilitet med dine leveringsmuligheder. Der er dog et par udfordringer. Du risikerer at åbne din server op for sårbarheder, såvel som at gøre din server til et potentielt relæ for spammere at bruge.
Med det af vejen, lad os komme videre til at køre vores egen mailserver.
Oversigt
Der er tre nødvendige stykker software til at installere, som ikke er inkluderet i FreeBSD-basesystemet: 
OpenSMTPd er en postoverførselsagent (MTA) og en postleveringsagent (MDA). Det betyder, at den kan kommunikere med andre mailservere over SMTPprotokollen, og den håndterer også levering af post til de enkelte brugeres postkasser. Vi opsætter OpenSMTPd, så den kan kommunikere til eksterne servere (filtreret gennem spamd) og levere mail til lokale brugere, samt levere lokal mail fra bruger til bruger.
Dovecot er en MDA, som læser lokale postkasser og serverer dem over IMAP eller POP3 til brugerne. Den vil bruge de lokale brugeres postkasser til at betjene dette indhold.
Spamd er en postfiltreringstjeneste. Vi kan videresende e-mails via spamd, og det vil filtrere e-mail baseret på en række sorte lister, hvidlister og en gråliste.
Den generelle idé til denne mailserver kræver et par forskellige stier:
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)
Til denne tutorial vil vi bruge FreeBSD-versionen af OpenBSD's PF til vores firewall. Du kan også bruge ipfw, hvor konfigurationen er meget ens.
Bemærk:  Vultr blokerer som standard port 25, som bruges af SMTP-servere overalt. Hvis du vil køre en fuldt funktionel e-mail-server, bliver du nødt til at få den port åbnet.
Indledende opsætning
Først skal vi installere de nødvendige programmer.
Forudsat at du kører som en bruger med sudo-adgang sat op, kan vi køre følgende kommandoer. De vil variere afhængigt af, om du bruger porte eller pakker.
Pakker (anbefales)
Medmindre du har brug for specifik funktionalitet indbygget i disse hjælpeprogrammer, anbefales det at installere via pakker. Det er nemmere, tager mindre servertid og ressourcer og giver en intuitiv, brugervenlig grænseflade.
sudo pkg install opensmtpd dovecot spamd
Følgende makekommandoer giver dig masser af kompileringsmuligheder, standardindstillingerne vil fungere fint. Ændr ikke disse, medmindre du ved præcis, hvad du laver.
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
Vi bliver nødt til at tilføje følgende linjer til /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 opsætning
For at konfigurere PF kan vi oprette vores /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
Dette er en fungerende PF-konfiguration. Det er relativt enkelt, men der er også et par særheder, der skal forklares.
For det første definerer vi vores $ext_ifvariabel, som vores vtnet0enhed skal bruge senere. Vi definerer også ugyldige IP-adresser, der skal slettes på den eksterne grænseflade.
Vi definerer også to tabeller, spamdog spamd-white- disse to tabeller er skabt af spamd i dens standardkonfiguration. Vi definerer også en tabel med navnet, webmailsom vi vil bruge til at tillade nogle større webmail-udbydere at komme igennem.
For at se en tabel kan du bruge kommandoen pfctl -t tablename -T showtil at liste elementerne i en tabel.
Vi sætter et par PF-regler: Spring over behandling på den lokale grænseflade, aktiver statistik på den eksterne grænseflade og skrub indgående pakker.
Dernæst er en af de mere vigtige dele, hvor vi klarer at sende vores trafik igennem til spamd eller OpenSMTPd.
Først op er en omdirigeringsregel (bemærk syntaksen her, FreeBSD 11 bruger den ældre stil PF-syntaks (præ-OpenBSD 4.6), så syntaksen kan virke underlig. Hvis vi modtager noget på smtp fra en vært, der er angivet i spamdtabellen eller ikke er angivet i den spamd-whitetabel, vi omdirigerer forbindelsen igennem til spamd dæmon, som beskæftiger sig med disse forbindelser. de næste tre regler er gennemgangskomponenter regler, så vi rent faktisk kan modtage post. vi passerer gennem meddelelser fra de IP'er, der er anført i den spamd-white, og de webmailtabeller lige igennem til OpenSMTPd. Vi accepterer også beskeder på indsendelsesporten ( 587).
Så er der et par husholdningsregler til at indstille vores standardpolitik og acceptere SSH- og ICMP-meddelelser.
Vi sender derefter IMAP og POP3 på vores eksterne grænseflade for at få adgang til Dovecot.
Endelig tillader vi al udgående trafik. Hvis du ville tilføje ekstra sikkerhed, kunne du begrænse de porte, du passerer, men for en engangsserver er det ikke et problem at videregive alt.
Start PF:
sudo service pf start
Nu hvor vi har vores firewall-opsætning, kan vi gå videre til vores mailserver-konfiguration.
ÅbnSMTPd
OpenSMTPd har en meget enkel og letlæselig konfigurationssyntaks. En hel arbejdskonfiguration kan passe ind i 14 linjer, som du kan se nedenfor:
#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
For det første definerer vi igen vores eksterne grænseflade, samt nogle få tabeller, aliaser og domæner. Så går vi videre til SSL-nøglen og certifikatet for de domæner, vi ønsker at håndtere post under.
In the next section, we define the interfaces and ports we want to listen on. Firstly, we listen on localhost for our mail.example.com domain, for any local connections. Then we listen for our spamd-filtered messages and submitted messages on the external interface. Lastly, we listen for submissions, these happen on port 587 and we are requiring them to authenticate, for security reasons.
Lastly are our accept settings. We accept any message for any of our domains defined in our domains table for aliases in our aliases table, to deliver to their home directory in the maildir format. Then we accept all local connections for local mailboxes and relay out our messages, so we can send email. Lastly, we accept our submitted messages to relay. If we didn't require authentication for our submissions port, this would be a big security hazard. This would let anyone use our server as a spam relay.
Aliases
FreeBSD ships with a default alias file /etc/mail/aliases in the following format:
vuser1:  user1
vuser2:  user1
vuser3:  user1
vuser4:  user2
This defines the different mail boxes, and where we want to forward messages sent to these defined mailboxes. We can either define our users as local system users or external mailboxes to forward to. The default FreeBSD file is quite descriptive so you can refer to that for reference.
Domains
FreeBSD does not supply a default domains file, but this is incredibly simple:
# Domains
example.com
mail.example.com
smtp.example.com
This is just a plain text file with each domain you want to listen to on a new line. You can make a comment using the # symbol. This file exists simply so that you can use fewer lines of configuration.
SSL Certificates
There are two ways to be able to secure your communications with your mail server, self-signed and signed certificates. It is certainly possible to self-sign your certificates, however services like Let's Encrypt provide free and incredibly easy to use signing.
First we have to install the certbot program.
sudo pkg install py-certbot
Alternatively, it can be installed with ports:
cd /usr/ports/security/py-certbot
make install
make clean
Then, to get your certificate, you need to make sure you have opened up port 80 on your external interface. Add the following lines somewhere in your filtering rules in /usr/local/etc/pf.conf: 
pass quick on $ext_if from any to any port http
Then run pfctl -f /usr/local/etc/pf.conf to reload the ruleset.
Then you can run the command for any domains you want to get a certificate for:
certbot certonly --standalone -d mail.example.com
It is recommended to set up a crontab entry to run certbot renew once every 6 months to ensure your certificates don't expire.
Then for every relevant domain, you can modify the lines to point to the correct key file:
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"
Edit the securities:
sudo chmod 700 /usr/local/etc/letsencrypt/archive/mail.example.com/*
Note: You will have to do this for each original keyfile or else OpenSMTPd won't open them.
Now we can start the service:
sudo service smtpd start
Configuring spamd
Here we are using OpenBSD's spamd daemon to reduce the amount of spam we get from the internet. Essentially, this filters out messages from IPs that are known as bad from various spam sources, as well as (by default) "greylisting" incoming connections. Spamd also tries to waste spammer's timme by "stuttering" blacklisted and greylisted connections, which means it spreads out it's response over several seconds which forces the client to stay open for longer than usual.
Gråliste af en forbindelse udføres, når en ny IP-adresse forbindes, som ikke er på nogen sortliste eller hvidliste. Når den nye adresse forbindes, dropper spamd meddelelsen med en uskadelig fejlmeddelelse, hvorefter den tilføjer den til en midlertidig liste. Fordi spammere bliver betalt for leveret meddelelser, vil de ikke prøve igen på en fejl, hvorimod en lovlig tjeneste vil prøve igen relativt hurtigt.
Du skal køre følgende for at montere fdescfs:
mount -t fdescfs null /dev/fd
Så bliver du nødt til at tilføje denne linje til /etc/fstab:
fdescfs     /dev/fd     fdescfs rw      0       0
Standardkonfigurationsfilen (findes i /usr/local/etc/spamd/spamd.conf.sample) vil fungere fint. Du kan redigere den for at tilføje nye kilder eller ændre de kilder, du bruger:
sudo cp /usr/local/etc/spamd/spamd.conf.sample /usr/local/etc/spamd/spamd.conf
Vi kan starte tjenesten med følgende:
sudo service obspamd start
På dette tidspunkt er spamd sat op.
Aktivering af webmail-tjenester
Et problem med grålistetilgangen er, at store mailtjenester ofte sender mail ud gennem en af mange forskellige spools, og du er ikke garanteret at få den samme server til at sende beskeden hver gang. En løsning på dette er at hvidliste de IP-områder, der bruges af forskellige webmail-tjenester. Dette er hvad webmail-tabellen bruges til i PF-konfigurationen. Denne strategi kan give bagslag, hvis du inkluderer en IP-adresse, som en spammer bruger, men så længe du er omhyggelig med, hvilke områder du angiver i tabellen, vil du være i orden.
For at tilføje et e-mail-område til webmail-tabellen kan du køre følgende kommando:
pfctl -t webmail -T add 192.0.2.0/24
Dueslag
Hvis du vil have brugere til at få adgang til deres mail uden at logge på via SSH, skal du bruge en MDA, der understøtter IMAP og/eller POP3. Et meget populært program er Dovecot, med en ret simpel konfiguration og kraftfulde funktioner.
Vi kan kopiere over standardkonfigurationen:
cd /usr/local/etc/dovecot
cp -R example-config/* ./
Konfigurationen består af en hel del forskellige filer. For at se forskellene mellem din konfiguration og dueslag-standarderne skal du køre kommandoen nedenfor:
sudo doveconf -n
Følgende er en enkel, fungerende konfiguration:
# 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 fleste konfigurationsfiler vil være i conf.d
De vigtige er 10-auth.conf, 10-mail.conf, og 10-ssl.conf.
Du kan konfigurere de forskellige postkasser, du bruger i 15-mailboxes.conf. Det, du ser ovenfor, er en god konfiguration for mange systemer, men dit kilometertal kan variere. Det anbefales, at du leger med dette med så mange forskellige klienter, som du kan.
Godkendelse
De fleste standardindstillinger vil være korrekte. Hvis du vil bruge systembrugerne til at godkende, bliver du nødt til at redigere 10-auth.conf.
Fjern kommentaren til følgende linje:
!inkluder auth-system.conf.ext
Kryptering
Vi skal generere Diffie-Hellman-parametre:
sudo nohup openssl dhparam -out /usr/local/etc/dovecot/dh.pem
Bemærk:  Det vil tage lang tid at køre. Meget længere end du kunne forvente.
Vi kan nu starte Dovecot:
sudo service dovecot start
Konklusion
På dette tidspunkt har vi en funktionel, sikker og relativt spamfri mailserver.
Nogle flere ting at se på herfra er at bruge SpamAssassin til heuristisk at slippe af med spam, samt at finde flere spamd-sortlister, der er udgivet af kilder, du har tillid til.