使用FreeBSD 11构建自己的邮件服务器

运行自己的电子邮件服务器可能会很有意义。您负责数据。它还使您可以更加灵活地选择交付方式。但是,存在一些挑战。您冒着使服务器容易受到漏洞攻击的风险,并使服务器成为垃圾邮件发送者使用的潜在中继。

顺便说一句,让我们继续运行自己的邮件服务器。

总览

FreeBSD基本系统未包含三项需要安装的软件:

  • 打开SMTPd
  • 鸽舍
  • 垃圾邮件

OpenSMTPd是邮件传输代理(MTA)和邮件传递代理(MDA)。这意味着它可以通过SMTP协议与其他邮件服务器进行通信,并且还可以处理将邮件传递到各个用户的邮箱的操作。我们将设置OpenSMTPd,以便它可以与外部服务器通信(通过spamd过滤)并将邮件传递给本地用户,以及将本地邮件从一个用户传递到另一个用户。

Dovecot是MDA,它读取本地邮箱并将其通过IMAP或POP3提供给用户。它将使用本地用户的邮箱来提供此内容。

Spamd是一种邮件过滤服务。我们可以通过spamd转发邮件,它将根据各种黑名单,白名单和灰名单过滤邮件。

此邮件服务器的总体思路需要一些不同的路径:

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)

在本教程中,我们将使用OpenBSD PF的FreeBSD版本作为防火墙。您也可以使用ipfw,其中的配置非常相似。

注意: 默认情况下,Vultr会阻止端口25,该端口在所有SMTP服务器中都使用。如果要运行功能齐全的电子邮件服务器,则必须打开该端口。

最初设定

首先,我们需要安装所需的程序。

假设您以设置了sudo访问权限的用户身份运行,我们可以运行以下命令。它们将根据您使用的端口还是程序包而有所不同。

套餐(推荐)

除非您需要这些实用程序中内置的特定功能,否则建议通过软件包安装。它更容易,花费更少的服务器时间和资源,并提供直观,用户友好的界面。

sudo pkg install opensmtpd dovecot spamd

以下make命令将为您提供许多编译选项,默认设置可以正常工作。除非您确切知道自己在做什么,否则请不要更改它们。

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

我们将需要在以下行中添加/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"

防火墙设定

要配置PF,我们可以创建以下代码/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

这是一个有效的PF配置。它相对简单,但是也有一些怪癖需要解释。

首先,我们$ext_ifvtnet0设备定义变量以供以后使用。我们还定义了无效的IP地址,应该将其丢弃在外部接口上。

我们还定义了两个表,spamd并且spamd-white-这两个表是由spamd在其默认配置中创建的。同样,我们定义了一个表,该表webmail将用于允许一些主要的Webmail提供程序通过。

要查看表,可以使用命令pfctl -t tablename -T show列出表中的元素。

我们设置了一些PF规则:跳过本地接口上的处理,启用外部接口上的统计信息并清除传入的数据包。

接下来是更重要的部分之一,我们在其中管理将流量发送到spamd或OpenSMTPd。

首先是一个重定向规则(注意语法在这里,FreeBSD的老式的PF语法11使用(预OpenBSD的4.6),所以,语法看上去有些奇怪。如果我们从列出的主机收到SMTP任何spamd表或不上市在spamd-white表中,我们将连接重定向到处理这些连接的spamd守护程序。接下来的三个规则是传递规则,以便我们实际上可以接收邮件。我们将从spamd-whitewebmail表中列出的IP传递消息到另外,我们在提交端口(587)上接受消息。

然后,有一些内部管理规则可以设置我们的默认策略,并接受SSH和ICMP消息。

然后,我们在外部接口上传递IMAP和POP3,以访问Dovecot。

最后,我们允许所有传出流量。如果要增加额外的安全性,则可以限制通过的端口,但是对于一次性服务器而言,通过所有端口并不是问题。

启动PF:

sudo service pf start

现在我们有了防火墙设置,我们可以继续进行邮件服务器配置了。

打开SMTPd

OpenSMTPd具有非常简单且易于阅读的配置语法。整个工作配置可以分为14行,如下所示:

#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

首先,我们再次定义我们的外部接口,以及一些表,别名和域。然后,我们转到要在其下处理邮件的任何域的SSL密钥和证书。

在下一部分中,我们定义要监听的接口和端口。首先,我们在localhost上侦听我们的mail.example.com域以及任何本地连接。然后,我们在外部接口上监听经过spamd过滤的消息和提交的消息。最后,我们会监听提交的内容,这些内容会在端口上发生587,出于安全原因,我们要求它们进行身份验证。

最后是我们的accept设置。我们接受domains表中为表中别名所定义的任何域的任何消息aliases,以该maildir格式将其传递到其主目录。然后,我们接受本地邮箱的所有本地连接并转发我们的消息,以便我们发送电子邮件。最后,我们接受我们提交的邮件进行中继。如果我们不需要对提交端口进行身份验证,这将是一个很大的安全隐患。这样一来,任何人都可以将我们的服务器用作垃圾邮件中继。

别名

FreeBSD附带/etc/mail/aliases了以下格式的默认别名文件:

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

这定义了不同的邮箱,以及我们要将邮件转发到这些已定义邮箱的位置。我们可以将用户定义为本地系统用户或要转发到的外部邮箱。默认的FreeBSD文件具有很强的描述性,因此您可以参考该文件。

FreeBSD没有提供默认的域文件,但是这非常简单:

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

这只是一个纯文本文件,每个域都需要在新行中收听。您可以使用#符号发表评论。该文件仅存在,因此您可以使用更少的配置行。

SSL证书

有两种方法可以保护与邮件服务器的通信安全,即自签名证书和签名证书。当然,可以对您的证书进行自我签名,但是“让我们加密”之类的服务提供了免费且易于使用的签名。

首先,我们必须安装certbot程序。

sudo pkg install py-certbot

另外,它可以安装以下端口:

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

然后,要获取证书,您需要确保已打开80外部接口上的端口。将以下行添加到以下过滤规则中/usr/local/etc/pf.conf

pass quick on $ext_if from any to any port http

然后运行pfctl -f /usr/local/etc/pf.conf以重新加载规则集。

然后,您可以对要为其获取证书的任何域运行命令:

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

建议将crontab条目设置为certbot renew每6个月运行一次,以确保证书不会过期。

然后,对于每个相关域,您可以修改这些行以指向正确的密钥文件:

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"

编辑证券:

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

注意: 您必须对每个原始密钥文件执行此操作,否则OpenSMTPd将不会打开它们。

现在我们可以启动服务了:

sudo service smtpd start

配置垃圾邮件

在这里,我们使用OpenBSD的spamd守护程序来减少从互联网上获得的垃圾邮件数量。从本质上讲,这会过滤掉来自各种垃圾邮件源的IP邮件,这些邮件被称为“坏邮件”,以及(默认情况下)“灰名单”传入的连接。Spamd还试图通过“阻止”黑名单和灰名单连接来浪费垃圾邮件发送者的情绪,这意味着它会将响应分散在几秒钟内,这迫使客户端比正常情况下保持打开状态的时间更长。

如果连接的新IP地址不在任何黑名单或白名单中,则将连接灰名单化。连接新地址后,spamd会在邮件中插入一条错误的错误消息,然后将其添加到临时列表中。由于垃圾邮件发送者会从传递的邮件中获得报酬,因此它们不会重试错误,而合法服务将在相对较快的时间内重试。

您将必须运行以下命令进行安装fdescfs

mount -t fdescfs null /dev/fd

然后,您必须将此行添加到/etc/fstab

fdescfs     /dev/fd     fdescfs rw      0       0

默认的配置文件(位于中/usr/local/etc/spamd/spamd.conf.sample)可以正常工作。您可以对其进行编辑以添加新的源或更改您使用的源:

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

我们可以通过以下方式启动服务:

sudo service obspamd start

至此,spamd已建立。

启用Webmail服务

灰名单方法的一个问题是大型邮件服务通常会通过许多不同的线轴之一发送邮件,并且不能保证每次都由同一台服务器发送邮件。一种解决方案是将各种Webmail服务使用的IP范围列入白名单。这就是PF配置中使用的Webmail表。如果您包含垃圾邮件发送者使用的IP地址,则此策略可能适得其反,但只要您谨慎对待表中的范围,就可以了。

要将电子邮件范围添加到webmail表,可以运行以下命令:

pfctl -t webmail -T add 192.0.2.0/24

鸽舍

如果希望用户访问邮件而不通过SSH登录,则需要支持IMAP和/或POP3的MDA。Dovecot是一个非常受欢迎的程序,它具有相当简单的配置和强大的功能。

我们可以复制默认配置:

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

该配置由许多不同的文件组成。要查看配置和鸽舍默认设置之间的差异,请运行以下命令:

sudo doveconf -n

以下是一个简单有效的配置:

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

大多数配置文件将位于 conf.d

其中重要的是10-auth.conf10-mail.conf10-ssl.conf

您可以配置在中使用的不同邮箱15-mailboxes.conf。上面看到的是许多系统的不错配置,但是里程可能会有所不同。建议您与尽可能多的不同客户一起使用。

认证方式

大多数默认设置都是正确的。如果要使用系统用户进行身份验证,则必须进行编辑10-auth.conf

取消注释以下行:

!include auth-system.conf.ext

加密

我们必须生成Diffie-Hellman参数:

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

注意: 这将需要很长时间才能运行。比您预期的更长的时间。

现在,我们可以启动Dovecot:

sudo service dovecot start

结论

至此,我们有了一个功能齐全,安全且相对没有垃圾邮件的邮件服务器。

从这里可以看到的更多信息是使用SpamAssassin启发式摆脱垃圾邮件,以及找到您信任的来源发布的更多垃圾邮件黑名单。


Tags: #BSD #Email

Leave a Comment

AI 能否應對越來越多的勒索軟件攻擊?

AI 能否應對越來越多的勒索軟件攻擊?

勒索軟件攻擊呈上升趨勢,但人工智能能否幫助應對最新的計算機病毒?AI 是答案嗎?在這裡閱讀知道是 AI 布恩還是禍根

ReactOS:這是 Windows 的未來嗎?

ReactOS:這是 Windows 的未來嗎?

ReactOS,一個開源和免費的操作系統,這裡有最新版本。它能否滿足現代 Windows 用戶的需求並打倒微軟?讓我們更多地了解這種老式但更新的操作系統體驗。

通過 WhatsApp 桌面應用程序 24*7 保持聯繫

通過 WhatsApp 桌面應用程序 24*7 保持聯繫

Whatsapp 終於為 Mac 和 Windows 用戶推出了桌面應用程序。現在您可以輕鬆地從 Windows 或 Mac 訪問 Whatsapp。適用於 Windows 8+ 和 Mac OS 10.9+

人工智能如何將流程自動化提升到新的水平?

人工智能如何將流程自動化提升到新的水平?

閱讀本文以了解人工智能如何在小型公司中變得流行,以及它如何增加使它們成長並為競爭對手提供優勢的可能性。

macOS Catalina 10.15.4 補充更新引發的問題多於解決

macOS Catalina 10.15.4 補充更新引發的問題多於解決

最近,Apple 發布了 macOS Catalina 10.15.4 補充更新以修復問題,但似乎該更新引起了更多問題,導致 mac 機器變磚。閱讀這篇文章以了解更多信息

大數據的13個商業數據提取工具

大數據的13個商業數據提取工具

大數據的13個商業數據提取工具

什麼是日誌文件系統,它是如何工作的?

什麼是日誌文件系統,它是如何工作的?

我們的計算機以稱為日誌文件系統的有組織的方式存儲所有數據。這是一種有效的方法,可以讓計算機在您點擊搜索時立即搜索和顯示文件。 https://wethegeek.com/?p=94116&preview=true

技術奇點:人類文明的遙遠未來?

技術奇點:人類文明的遙遠未來?

隨著科學的快速發展,接管了我們的大量工作,我們陷入無法解釋的奇點的風險也在增加。閱讀,奇點對我們意味著什麼。

洞察 26 種大數據分析技術:第 1 部分

洞察 26 種大數據分析技術:第 1 部分

洞察 26 種大數據分析技術:第 1 部分

2021 年人工智能對醫療保健的影響

2021 年人工智能對醫療保健的影響

過去幾十年,醫療保健領域的人工智能取得了巨大飛躍。因此,醫療保健中人工智能的未來仍在日益增長。