Visió general
Configuració inicial
Configuració del tallafoc
OpenSMTPd
Configuració de correu brossa
Colomer
Conclusió
Fer funcionar el vostre propi servidor de correu electrònic pot ser bastant gratificant. Ets el responsable de les teves dades. També us permet més flexibilitat amb les vostres opcions de lliurament. Tanmateix, hi ha alguns reptes. Correu el risc d'obrir el vostre servidor a vulnerabilitats, a més de convertir el vostre servidor en un potencial relé per als spammers.
Amb això fora del camí, anem a executar el nostre propi servidor de correu.
Visió general
Hi ha tres programes necessaris per instal·lar que no s'inclouen al sistema base de FreeBSD:
- OpenSMTPd
- Colomer
- correu brossa
OpenSMTPd és un agent de transferència de correu (MTA) i un agent de lliurament de correu (MDA). Això vol dir que es pot comunicar amb altres servidors de correu mitjançant el SMTPprotocol i també s'encarrega de l'entrega de correu a les bústies de correu dels usuaris individuals. Configurarem OpenSMTPd perquè pugui comunicar-se amb servidors externs (filtrat a través de correu brossa) i lliurar correu als usuaris locals, a més de lliurar correu local d'usuari a usuari.
Dovecot és un MDA que llegeix bústies de correu locals i les serveix per IMAP o POP3 als usuaris. Utilitzarà les bústies de correu dels usuaris locals per oferir aquest contingut.
Spamd és un servei de filtratge de correu. Podem reenviar el correu mitjançant correu brossa, i filtrarà el correu en funció d'una varietat de llistes negres, llistes blanques i una llista grisa.
La idea general d'aquest servidor de correu requereix uns quants camins diferents:
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)
Per a aquest tutorial, farem servir la versió FreeBSD del PF d'OpenBSD per al nostre tallafoc. També podeu utilitzar ipfw, on la configuració és molt semblant.
Nota: Vultr, per defecte, bloqueja el port 25, que és utilitzat pels servidors SMTP a tot arreu. Si voleu executar un servidor de correu electrònic totalment funcional, haureu d'obrir aquest port.
Configuració inicial
En primer lloc, hem d'instal·lar els programes necessaris.
Suposant que esteu executant com a usuari amb l'accés sudo configurat, podem executar les ordres següents. Variaran en funció de si utilitzeu ports o paquets.
Paquets (recomanat)
A menys que necessiteu una funcionalitat específica integrada en aquestes utilitats, es recomana instal·lar-les mitjançant paquets. És més fàcil, requereix menys temps i recursos del servidor i ofereix una interfície intuïtiva i fàcil d'utilitzar.
sudo pkg install opensmtpd dovecot spamd
Les makeordres següents us donaran moltes opcions de compilació, els valors predeterminats funcionaran bé. No els canvieu tret que sàpigues exactament què estàs fent.
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
Haurem d'afegir les següents línies a /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"
Configuració del tallafoc
Per configurar PF, podem crear el nostre /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
Aquesta és una configuració de PF que funciona. És relativament senzill, però també hi ha algunes peculiaritats que cal explicar.
En primer lloc, definim la nostra $ext_ifvariable perquè el nostre vtnet0dispositiu l'utilitzi més endavant. També definim adreces IP no vàlides que s'han de deixar anar a la interfície externa.
També definim dues taules, spamdi spamd-white- aquestes dues taules es creen amb spamd en la seva configuració predeterminada. A més, definim una taula anomenada webmailque utilitzarem per permetre el pas a alguns proveïdors de correu web importants.
Per veure una taula, podeu utilitzar l'ordre pfctl -t tablename -T showper llistar els elements d'una taula.
Establem algunes regles de PF: saltar el processament a la interfície local, habilitar les estadístiques a la interfície externa i netejar els paquets entrants.
La següent és una de les parts més importants, on gestionem enviar el nostre trànsit a correu brossa o OpenSMTPd.
En primer lloc, hi ha una regla de redirecció (tingueu en compte la sintaxi aquí, FreeBSD 11 utilitza la sintaxi PF d'estil anterior (pre-OpenBSD 4.6), de manera que la sintaxi pot semblar estranya. Si rebem alguna cosa a smtp d'un amfitrió que apareix a la spamdtaula o no apareix a la taula. la spamd-whitetaula, redirigem la connexió al dimoni de correu brossa, que s'ocupa d'aquestes connexions. Les tres regles següents són regles de pas de manera que realment puguem rebre correu. Passem els missatges de les IP enumerades a spamd-whitela webmailtaula i directament a les taules. OpenSMTPd. A més, acceptem missatges al port d'enviament ( 587).
A continuació, hi ha unes quantes regles de neteja per establir la nostra política predeterminada i acceptar missatges SSH i ICMP.
Després passem IMAP i POP3 a la nostra interfície externa per accedir a Dovecot.
Finalment permetem tot el trànsit sortint. Si voleu afegir seguretat addicional, podríeu limitar els ports que passeu, però per a un servidor d'un sol ús no és cap problema passar-ho tot.
Inici PF:
sudo service pf start
Ara que tenim el nostre tallafoc configurat, podem passar a la configuració del nostre servidor de correu.
OpenSMTPd
OpenSMTPd té una sintaxi de configuració molt senzilla i fàcil de llegir. Una configuració de treball sencera pot cabre en 14 línies, com podeu veure a continuació:
#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
En primer lloc, tornem a definir la nostra interfície externa, així com algunes taules, àlies i dominis. A continuació, passem a la clau SSL i al certificat per a qualsevol domini amb què vulguem gestionar el correu.
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.
Greylisting a connection is done when any new IP address connects that isn't on any blacklist or whitelist. Once the new address connects, spamd drops the message with an inocuous error message, then it adds it to a temporary list. Because spammers get paid for delivered messages, they will not retry on an error, whereas a legitimate service will retry relatively soon.
You will have to run the following to mount fdescfs:
mount -t fdescfs null /dev/fd
Then you will have to add this line to /etc/fstab:
fdescfs /dev/fd fdescfs rw 0 0
The default config file (found in /usr/local/etc/spamd/spamd.conf.sample) will work fine. You can edit it to add new sources or change the sources you use:
sudo cp /usr/local/etc/spamd/spamd.conf.sample /usr/local/etc/spamd/spamd.conf
We can start the service with the following:
sudo service obspamd start
At this point spamd is set up.
Enabling Webmail Services
Un problema amb l'enfocament de llistes grises és que els serveis de correu grans sovint enviaran correu a través d'un dels molts spools diferents, i no es garanteix que el mateix servidor envia el missatge cada vegada. Una solució a això és afegir a la llista blanca els intervals d'IP utilitzats per diversos serveis de correu web. Per a això s'utilitza la taula de correu web a la configuració de PF. Aquesta estratègia pot ser contraproduent si incloeu una adreça IP que fa servir un spammer, però sempre que tingueu cura amb els intervals que poseu a la taula, estarà bé.
Per afegir un interval de correu electrònic a la taula de correu web, podeu executar l'ordre següent:
pfctl -t webmail -T add 192.0.2.0/24
Colomer
Si voleu que els usuaris accedeixin al seu correu sense iniciar sessió mitjançant SSH, necessitareu un MDA que admeti IMAP i/o POP3. Un programa molt popular és Dovecot, amb una configuració força senzilla i potents funcions.
Podem copiar la configuració per defecte:
cd /usr/local/etc/dovecot
cp -R example-config/* ./
La configuració està formada per molts fitxers diferents. Per veure les diferències entre la vostra configuració i els valors predeterminats del colom, executeu l'ordre següent:
sudo doveconf -n
La següent és una configuració senzilla i de treball:
# 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
}
La majoria dels fitxers de configuració hi estaran conf.d
Els importants són 10-auth.conf, 10-mail.conf, i 10-ssl.conf.
Podeu configurar les diferents bústies de correu que utilitzeu a 15-mailboxes.conf. El que veieu més amunt és una bona configuració per a molts sistemes, però el vostre quilometratge pot variar. Es recomana que jugueu amb això amb tants clients diferents com pugueu.
Autenticació
La majoria de la configuració predeterminada serà correcta. Si voleu utilitzar els usuaris del sistema per autenticar-vos, haureu d'editar 10-auth.conf.
Descomenteu la línia següent:
!inclou auth-system.conf.ext
Encriptació
Hem de generar paràmetres Diffie-Hellman:
sudo nohup openssl dhparam -out /usr/local/etc/dovecot/dh.pem
Nota: això trigarà molt de temps a executar-se. Molt més llarg del que podríeu esperar.
Ara podem començar Dovecot:
sudo service dovecot start
Conclusió
En aquest punt, tenim un servidor de correu funcional, segur i relativament lliure de correu brossa.
Algunes coses més a mirar des d'aquí són utilitzar SpamAssassin per desfer-se heurísticament del correu brossa, així com trobar més llistes negres de correu brossa publicades per fonts de confiança.