这一节是这个系统的最后一节,之后有跟这个相关的文章我会做为另一个话题写了,不再做为邮箱服务器的后续了。总之,这一节的内容是干货满满的。
这一节的内容为实例讲解,根据之前四个小节的内容知道做一个实例部署讲解。如果你对相关的知识或参数不是很了解的话,请参考前面的四节内容
搭建强健的邮箱服务器(一)
搭建强健的邮箱服务器(二)
搭建强健的邮箱服务器(三)
搭建强健的邮箱服务器(四)
日志文件的查看
实时监控 /var/log/mail.log 文件的末尾,并输出新添加的日志内容。这对于查看正在发生的事情、错误消息或调试信息非常有用,尤其是在处理邮件服务器问题时
tail -f /var/log/mail.log
## 其它相关常用的命令:查看端口
sudo netstat -tulpen | grep 25
请确保你的防火墙已经开启,请将以下端口号打开:
## 关于邮件端口
SMTP: TCP 25
IMAP: TCP 143
POP3: TCP 110
SMTPS: TCP 465
IMAPS: TCP 993
POP3S: TCP 995
Web环境配置
这里我要的Web环境的搭建是为了日后做邮件管理用的。如果你对这个感兴趣,就了解一下,如果不感兴趣,这个小节就可以跳过。
我准备亲手撸一个邮箱管理器,用第三方的着实不应手。但凡有标准协议的东西,只要不是什么逆天的算法,我应该都能把它给搓出来。我的想法是把邮件的管理做的和QQ一样,再把P2P整合进来,做这么个应用,理论上我的知识储备和技术储备应该没什么问题。Mac端、移动端、win平台都适配上。我的后台就以PHP为主,为辅。不知什么原因,我天生就排斥Java。好,废话不多说,先把环境搭好,供日后使用。
时区调整
查看当前日期时间
date
调整时区:
sudo dpkg-reconfigure tzdata
打开防火墙
sudo ufw enable
安装Nginx
我这儿用Nginx做反向代理。
sudo apt update
sudo apt install nginx
## 成功安装Nginx之后,您可以运行以下命令来启动并验证它:
sudo systemctl start nginx
sudo systemctl status nginx
## 要检查Nginx的版本,请运行:
sudo dpkg -l nginx
## 添加到防火墙,打开80和443端口
sudo ufw allow 'Nginx Full'
##重新加载防火墙
sudo ufw reload
## 查看防火墙状态
sudo ufw status
关于一些命令操作,咱就用一个学一个,不要一咕噜脑的学一大堆,日常又用不到,最后还是忘记了,这就太浪费时间和脑细胞了。一定要听话,哥不会害你。
PHP安装
安装php8时先添加源:后更新
## 添加更新源
sudo add-apt-repository ppa:ondrej/php
## 更新源
sudo apt-get update
##安装PHP主组件
sudo apt-get install php8.3 php8.3-fpm php8.3-cli
## 查看PHP运行状态:
systemctl status php8.3-fpm
## 安装扩展
sudo apt-get install php8.3-{dev,curl,mysql,gd,opcache,zip,intl,common,bcmath,imagick,xmlrpc,readline,mbstring,apcu,xml,dom}
安装MySql
sudo apt-get install mysql-server
常用命令:
service mysql start #启动服务器
service mysql stop #关闭服务器
service mysql restart ## 重启服务
## sudo mysql -u root -p
## mysql的配置文件地址:/etc/mysql/mysql.conf.d/mysqld.cnf
## 确认是否成功:
## mysql节点处于LISTEN状态表示启动成功:
sudo netstat -tap | grep mysql
## 如果提示sudo:netstat找不到命令,请进行以下安装:
sudo apt-get install net-tools
## 再次 运行
sudo netstat -tap | grep mysql
## 版本查看
mysql -V; # 注意 V 是大写
查看初始用户及密码
# 查看初始密码
sudo cat /etc/mysql/debian.cnf
# 进行安全配置
sudo mysql_secure_installation //进行安全配置
然后用初始用户及密码登录修改
有时候用这种初始用户和密码也无法登录,则使用下面的方法:
在终端键入命令:sudo mysql -u root -p 输入密码即可登录(这里随便输入一个密码都可以进入,进入之而后再根据对应的mysql版本输入语句修改密码,下次就可以不用sudo了),然后就可以用下面的方法修改root用户的密码了。
root模式
sudo mysql //进入mysql,输出以下信息:
...
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
mysql>
修改root密码
## 切换到root
mysql> use mysql
## 更新权限
flush privileges;
## 修改密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '
创建用户并赋于权限
.0后的版本需要先创建用户,然后再授权:
mysql> CREATE USER '用户名'@'%' IDENTIFIED BY '密码';
mysql> GRANT ALL PRIVILEGES ON [数据库.* | *.*] TO '用户名'@'[localhost | %]';
## 上面的 “|” 表示二选一,根据自己的需求。 “ % ”表示允许远程登录。localhost表示只能本地登录。
配置php.ini中的重要参数
## 允许上传的文件大小为800M
upload_max_filesize = 800M
## 允许post的文件大小为800M
post_max_size = 800M
## 允许内容占有的最小容量为256M
memory_limit = 256M
## 允许脚本执行的最大时间为600秒。考虑到有时要上传文件,所以要调大一些。
max_execution_time = 600
max_input_vars = 3000
max_input_time = 1000
的安装
redis是一款内存数据库,要想提高服务器的性能,redis应用是少不了的。
## 首先安装Redis-server
sudo apt-get install redis-server -y
## pickle的方式安装phpredis
wget https://github.com/FriendsOfPHP/pickle/releases/latest/download/pickle.phar
$ php pickle.phar
$ chmod +x pickle.phar
$ mv pickle.phar pickle
$ sudo php pickle install redis
## 在php.ini中添加:
extension=redis.so
swool的安装
是一款PHP下的高性能的并发请求和管理组件,功能十分强大,一句话难以描述它,总之爱不释手。
## 安装相应的扩展:
sudo apt-get install libcurl4-openssl-dev
sudo pecl install igbinary
## 通过pecl安装swoole:
sudo pecl install swoole
## 通过源码安装swoole
sudo git clone https://github.com/swoole/swoole-src.git
sudo apt-get install php-dev
cd swoole-src
phpize
./configure
sudo make && sudo make install
php.ini中的加载
## 在php.ini中添加:
extension=swoole.so
重新启动nginx
## 要停止,然后再次启动该服务,键入:
$ sudo systemctl restart nginx
## 查看nginx状态:
systemctl status nginx
服务块的配置
所谓服务块是指一台服务器上设置多个站点应用。每个应用就叫一个服务块。
## 创建speedxcn站点目录
sudo mkdir -p /var/www/myexample.com/html
## 使用$USER环境变量分配目录的所有权:
$ sudo chown -R $USER:$USER /var/www/html
$ sudo chown -R $USER:$USER /var/www/myexample.com/html
## 如果我们没有修改自己的umask值,那么Web根目录的权限应该正确,我们可以通过输入以下命令来确认:
$ sudo chmod -R 755 /var/www/myexample.com
##向站点中添加测试文件
$ sudo nano /var/www/myexample.com/html/echophpini.php
.php
<?pbhp
echo phpini();
完成后保存并关闭文件。
创建服务块配置文件
$ sudo nano /etc/nginx/sites-available/myexample.com
粘贴到以下内容添加到文件中,这个块的配置与默认块的配置相似,但针对我们的新目录和域名进行了更新:
server {
listen 80;
listen [::]:80;
root /var/www/myexample.com/html;
index index.html index.htm index.php;
server_name myexample.com www.myexample.com;
location / {
try_files $uri $uri/ =404;
}
# pass PHP scripts to FastCGI server
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;s
}
}
将服务块的配置文件链接到Nginx
sudo ln -s /etc/nginx/sites-available/myexample.com /etc/nginx/sites-enabled/
为避免可能由于添加其他服务器名称而引起的哈希存储区内存问题,有必要调整/etc/nginx/nginx.conf文件中的单个值。打开文件:
sudo nano /etc/nginx/nginx.conf
找到指令并删除#符号:
...
http {
...
server_names_hash_bucket_size 64;
...
}
...
完成后保存并关闭文件。
测试nginx的配置文件,以确保我们在 Nginx 文件中的改动,没有任何问题:
$ sudo nginx -t
如果没有任何问题,请重新启动 Nginx:
sudo systemctl restart nginx
为网站配置SSL
这里我们借助来申请免费的证书,同样可以为我们的站点保驾护航。免费证书有效期只有90天,不过我们可以设置自动继订。总之使用起来还是很丝滑的。
如果之前安装了, 请先卸载它:
sudo apt-get remove certbot
## 安装snapd
sudo apt-get install snapd
sudo snap install --classic certbot
## 创建命令行链接
sudo ln -s /snap/bin/certbot /usr/bin/certbot
## 如果你的服务器只有一个站点且没有其它服务块的配置,则直接运行以下命令即可
sudo certbot --nginx
## 如果是多域名且有多服务块运行,则运行以下命令
sudo certbot --nginx -d myexample.com -d www.myexample.com
## 获取证书成功后显示类似如下:
sudo certbot --nginx -d www.myexample.com -d myexample.com -d mail.myexample.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for www.myexample.com and 2 more domains
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/www.myexample.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/www.myexample.com/privkey.pem
This certificate expires on 2024-03-09.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
Deploying certificate
Successfully deployed certificate for www.myexample.com to /etc/nginx/sites-enabled/myexample.com
Successfully deployed certificate for myexample.com to /etc/nginx/sites-enabled/myexample.com
Successfully deployed certificate for mail.myexample.com to /etc/nginx/sites-enabled/mail.myexample.com.conf
Congratulations! You have successfully enabled HTTPS on https://www.myexample.com, https://myexample.com, and https://mail.myexample.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
## 上面显示了证书的目录、到期日期等信息。
系统上的 软件包附带一个 cron 作业或 计时器,它们将在证书过期之前自动续订证书。除非您更改配置,否则您无需再次运行 。您可以通过运行以下命令来测试证书的自动续订:
sudo certbot renew --dry-run
这时的配置文件应该是这样的:
server {
listen 443 ssl;
root /var/www/myexample.com/html;
index index.html index.htm index.php;
server_name myexample.com www.myexample.com;
location / {
try_files $uri $uri/ =404;
}
# pass PHP scripts to FastCGI server
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
}
ssl_certificate /etc/letsencrypt/live/www.myexample.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/www.myexample.com/privkey.pem; # managed by Certbot
}
server {
if ($host = myexample.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = www.myexample.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name myexample.com www.myexample.com;
return 404; # managed by Certbot
}
的安装与配置安装
sudo apt install postfix postfix-mysql opendkim opendkim-tools spf-tools-perl
或使用以下命令安装:
sudo apt install mailutils
打开交互配置如下:
sudo dpkg-reconfigure postfix
配置交互中的各项信息为:
邮件配置的一般类型 : 站点系统邮件名称:(不是)Root 和 邮件收件人:您的主要 Linux 帐户的用户名(在我们的示例中为 )其他接收邮件的目的地:$, , , , 强制同步更新邮件队列?:否本地网络:127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128邮箱大小限制:0本地地址扩展字符:+要使用的互联网协议:所有
生成的配置项如下所示:
sudo nano /etc/postfix/main.cf
## 确保以下设置正确
myhostname = mail.myexample.com
mydomain = myexample.com
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
更改主机的
sudo hostnamectl set-hostname mail.myexample.com
##显示本机的hostname
hostname -f
## 我们还需要使用命令行文本编辑器(如 Nano)更新文件。/etc/hosts
sudo nano /etc/hosts
## 更改如下:
127.0.0.1 localhost
127.0.0.1 mail.myexample.com
配置DNS
确保你的DNS记录包括MX记录,指向你的邮件服务器
Type: TXT
Name: @
Value: v=spf1 include:myexample.com ~all
Priority: 10
Type: TXT
Name: _dmarc
Value: v=DMARC1; p=quarantine; rua=mailto:dmarc@myexample.com;
ruf=mailto:dmarc@myexample.com; fo=1;
Priority: 10
Type: TXT
Name: default._domainkey
Value: v=DKIM1;h=sha256;k=rsa;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAif6k
......
L5Jsztmv+7Bf1cBNZjHXVwiricNSm87G5q1Y8Qev0JRXAAX95h1Bc8C//fvVG3UBrlxwbKzA
pyWxzQSyvDjWR29wboqhXmkiPneUfP8Hsry4Xz6mrWK2g9oAsDQIDAQAB
Priority: 10
Type: MX
Name: @
Value: myexample.com
Priority: 10
Type: A
Name: mail
Value: 192.168.1.17
Priority: 10
Type: A
Name: imap
Value: 192.168.1.17
Priority: 10
Type: A
Name: smtp
Value: 192.168.1.17
Priority: 10
Type: A
Name: pop3
Value: 192.168.1.17
Priority: 10
Type: A
Name: www
Value: 192.168.1.17
Priority: 10
Type: A
Name: @
Value: 192.168.1.17
Priority: 10
其中用于接收邮件服务,用于发送邮件服务, 如果MX记录的目标是,那么邮件服务器将尝试将邮件发送到。如果这个MX记录的目标是,那么邮件服务器会尝试将邮件发送到。在后一种情况下,邮件服务器可能会查找域的MX记录,以确定实际处理邮件的邮件服务器。
安装SASL服务
(SASL )是一个独立的服务, 负责处理基于 SASL 的身份验证。
sudo apt-get update
sudo apt-get install libsasl2-modules sasl2-bin libsasl2-modules-db
## 确保 saslauthd 服务已经启动。你可以使用以下命令来启动和检查服务状态:
sudo systemctl start saslauthd
sudo systemctl enable saslauthd
sudo systemctl status saslauthd
## 验证 SASLauthd 是否正在监听 saslauthd 的默认套接字
sudo netstat -ln | grep saslauthd
安装完成后,你需要配置和启动 服务。在配置文件中指定要使用的验证机制和认证源(例如,PAM、LDAP等),然后启动服务。
SASL认证数据库
配置SASL以使用适当的认证数据库。在/etc//sasl/smtpd.conf文件中添加以下内容:
pwcheck_method: saslauthd
mech_list: plain login
此配置使用作为密码验证方法,并指定支持的身份验证机制。
SASL认证用户源
配置SASL以指定认证用户的来源。在 /etc//文件中添加以下行:
START=yes
MECHANISMS="pam"
上述配置使用PAM( )来提供SASL认证。
开启的SASL服务及提交服务
## 打开postfix的进程服务配置文件
sudo nano /etc/postfix/master.cf
#
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (no) (never) (100)
# ==========================================================================
smtp inet n - y - - smtpd
#smtp inet n - y - 1 postscreen
#smtpd pass - - y - - smtpd
#dnsblog unix - - y - 0 dnsblog
#tlsproxy unix - - y - 0 tlsproxy
# Choose one: enable submission for loopback clients only, or for any client.
#127.0.0.1:submission inet n - y - - smtpd
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_tls_security_level=may
-o smtpd_sasl_auth_enable=yes
# -o smtpd_sasl_type=cyrus
-o smtpd_sasl_type=dovecot
# -o smtpd_sasl_path=smtpd
-o smtpd_sasl_path=private/auth
-o smtpd_tls_wrappermode=no
# -o smtpd_tls_auth_only=yes
# -o smtpd_reject_unlisted_recipient=no
# -o smtpd_client_restrictions=$mua_client_restrictions
# -o smtpd_helo_restrictions=$mua_helo_restrictions
# -o smtpd_sender_restrictions=$mua_sender_restrictions
-o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
# Choose one: enable smtps for loopback clients only, or for any client.
#127.0.0.1:smtps inet n - y - - smtpd
smtps inet n - y - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
# -o smtpd_reject_unlisted_recipient=no
# -o smtpd_client_restrictions=$mua_client_restrictions
# -o smtpd_helo_restrictions=$mua_helo_restrictions
# -o smtpd_sender_restrictions=$mua_sender_restrictions
-o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
# -o milter_macro_daemon_name=ORIGINATING
## 配置SPF验证功能
policyd-spf unix - n n - 0 spawn
user=policyd-spf argv=/usr/bin/policyd-spf
这里,le 启用 SASL 身份验证, 和 配置了 Cyrus SASL。evel设置为 may,以允许启用 TLS 包装模式,但不要求客户端使用 TLS。这是通常的设置,适用于保护身份验证信息的同时仍然允许非加密通信。
重启服务
sudo systemctl restart postfix
## sudo systemctl restart saslauthd
sudo systemctl start saslauthd
## 如何没有错误,开启开机启动
sudo systemctl enable saslauthd
SMTP身份验证
配置SMTP身份验证可以防止未经授权的用户使用邮件服务器来发送邮件。你可以启用SMTP身份验证以要求用户在发送邮件之前提供用户名和密码。
##打开/etc/postfix/main.cf
sudo nano /etc/postfix/main.cf
## 确保以下配置参数的设置正确
## 这个参数启用了 SMTP 身份验证。
smtpd_sasl_auth_enable = yes
## 设置SASL库的类型。在这里,使用CyrusSASL(Simple Authentication and Security Layer)
## 来处理SMTP身份验证。
smtpd_sasl_type = dovecot
## 指定了 Cyrus SASL 库的路径,这里设置为 smtpd。
smtpd_sasl_path = private/auth
## 指定 Postfix 服务器的本地域
smtpd_sasl_local_domain = $myhostname
## 设置 SASL 的安全选项,这里禁用了匿名登录,即 noanonymous。
smtpd_sasl_security_options = noanonymous
## 该参数启用了对于一些不太规范的 SASL 客户端的兼容性处理。
broken_sasl_auth_clients = yes
## 限制每个客户端在60秒内只能发送30封邮件
smtpd_client_message_rate_limit = 30
## 该设置指定了用于验证对方SMTP服务器证书的证书颁发机构(CA)路径。在这里,
## 它指定了系统SSL证书存储的路径。
smtp_tls_CApath=/etc/ssl/certs
## 该设置指定了用于外部SMTP服务器连接的TLS加密级别。may 表示Postfix将尝试使用TLS,
##但如果连接失败或对方服务器不支持TLS,仍然允许未加密的连接。
smtp_tls_security_level = may
## 该设置指定了Postfix用于缓存SMTP会话状态的数据库文件。这有助于提高性能,
## 避免在TLS握手过程中进行重复的计算。这里使用了BDB(Berkeley Database)格式的数据库。
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache:
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination:
## 该设置定义了允许邮件中继的规则。具体地说:
## permit_mynetworks 允许来自Postfix服务器的内部网络的邮件中继。
## permit_sasl_authenticated 允许经过SMTP身份验证的用户进行邮件中继。
## defer_unauth_destination 会推迟对于未认证目标域的邮件中继,直到后续的规则进一步处理。这是一种常见的配置,以防止未授权的邮件中继。
本实例不中继其它服务的邮件,所以把与中继(relay)有关的服务可关闭了。
TLS/SSL加密
## 打开配置文件
sudo nano /etc/postfix/main.cf
## 配置如下,这里的证书就是上面我们为站点申请的SSL证书,拿来用也是一样的。省事。
smtpd_tls_cert_file=/etc/letsencrypt/live/www.myexample.com/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/www.myexample.com/privkey.pem
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
上述配置中, 和 分别指定TLS证书和私钥的文件路径。
日志
指定日志文件路径:
maillog_file = /var/log/mail.log
这里的路径可以根据你的系统和偏好进行调整。
配置SPF检查SPF记录
安装工具:
sudo apt install bind9-dnsutils
输入命令:
dig myexample.com txt
显示内容如下所示:
; <> DiG 9.18.18-0ubuntu0.22.04.1-Ubuntu <> myexample.com txt
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27336
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;myexample.com. IN TXT
;; ANSWER SECTION:
myexample.com. 600 IN TXT "v=spf1 include:myexample.com ~all"
;; Query time: 43 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Sun Dec 31 15:22:57 CST 2023
;; MSG SIZE rcvd: 86
配置SPF策略代理
SPF 用于指定哪些邮件服务器被允许发送来自特定域名的电子邮件。俗称 白名单
安装工具
sudo apt-get install spf-tools-perl
打开 /etc//spf- 文件以编辑:
sudo nano /etc/default/spf-policyd
## 输入以下内容
HELO_DOMAIN=myexample.com
DEF_POLICY_NXDOMAIN=yes
## DEF_POLICY_NXDOMAIN 设置为 yes 表示如果 SPF 记录不存在时,默认行为是拒绝。
我们还需要告诉我们的 SMTP服务器检查传入电子邮件的SPF记录。这有助于检测伪造的传入电子邮件。
首先,安装所需的软件包:
sudo apt install postfix-policyd-spf-python
然后编辑 主进程配置文件。
sudo nano /etc/postfix/master.cf
在文件末尾添加以下行,告诉 在启动 SPF 策略守护程序时启动它。
policyd-spf unix - n n - 0 spawn
user=policyd-spf argv=/usr/bin/policyd-spf
保存并关闭文件。
接下来,编辑 主配置文件。
在文件末尾追加以下行。第一行指定 策略代理超时设置。以下几行将通过拒绝未经授权的电子邮件和检查 SPF 记录来限制传入的电子邮件。
sudo nano /etc/postfix/main.cf
## 添加以下记录, SPF验证功能
policyd-spf_time_limit = 3600
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
check_policy_service unix:private/policyd-spf
保存并关闭文件。然后重新启动 。
sudo systemctl restart postfix
下次,当您收到来自具有 SPF 记录的域的电子邮件时,您可以在原始电子邮件标题中看到 SPF 检查结果。以下标头指示发件人从授权主机发送电子邮件。
Received-SPF: Pass (sender SPF authorized).
配置PTR记录
PTR记录也叫做记录,它将IP地址转换成主机名,与A记录刚好相反。这种解析被称为反向DNS解析(rDNS)。
PTR记录可以帮助我们过滤垃圾邮件。很多SMTP服务器会查找对方SMTP服务器的PTR记录,得到一个主机名,然后与对方SMTP声称的主机名作比较,如果两者一致,就接收邮件,反之不接收邮件或放进垃圾箱。为了不让你的邮件被拒收或放进垃圾箱,你应该为你的服务器IP设置PTR记录。
查找一个IP地址的PTR记录的命令为:
dig -x +short
## 或
host
因为你是从主机商获得服务器的IP,所以你得在主机商那里设置PTR记录(反向DNS解析),而不是在域名注册商那里设置。
设置DKIM安装:
sudo apt-get install opendkim opendkim-tools
## 将 postfix 用户添加到 opendkim 组
sudo usermod -G opendkim postfix
## 或
sudo gpasswd -a postfix opendkim
生成密钥对:
sudo mkdir -p /etc/opendkim/keys/mail.myexample.com
sudo chown -R opendkim:opendkim /etc/opendkim
sudo chmod go-rw /etc/opendkim/keys
sudo opendkim-genkey -b 2048 -d myexample.com -D /etc/opendkim/keys/mail.myexample.com -s default -v
## 生成密钥后,需要对私钥文件设置适当的权限:
sudo chown opendkim:opendkim /etc/opendkim/keys
## 更改权限,以便只有用户才能对文件进行读写访问。opendkim
sudo chmod 600 /etc/opendkim/keys/mail.myexample.com/default.private
将DKIM TXT记录添加到DNS
上面的命令完成后还会生成一个.txt的文件,把里面的内容根据前几个小节介绍的方法把内容进行拼接好写入DNS。
default._domainkey IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB........n49i/xLNCrlavz9n8lLpQIDAQAB"
配置
修改 的配置文件以指向生成的私钥。
打开 /etc/.conf 文件,并确保以下行的设置:
# This is a basic configuration for signing and verifying. It can easily be
# adapted to suit a basic installation. See opendkim.conf(5) and
# /usr/share/doc/opendkim/examples/opendkim.conf.sample for complete
# documentation of available configuration parameters.
Syslog yes
SyslogSuccess yes
#LogWhy no
LogWhy yes
# Common signing and verification parameters. In Debian, the "From" header is
# oversigned, because it is often the identity key used by reputation systems
# and thus somewhat security sensitive.
Canonicalization relaxed/simple
Mode sv
SubDomains no
OversignHeaders From
# Signing domain, selector, and key (required). For example, perform signing
# for domain "example.com" with selector "2020" (2020._domainkey.example.com),
# using the private key stored in /etc/dkimkeys/example.private. More granular
# setup options can be found in /usr/share/doc/opendkim/README.opendkim.
## 确保 Domain 匹配你的域名,KeyFile 指向你生成的私钥文件。
Domain myexample.com
KeyFile /etc/opendkim/keys/mail.myexample.com/default.private
Selector default
# In Debian, opendkim runs as user "opendkim". A umask of 007 is required when
# using a local socket with MTAs that access the socket as a non-privileged
# user (for example, Postfix). You may need to add user "postfix" to group
# "opendkim" in that case.
## 接下来,确保将 UserID 设置为 opendkim
# Remember to add user postfix to group opendkim
UserID opendkim
UMask 007
# Socket for the MTA connection (required). If the MTA is inside a chroot jail,
# it must be ensured that the socket is accessible. In Debian, Postfix runs in
# a chroot in /var/spool/postfix, therefore a Unix socket would have to be
# configured as shown on the last line below.
#Socket local:/run/opendkim/opendkim.sock
#Socket inet:8891@localhost
#Socket inet:8891
Socket local:/var/spool/postfix/opendkim/opendkim.sock
PidFile /run/opendkim/opendkim.pid
# Hosts for which to sign rather than verify, default is 127.0.0.1. See the
# OPERATION section of opendkim(8) for more information.
#InternalHosts 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
# The trust anchor enables DNSSEC. In Debian, the trust anchor file is provided
# by the package dns-root-data.
TrustAnchorFile /usr/share/dns/root.key
#Nameservers 127.0.0.1
AutoRestart yes
AutoRestartRate 10/1M
Background yes
DNSTimeout 5
SignatureAlgorithm rsa-sha256
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
创建签名表、密钥表、受信主机文件创建签名表
sudo nano /etc/opendkim/SigningTable
将以下两行添加到文件中。这告诉,如果服务器上的发件人使用地址,则应使用由标识的私钥对其进行签名。第二行表明您的子域也将由私钥签名。
*@myexample.com default._domainkey.myexample.com
*@*.myexample.com default._domainkey.myexample.com
保存并关闭文件。
然后创建键表。
sudo nano /etc/opendkim/KeyTable
添加以下行,该行告知私钥的位置。
default._domainkey.myexample.com myexample.com:default:/etc/opendkim/keys/mail.myexample.com/default.private
保存并关闭文件。
创建受信任的主机文件
sudo nano /etc/opendkim/TrustedHosts
将以下行添加到新创建的文件中。这告诉,如果电子邮件来自本地主机或来自同一域,则应该只对电子邮件进行签名,而不对电子邮件执行DKIM验证。
127.0.0.1
localhost
*.myexample.com
保存并关闭文件。
权限
如果运行错误,有可能是文件权限问题:
## 查看文件的权限
ls -l /etc/opendkim/TrustedHosts
## 如果不对,则进行以下操作
sudo chmod 644 /etc/opendkim/KeyTable
sudo chmod 644 /etc/opendkim/SigningTable
sudo chmod 644 /etc/opendkim/TrustedHosts
sudo chown :opendkim /etc/opendkim/KeyTable
sudo chown :opendkim /etc/opendkim/SigningTable
sudo chown :opendkim /etc/opendkim/TrustedHosts
sudo chmod g+r /etc/opendkim/TrustedHosts
sudo chmod g+r /etc/opendkim/KeyTable
sudo chmod g+r /etc/opendkim/SigningTable
重启
在完成以上步骤后,重新启动 服务以应用更改:
sudo systemctl restart opendkim
## 查看运行状态
sudo systemctl status opendkim
请确保没有错误,并监视系统日志以查找潜在的 DKIM 配置问题:
## 按服务查看日志: opendkim 日志
sudo journalctl -u opendkim
## 查看最新的日志:
sudo journalctl
## 按时间范围查看日志:
sudo journalctl -u opendkim --since "2024-01-01 00:00:00" --until "2024-01-02 00:00:00"
## 按关键字搜索日志:
sudo journalctl | grep "keyword"
验证DNS记录
## 此命令会检查密钥的语法和配置。
sudo opendkim-testkey -d myexample.com -s default -vvv
## 输出信息如下:
opendkim-testkey: using default configfile /etc/opendkim.conf
opendkim-testkey: key loaded from /etc/opendkim/keys/mail.myexample.com/default.private
opendkim-testkey: checking key 'default._domainkey.myexample.com'
opendkim-testkey: key not secure
opendkim-testkey: key OK
完成上述步骤后,你的邮件服务器就使用 DKIM 进行签名了。确保邮件发送到目标邮箱时,目标邮箱服务器能够验证 DKIM 签名。
将连接到
可以通过 Unix 套接字文件与 通信。 使用的默认套接字文件是 /var/run//.sock。但是 附带的 SMTP 守护程序在 jail 中运行,这意味着 SMTP 守护程序会解析相对于 队列目录 (/etc/.conf) 的所有文件名。因此,我们需要更改 Unix套接字文件 /var/spool/。
首先,我们将更改 套接字文件的位置。让我们使用以下命令创建一个新目录,并仅允许用户和组访问它。 ::
sudo mkdir /var/spool/postfix/opendkim
sudo chown opendkim:postfix /var/spool/postfix/opendkim
现在在文本编辑器中编辑配置文件:
sudo nano /etc/opendkim.conf
搜索 条目并按如下方式更新它:
Socket local:/var/spool/postfix/opendkim/opendkim.sock
接下来编辑 /etc// 文件:
sudo nano /etc/default/opendkim
并设置条目,如下所示:
SOCKET=local:/var/spool/postfix/opendkim/opendkim.sock
接下来,您需要编辑位于 /etc//main.cf 的配置文件。在此文件中,您需要添加以下参数:
sudo nano /etc/postfix/main.cf
在此文件的末尾添加以下行,以便 能够通过 协议调用 。
# Milter configuration
milter_default_action = accept
milter_protocol = 6
smtpd_milters = local:opendkim/opendkim.sock,local:opendmarc/opendmarc.sock
non_smtpd_milters = $smtpd_milters
添加参数后,您需要重新启动 和 服务。为此,您需要运行以下命令:
sudo systemctl restart opendkim postfix
## 添加到开机自启
sudo systemctl enable opendkim
此命令将重新启动这两个服务,您将准备好使用 发送电子邮件。
配置的设置
**DMARC**记录是一种TXT记录,有助于防止电子邮件欺骗。
要为您的域生成 DMARC 记录,您需要在 DNS 上创建一个具有以下值的 TXT 记录:
_dmarc.myexample.com TXT "v=DMARC1; p=none; rua=mailto:dmarc_report@myexample.com; fo=1;"
安装和配置DMARC
通过包管理器安装 DMARC 解析工具。
sudo apt-get update
sudo apt-get install opendmarc
如果要求你为配置数据库,你可以放心地选择“否”。如果你想为其他邮箱提供商生成DMARC报告,你只需要为配置一个数据库。对于像我们这样的小型邮件服务器运营商来说,生成DMARC报告不是很有用,所以我们可以跳过它。
安装后,它将自动启动。使用以下方式检查其状态:
systemctl status opendmarc
## 显示如下:
opendmarc.service - OpenDMARC Milter
Loaded: loaded (/lib/systemd/system/opendmarc.service; disabled; vendor preset: enabled)
Active: active (running) since Tue 2018-10-30 19:49:52 CST; 23s ago
Docs: man:opendmarc(8)
man:opendmarc.conf(5)
Main PID: 14858 (opendmarc)
Tasks: 6 (limit: 1110)
CGroup: /system.slice/opendmarc.service
└─14858 /usr/sbin/opendmarc
请注意,系统启动时的自动启动功能处于禁用状态。我们可以通过以下方式启用它:
sudo systemctl enable opendmarc
配置 DMARC 设置。编辑 /etc/.conf文件,根据你的需求进行配置。确保设置了 ,这是邮件服务器的身份标识。
AuthservID OpenDMARC
接下来,添加以下行。将主机名替换为您的真实 主机名。这告诉信任ID中的认证结果。当您运行 进行 DKIM 验证时,这是必需的。
TrustedAuthservIDs myexample.com
如果 主机名未包含在 中,或者您的主机名中有拼写错误,那么 将忽略 生成的身份验证结果标头,您将在邮件日志 /var/log/mail.log中找到以下错误消息
opendmarc[1133]: A436A205C9 ignoring Authentication-Results at 1 from mail.myexample.com
然后找到这一行:
# RejectFailures false
默认情况下,不会拒绝未通过DMARC检查的电子邮件,即使域名的政策设置为.p=。如果您希望在域的政策设置为p=时拒绝未通过 DMARC 检查的电子邮件,请取消注释此行并更改false为true
RejectFailures true
你可能希望忽略通过SMTP AUTH成功认证的SMTP客户端。例如,我有一个 SMTP服务器在我的博客网络服务器上运行,它使用我的主邮件服务器作为中继来发送通知电子邮件,所以我希望忽略从我的博客网络服务器提交的电子邮件。这也适用于通过端口 587 提交传出电子邮件的桌面/移动邮件客户端。在这种情况下,请在此文件的末尾添加以下行。
IgnoreAuthenticatedClients true
在此文件的末尾添加以下行。
RequiredHeaders true
这将拒绝不符合中所述的电子邮件标题标准的电子邮件。例如,如果传入的电子邮件没有标题或标题,它将被拒绝。无法从中提取域名的 From: 字段也将被拒绝。From:date:
建议在此文件的末尾添加以下行。这将使在邮件头中找不到SPF结果时执行回退SPF检查。
SPFSelfValidate true
是作为(邮件过滤器)实现的。 可以通过 Unix 套接字与 应用程序通信。使用的默认套接字文件是/var/run//.sock/。但是 附带的 SMTP 守护程序在 jail 中运行,这意味着 SMTP 守护程序会解析相对于 队列目录 (var/spool/) 的所有文件名。所以我们需要改变使用的套接字文件。
找到以下行。
Socket local:/var/run/opendmarc/opendmarc.sock
将其更改为:
Socket local:/var/spool/postfix/opendmarc/opendmarc.sock
保存并关闭文件。
注意:该文件也可以设置套接字文件位置,但是 18.04 和 20.04
上的包不会读取此文件,因此我们需要在文件中设置套接字文件路径。/etc///etc/.conf
创建一个目录来保存套接字文件,并更改所有权,以便用户和组可以访问它。
sudo mkdir -p /var/spool/postfix/opendmarc
sudo chown opendmarc:opendmarc /var/spool/postfix/opendmarc -R
sudo chmod 750 /var/spool/postfix/opendmarc/ -R
sudo adduser postfix opendmarc
启用 DMARC。编辑 /etc// 文件,确保 被设置为 true。
OPENDMARC_ENABLED=true
然后重新启动。
sudo systemctl restart opendmarc
的相关配置启用 DMARC 功能: 在 中,你需要确保启用了 DMARC 功能。这通常是通过在主配置文件中添加以下行来完成:
sudo nano /etc/postfix/main.cf
## 如何下面设置了插件rspamd,没注意端口的设置 smtpd_milters
milter_default_action = accept
milter_protocol = 6
smtpd_milters = local:opendkim/opendkim.sock,local:opendmarc/opendmarc.sock
non_smtpd_milters = $smtpd_milters
请确保 启用了 协议,并与一个 DMARC 验证器通信。你可能需要调整端口号和 IP 地址,以匹配你系统上的实际设置。
保存并关闭文件。然后重新启动 以使更改生效。
sudo systemctl restart postfix
配置配置检测
使用 内置的配置语法检查来测试你的配置文件,如果没用发现语法错误,不会输出任何内容。
$ sudo postfix check
使用 来验证 是否正在监听 25 端口。
$ netstat -ant
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN
tcp6 0 0 :::25 :::* LISTEN
查看的监听情况:
sudo netstat -lnpt
## 显示中有以下信息表示正常
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 2278/master
查看端口的开放情况
sudo nmap 192.168.1.17
常规配置参数
#邮箱总大小限制,单位字节, 0为不限制
mailbox_size_limit = 0
#附件大小,下面是50M
message_size_limit = 52428800
#启动sasl 验证
smtpd_sasl_auth_enable = yes
退信模板
默认是有英文模板的,但如果改成中文的,当然需要自己配置一个模板。
sudo nano /etc/postfix/main.cf
这是的主要配置文件,在这个配置文件中添加一行内容,配置模板内容:
bounce_template_file = /etc/postfix/bounce.cf
根据上面的配置,建立一个模板内容,可以配置4种模板,分别为:
失败退信():投递失败。延时退信( ):如果发信时发生了临时性错误,系统会延时一定的时间再次尝试重发,直到在队列中的时间超过了me就从队形中删除了。成功退信():发信成功了,给发件人一封通知信。退信(ver-):对收件人验证不成功的退信
这里我主要配置一个失败的退信:
failure_template=<<EOF
Charset: utf-8,gb2312
From: =?utf-8?B?6YKu566x566h55CG5ZGY?=
Subject: =?utf-8?B?6YCA5L+h6YCa55+l?=
Postmaster-Subject:Postmaster Copy: Undelivered Mail
退信通知: 您好,很抱歉您发送的邮件被系统退回,相关信息如下
退信原因: 您投递的邮件地址不存在,所以您的邮件不能准确送达。
解决方案:1.请检查输入的地址是否有误;2.联系收件方确认邮箱是否存在过期、被禁用或冻结等情况。
EOF
这里的表示什么模板,模板内容在
———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,永久会员只需109元,全站资源免费下载 点击查看详情
站 长 微 信: nanadh666