This tutorial will be showing you how to set up a backup email server with Postfix on Ubuntu. A backup email server is often called a backup MX. MX stands for Mail Exchanger. Previously I wrote an article explaining how iRedMail can help you quickly run your own email server. Sometimes your email server can be offline, especially if you run email server at home instead of in a data center. You can set up a backup email server to receive and queue emails when your primary email server is down. The backup MX will relay queued emails to the primary when it’s back online.
Prerequisites
Since you’re going to set up a backup email server, you need a server with high uptime, so preferrably you should rent a virtual private server (VPS) in a data center. Make sure the server can send email on port 25. I set up my backup email server on a $4.49/month Hostwinds VPS instance. Once you have a VPS, install Ubuntu on it and follow the instructions below.
It’s assumed that your backup MX host isn’t a primary email server for any domains. It’s a good practice to separate the role of primary and secondary email servers on different hosts.
Creating DNS MX Record
The MX record specifies which host or hosts handle emails for a particular domain name. For example, the host that handles emails for linuxbabe.com
is email.linuxbabe.com
, which is the primary email server. You can query MX record with the dig
utility.
dig MX short linuxbabe.com
If someone with a Gmail account sends an email to [email protected]
, then Gmail server will query the MX record of linuxbabe.com. When it finds out that email.linuxbabe.com
is responsible for accepting email, it then query the A record of email.linuxbabe.com
to get the IP address, thus the email can be delivered.
To set up a backup email server, you need to create another MX record in your DNS manager. Enter @
in the Name field to represent the main domain name, then enter the hostname for the backup email server in the Value field. I named my backup email server mx2.linuxbabe.com
.
Now I have two MX records for my domain name. Notice that there are two numbers at the beginning. They are called preference value or priority value. A small number has higher priority than a big number.
A sending SMTP server will pick the email server with highest priority to deliver email. If that email server is unavailable, then the email server with second highest priority will be tried. You can set the preference vaule in your DNS manager. It can be any number between 0 and 65,356. Make sure the number for backup email server is bigger than that for primary email server. And don’t forget to create an A record for your backup MX.
Note: The hostname for MX record can not be an alias to another name. Also, It’s highly recommended that you use hostnames, rather than bare IP addresses for MX record.
Setting up Backup Email Server with Postfix on Ubuntu
We just need to install and configure Postfix SMTP server on the backup MX host. No other software is needed. Run the following commands to install Postfix on Ubuntu.
sudo apt update sudo apt install postfix
When you see the following message, press the Tab key and press Enter.
Then choose the second option: Internet Site
.
Next, enter the backup MX hostname for the system mail name. For example, I entered mx2.linuxbabe.com
. Note that you cannot enter your main domain name here. That is to say, I must not enter linuxbabe.com
for the system mail name.
After Postfix is installed, open the configuration file.
sudo nano /etc/postfix/main.cf
By default, /etc/postfix/main.cf
file contains the following line.
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
Explanation:
Permit_mynetworks
tells Postfix to relay emails from SMTP clients on its own network.Permit_sasl_authenticated
tells Postfix to relay emails from authenticated SMTP clients.Defer_unauth_destination
makes Postfix reject request from other SMTP clients if the recipient’s domain name is in neither$relay_domains
nor$my_destination
.
We need to add the relay_domains
parameter, specifying the domain names, so that emails can be relayed to the primary email server when it’s back online.
relay_domains = linuxbabe.com
You can also specify multiple domain names if you want to make it as a backup MX host for multiple domain names.
relay_domains = linuxbabe.com, 2nd-domain.com
It’s recommended that you change the default value of myhostname to mx2.your-domain.com
.
myhostname = mx2.linuxbabe.com
Make sure that the value of mydestination
doesn’t include your main domain name, or your backup MX host will deliver emails to local system instead of relaying to the primary email server. The following values are fine.
mydestination = $myhostname, mx2.linuxbabe.com , localhost, localhost.localdomain, localhost
Postfix continues trying to deliver queued messages for the amount of time specified in the maximal_queue_lifetime
parameter, which determines how long deferred messages stay in the queue before they are bounced back to the sender. The default value is 5 days, as can be seen with the command below.
postconf -d | grep maximal_queue_lifetime
output:
maximal_queue_lifetime = 5d
The SMTP protocol (RFC 2821) recommends that sending SMTP server should retry failed email delivery at least 4-5 days. So if you run a backup MX host, you probably want to extend the queue lifetime like 10 days. Add the following line at the end of main.cf
file.
maximal_queue_lifetime = 10d
Save and close the file. Then restart Postfix for the changes to take effect.
sudo systemctl restart postfix
Make sure that your firewall allows inbound connection to TCP port 25.
Relay Recipients
By default, Postfix on the backup MX host will accept any address that belongs to $relay_domains
. If the primary email server tells the backup MX host that the recipient’s email address doesn’t exist, then the backup MX host must bounce the message to the original sender.
Spammers often send messages to made-up addresses, so your backup MX host will unnecessarily accept a lot of email that must be bounced. If the spammer use other people’s real address as the sender address, then the innocent person will get bounce emails from your server. Sometimes they think that you are a spammer.
It’s highly recommended that you maintain a list of valid recipient addresses on the backup MX host. In /etc/postfix/main.cf
file, add the following line.
relay_recipient_maps = hash:/etc/postfix/relay_recipients
Then you can specify valid recipient addresses in /etc/postfix/relay_recipients
file like below.
[email protected] OK [email protected] OK [email protected] OK
Obviously, manually adding recipient address is only viable for small email servers. For large email servers, this is time-consuming. Instead, you can perform real-time lookups using MySQL or LDAP, which will be discussed in a later tutorial.
Once you set relay_recipient_maps
parameter, you must include email addresses for all domains that you provide backup service to. If you don’t know all valid email addresses for a domain, you can use a wildcard entry like below.
[email protected] OK [email protected] OK [email protected] OK @2nd-domain.com OK
The last entry is a wildcard entry that allows any email address of the second domain.
Anti-Spam Filters
Spammers often target backup MX host to send email spam. So it’s important that you deploy anti-spam filters on both your primary and backup MX host. You can use my 6 tips to block email spam with Postfix. It’s worth mentioning that you need to make sure you backup MX host can get through the spam filters on the primary email server.
Enabling TLS Encryption
By default, Postfix does not encrypt connections from or to other email servers. It’s important that we enable TLS encryption so that emails won’t be snooped by a middle man listening on the network traffic. We can easily obtain a free TLS certificate from Let’s Encrypt. Issue the following commands to install Let’s Encrypt client (certbot) on Ubuntu server from official PPA.
sudo apt install software-properties-common sudo add-apt-repository ppa:certbot/certbot sudo apt update sudo apt install certbot
Now you can obtain a TLS certificate with one of three plugins (standalone, Apache, Nginx), depending on your server.
Obtaining TLS Certificate with the Standalone Plugin
If there’s no web server running on your backup MX host, then you can use the standalone plugin to obtain TLS certificate from Let’s Encrypt by executing the following command.
sudo certbot certonly --standalone --preferred-challenges http --agree-tos --email your-email-address -d mx2.your-domain.com
Explanation:
certonly
: Obtain a certificate but don’t install it.--standalone
: Use the standalone plugin to obtain a certificate--preferred-challenges http
: Perform http-01 challenge to validate our domain, which will use port 80. By default the standalone plugin will perform tls-sni challenge, which uses port 443.--agree-tos
: Agree to Let’s Encrypt terms of service.--email
: Email address is used for account registration and recovery.-d
: Specify your domain name.
As you can see the from the following screenshot, I successfully obtained the certificate.
Obtaining TLS Certificate with the Apache Plugin
If Apache web server is running on your backup MX host, you can use the Apache plugin to obtain TLS certificate. Run the following command to install the Apache plugin.
sudo apt install python3-certbot-apache
You need to have an Apache virtual host for mx2.your-domain.com
before obtaining Let’s Encrypt TLS certificate. Create the virtual host file:
sudo nano /etc/apache2/sites-available/mx2.your-domain.com.conf
Then paste the following text into the file.
ServerName mx2.your-domain.com DocumentRoot /var/www/mx2.your-domain.com
Save and close the file. Then create the web root directory.
sudo mkdir /var/www/mx2.your-domain.com
Set www-data
(Apache user) as the owner of the web root.
sudo chown www-data:www-data /var/www/mx2.your-domain.com -R
Enable this virtual host.
sudo a2ensite mx2.your-domain.com.conf
Reload Apache for the changes to take effect.
sudo systemctl reload apache2
Once virtual host is created and enabled, run the following command to obtain Let’s Encrypt TLS certificate.
sudo certbot --apache --agree-tos --redirect --hsts --email your-email-address -d mx2.your-domain.com
You should see the following message which means the certificate is successfully obtained.
Obtaining TLS Certificate with the Nginx Plugin
If Nginx web server is running on your backup MX host, you can use the Nginx plugin to obtain TLS certificate. Run the following command to install the Nginx plugin.
sudo apt install python3-certbot-nginx
You need to have a Nginx virtual host for mx2.your-domain.com
before obtaining Let’s Encrypt TLS certificate. Create the virtual host file:
sudo nano /etc/nginx/conf.d/mx2.your-domain.com.conf
Next, paste the following text into the file.
server { listen 80; server_name mx2.your-domain.com; root /var/www/mx2.your-domain.com/; location ~ /.well-known/acme-challenge { allow all; } }
Save and close the file. Then create the web root directory.
sudo mkdir /var/www/mx2.your-domain.com/
Set www-data
(Nginx user) as the owner of the web root.
sudo chown www-data:www-data /var/www/mx2.your-domain.com -R
Reload Nginx for the changes to take effect.
sudo systemctl reload nginx
Once virtual host is created and enabled, run the following command to obtain and install Let’s Encrypt certificate with Nginx plugin.
sudo certbot --nginx --agree-tos --redirect --hsts --email your-email-address -d mx2.your-domain.com
You should see the following which means the certificate is successfully obtained. You can also see the directory under which your cert is stored.
Installing TLS Certificate in Postfix
Now we have obtained a valid TLS certificate, let’s install it in Postfix.
sudo nano /etc/postfix/main.cf
Find the TLS parameters
section and the following two lines.
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
Replace them with:
smtpd_tls_cert_file=/etc/letsencrypt/live/mx2.your-domain.com/fullchain.pem smtpd_tls_key_file=/etc/letsencrypt/live/mx2.your-domain.com/privkey.pem
Then add the following 3 lines, which enables TLS in Postfix SMTP server.
smtpd_tls_security_level=may smtpd_tls_protocols = !SSLv2, !SSLv3 !TLSv1 smtpd_tls_loglevel = 1
Save and close the file. Restart Postfix for the changes to take effect.
sudo systemctl restart postfix
Now Postfix SMTP server can use STARTTLS to establish encrypted connection with SMTP clients on port 25. Note that end user email client won’t communicate with a backup MX host, so there’s no need to enable submission service on port 587 or 465.
Enforce TLS Connection Between the Primary and the Backup
Since your primary email server is also configured with a valid Let’s Encrypt TLS certificate, we can enforce the backup MX host to use TLS when delivering emails to the primary email server. In /etc/postfix/main.cf
file, add the following parameters, which will make Postfix SMTP client to always use TLS and also verify the remote server certificate using trusted root CA certificates in /etc/ssl/certs
directory.
smtp_tls_security_level = verify smtp_tls_verify_cert_match = hostname, nexthop, dot-nexthop smtp_tls_CApath = /etc/ssl/certs smtp_tls_loglevel = 1
Save and close the main.cf
file. Then use the following command to create hash symbolic links.
Ubuntu 18.04: sudo openssl rehash /etc/ssl/certs Ubuntu 16.04: sudo c_rehash /etc/ssl/certs
Restart Postfix for the changes to take effect.
sudo systemctl restart postfix
Now you can send an email from your backup MX host to your email address with the following command.
echo "hello" | sendmail [email protected]
After the message is sent, you can find the following text in /var/log/mail.log
file.
Verified TLS connection established
If your backup MX host tries to establish TLS connection but can not verify the primary email server’s certificate, then the following message can be found.
Untrusted TLS connection established
How to Identify Relayed Email
You can recognize relayed email by looking at the email headers in your email client. For example, I shut down my primary email server, then use my Gmail account to send an email to my domain email account. After a few minutes, I boot my primary email server up again. When chekcing the email headers, the client IP and HELO hostname belongs to my backup MX host, so I know it’s relayed via my backup MX host.
Received-SPF: Softfail (mailfrom) identity=mailfrom; client-ip=13.115.185.252; helo=mx2.linuxbabe.com; [email protected]; receiver=
Notice that the SPF check result is Softfail
, which means Gmail didn’t designate my backup MX host as being allowed to send emails on behalf of gmail.com, but if my backup MX host sends an email on behalf of gmail.com, the recipient’s SMTP server can accept it and mark it as Softfail.
I hope this tutorial helped you set up a backup email server with Postfix on Ubuntu. As always, if you found this post useful, then subscribe to our free newsletter to get more tips and tricks. Take care.
Rate this tutorial
[Total: 2 Average: 5]