如何使用VPN(CentOS / RHEL)保护电子邮件服务器免受黑客攻击
在本教程中,我将与您分享我的提示和技巧 保护CentOS / RHEL电子邮件服务器免受黑客攻击 自托管的VPN服务器。 许多垃圾邮件发送者正试图入侵他人的电子邮件服务器。 如果成功,他们将使用被黑的电子邮件服务器发送大量垃圾邮件或窃取有价值的数据。 为什么我们使用自托管的VPN服务器? 因为它允许您启用白名单,所以只有连接到VPN服务器的受信任用户才能访问您的邮件服务器。
先决条件
假设您有一个 邮件服务器 启动并运行。 如果没有,请按照下面的教程之一来设置您自己的邮件服务器。
- 如何使用iRedMail在CentOS 8上轻松设置功能齐全的邮件服务器
还假设您已经设置了一个 VPN伺服器。 如果没有,请按照以下教程之一进行操作。 邮件服务器和VPN服务器可以在单独的主机上运行,也可以在同一主机上运行。
- 在CentOS上设置您自己的WireGuard VPN服务器
暗示: 建议在单独的主机上运行VPN服务器和邮件服务器,以减少操作复杂性。 如果邮件服务器和VPN服务器在同一主机上运行,则需要执行其他步骤,即在VPN服务器上设置响应策略区域以覆盖邮件服务器主机名的公用DNS A记录。
- 在CentOS / RHEL上的BIND解析器中设置响应策略区域(RPZ)
假设DNS A记录 mail.yourdomain.com
决心 12.34.56.78
,那么您需要在响应策略区域中创建一条记录,以将其解析为VPN服务器的专用IP地址 10.10.10.1
。
在以下文本中,我使用 12.34.56.78
作为VPN服务器的公共IP地址。 如果VPN服务器和邮件服务器在同一主机上运行,则需要替换 12.34.56.78
使用VPN服务器的专用IP地址 10.10.10.1
。
步骤1:将VPN Server IP地址添加到防火墙白名单
邮件服务器和VPN服务器启动并运行后,应将VPN服务器的IP地址添加到邮件服务器防火墙的白名单中。 如果您使用 防火墙 (CentOS / RHEL),在邮件服务器上运行以下命令。 将12.34.56.78替换为VPN服务器的IP地址。
sudo firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="12.34.56.78" accept"
您还可以将其他服务器的IP地址列入白名单。 例如,某些人可能有另一个Web服务器,该服务器需要通过电子邮件服务器发送电子邮件。 然后将其添加到白名单中。
sudo firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="IP-address-of-the-other-web-server" accept"
重新加载firewalld,以使更改生效。
sudo systemctl reload firewalld
步骤2:关闭提交端口,IMAP端口和POP3端口
- 提交端口:587和465
- IMAP端口:143和993
- POP3端口:110和995
邮件客户端(例如Mozilla Thunderbird和Microsoft Outlook)使用端口587和465提交外发电子邮件。 恶意参与者可以在587和465端口上用蛮力攻击。
以下是在我的邮件日志中找到的示例(/var/log/maillog
在CentOS / RHEL上)。 错误的参与者正在尝试登录,但是每次都失败了SASL身份验证。
postfix/smtps/smtpd[18071]: Anonymous TLS connection established from unknown[92.118.38.56]: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits) postfix/smtps/smtpd[18071]: warning: unknown[92.118.38.56]: SASL LOGIN authentication failed: UGFzc3dvcmQ6 postfix/smtps/smtpd[18071]: lost connection after AUTH from unknown[92.118.38.56] postfix/smtps/smtpd[18071]: disconnect from unknown[92.118.38.56] ehlo=1 auth=0/1 rset=1 commands=2/3 postfix/smtps/smtpd[18071]: connect from unknown[92.118.38.56] postfix/smtps/smtpd[18071]: Anonymous TLS connection established from unknown[92.118.38.56]: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits) postfix/smtps/smtpd[18071]: warning: unknown[92.118.38.56]: SASL LOGIN authentication failed: UGFzc3dvcmQ6 postfix/smtps/smtpd[18071]: lost connection after AUTH from unknown[92.118.38.56] postfix/smtps/smtpd[18071]: disconnect from unknown[92.118.38.56] ehlo=1 auth=0/1 rset=1 commands=2/3 postfix/smtps/smtpd[18071]: connect from unknown[92.118.38.56] postfix/smtps/smtpd[18071]: Anonymous TLS connection established from unknown[92.118.38.56]: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits) postfix/smtps/smtpd[18071]: warning: unknown[92.118.38.56]: SASL LOGIN authentication failed: UGFzc3dvcmQ6 postfix/smtps/smtpd[18071]: lost connection after AUTH from unknown[92.118.38.56] postfix/smtps/smtpd[18071]: disconnect from unknown[92.118.38.56] ehlo=1 auth=0/1 rset=1 commands=2/3
我不想在邮件日志中看到这种活动,因此我只需要关闭防火墙中的端口587、465、143、993、110和995。 而且由于我的VPN服务器的IP地址已列入白名单,因此只有连接到我的VPN服务器的用户才能访问这些端口。
在CentOS / RHEL上,运行以下两个命令以禁用 imap
, imaps
, smtp-submission
, smtps
, pop3
和 pop3s
服务。
sudo firewall-cmd --permanent --remove-service={smtp-submission,smtps,imap,imaps,pop3,pop3s} sudo firewall-cmd --permanent --remove-port={587/tcp,465/tcp,143/tcp,993/tcp,110/tcp,995/tcp}
如果您看到类似的警告 Warning: NOT_ENABLED: smtps
,您可以忽略该警告。 重新加载firewalld,以使更改生效。
sudo systemctl reload firewalld
当然,您需要保持端口25开放才能接收来自其他SMTP服务器的电子邮件。
步骤3:保护管理面板和Webmail
我们可以关闭端口80和443,以保护管理面板和网络邮件免遭黑客攻击。 但是,这将禁止公共访问所有虚拟主机。 有些人可能在Apache / Nginx中拥有虚拟主机,需要打开Internet。 无需关闭防火墙中的端口80和443,我们可以使用Apache / Nginx中的内置访问控制功能。
Nginx的
编辑网络邮件的虚拟主机文件,例如
sudo nano /etc/nginx/conf.d/mail.your-domain.com.conf
将以下行添加到 server {...}
上下文。 这将仅允许IP地址 12.34.56.78
访问网络邮件,并拒绝所有其他IP地址。
allow 12.34.56.78; deny all;
如果您有多个VPN服务器,则可以添加多个IP地址,如下所示:
allow 12.34.56.78; allow 12.34.56.79; deny all;
保存并关闭文件。 然后测试Nginx配置。
sudo nginx -t
如果测试成功,请重新加载Nginx以使更改生效。
sudo systemctl reload nginx
不在白名单中的用户将看到403禁止错误。
阿帕奇
在目录中编辑网络邮件的虚拟主机文件 /etc/httpd/conf.d/
目录,例如
sudo nano /etc/httpd/conf.d/mail.your-domain.com-le-ssl.conf
在之间添加以下行 <VirtualHost>...</VirtualHost>
标签。 这将仅允许IP地址 12.34.56.78
访问网络邮件,并拒绝所有其他IP地址。
<LocationMatch "^/"> Require ip 12.34.56.78 </LocationMatch>
如果您有多个VPN服务器,则可以添加多个IP地址,如下所示:
<LocationMatch "^/"> Require ip 12.34.56.78 12.34.56.79 </LocationMatch>
保存并关闭文件。 然后测试Apache配置。
sudo apachectl -t
如果语法正确,请重新加载Apache以使更改生效。
sudo systemctl reload httpd
不在白名单中的用户将看到403禁止错误。
Certbot TLS证书续订
如果您在Apache / Nginx虚拟主机中启用了白名单,那么您还将阻止Let’s Encrypt服务器访问您的Web服务器,这是使用HTTP-01挑战续订Let’s Encrypt TLS证书所必需的。 为了解决此问题,我们可以在证书更新之前禁用白名单,并在更新之后再次启用白名单。
在 /root/
目录。
sudo nano /root/certbot-renewal.sh
如果您使用Nginx,请将以下行添加到此文件中。
#! /bin/bash # disable whitelisting in the Nginx virtual host sed -i 's/deny all;/#deny all;/g' /etc/nginx/conf.d/mail.your-domain.com.conf systemctl reload nginx # renew TLS certificate certbot renew --quiet # enable whitelisting sed -i 's/#deny all;/deny all;/g' /etc/nginx/conf.d/mail.your-domain.com.conf systemctl reload nginx
如果使用Apache,则将以下行添加到该文件中。
#! /bin/bash # disable whitelisting in the Apache virtual host sed -i 's/Require ip/#Require ip/g' /etc/httpd/conf.d/mail.your-domain.com-le-ssl.conf systemctl reload apache2 # renew TLS certificate certbot renew --quiet # enable whitelisting sed -i 's/#Require ip/Require ip/g' /etc/httpd/conf.d/mail.your-domain.com-le-ssl.conf systemctl reload apache2
保存并关闭文件。 然后向该文件添加执行权限。
sudo chmod +x /root/certbot-renewal.sh
编辑root用户的crontab文件。
sudo crontab -e
在文件末尾添加以下行,因此shell脚本每天运行一次。
@daily bash /root/certbot-renewal.sh
保存并关闭文件。
关闭SSH端口?
由于VPN服务器的IP地址已列入白名单,因此您也可以关闭防火墙中的SSH端口。 但是,这样做会带来风险。 如果您的VPN服务器停止工作,那么您将被锁定在自己的范围之外。 为了保护SSH服务免受黑客攻击,建议您设置公共密钥身份验证或两因素身份验证。
- 在CentOS / RHEL上设置SSH公钥身份验证的2个简单步骤
- 在CentOS / RHEL服务器上设置SSH两因素身份验证(2FA)
包起来
我希望本教程可以帮助您保护电子邮件服务器免受CentOS / RHEL的黑客攻击。 与往常一样,如果您发现这篇文章很有用,请订阅我们的免费新闻通讯以获取新教程。 保重🙂