完成 E-MAIL 服务器部署

1.在此服务器上安装配置邮件服务,具体要求为:

  • (1)创建三个邮箱用户 mail4,mail5,mail6,用户密码为789,不允许本地登录;
  • (2)邮件服务器的域名后缀为 netskills.net,邮件服务器要在所有IP地址上进行侦听;
  • (3)为拒绝垃圾邮件,设置邮件服务器的黑名单,拒绝接收用户 mail5 的邮件;

2.创建自签名 SSL 证书,配置邮件服务器的mail 连接。具体要求为:

  • (1)密钥路径为 /etc/pki/tls/certs/server.key;
  • (2)证书路径为 /etc/pki/tls/certs/server.crt;
  • (3)设置仅支持 smtps 和 pop3s 协议连接;

这其实是一道考题!!!由于在此之前,俺对于【邮件服务】相关知识没有一丝了解;以至于此题真是折磨了俺一天!所以此文有俺发泄而作的嫌疑🤓🤓。

DNS 解析大法

部署邮件服务前,需要将 DNS 服务配置完毕;为电子邮件系统提供域名解析。

配置服务器主机名称,需要保证服务器主机名称与发信域名保持一致。

[root@localhost ~]# hostnamectl set-hostname mail.netskills.net

关闭防火墙及 SElinux

[root@mail ~]# systemctl stop firewalld
[root@mail ~]# systemctl disable firewalld
[root@mail ~]# setenforce 0
[root@mail ~]# getenforce 
Permissive

安装 bind 包,修改主配置文件。

[root@mail ~]# yum install bind
[root@mail ~]# vim /etc/named.conf
options {
        listen-on port 53 { any; };
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { any; };
……………………省略……………………

修改区域配置文件和数据配置(正向/反向)文件。

[root@mail ~]# vim /etc/named.rfc1912.zones
zone "netskills.net" IN {
    type master;
    file "netskills.net.zone";
    allow-update { none; };
};
……………………省略……………………
zone "10.168.192.in-addr.arpa" IN {
    type master;
    file "reverse.netskills.net";
    allow-update { none; };
};
……………………省略……………………
[root@mail ~]# cp -p /var/named/named.localhost /var/named/netskills.net.zone
[root@mail ~]# vim /var/named/netskills.net.zone
$TTL 1D
@    IN SOA    netskills.net. rname.invalid. (
                    0    ; serial
                    1D    ; refresh
                    1H    ; retry
                    1W    ; expire
                    3H )    ; minimum
    NS    ns.netskills.net.
ns    A    192.168.10.101
@    MX 10    mail.netskills.net.
mail    A    192.168.10.101
[root@mail ~]# cp -p /var/named/named.loopback /var/named/reverse.netskills.net
[root@mail ~]# vim /var/named/reverse.netskills.net
$TTL 1D
@    IN SOA    netskills.net. rname.invalid. (
                    0    ; serial
                    1D    ; refresh
                    1H    ; retry
                    1W    ; expire
                    3H )    ; minimum
    NS    mail.netskills.net.
    A    127.0.0.1

101    PTR    mail.netskills.net.

重启服务并为本地设置 DNS 服务器。

[root@mail ~]# systemctl restart named
[root@mail ~]# systemctl enable named
[root@mail ~]# cat /etc/resolv.conf 
nameserver 192.168.10.101

验证:

[root@mail ~]# nslookup 
> mail.netskills.net
Server:        192.168.10.101
Address:    192.168.10.101#53
Name:    mail.netskills.net
Address: 192.168.10.101
> set q=mx
> 192.168.10.101
Server:        192.168.10.101
Address:    192.168.10.101#53
101.10.168.192.in-addr.arpa    name = mail.netskills.net.

Email 服务

有感而废话

题目要求安装 postfix,而非 sendmail;这或许是一个好消息(但也好不到哪去),后者更加的复杂!!!

但是,其实都是比较复杂的;俺实在是不能理解这样复杂的设计意义何在。就此次邮件服务为栗,分布在系统各个地方的配置文件、配置文件语法不尽相同有所差异、配置文件是真的多呀、官方文档晦涩难懂!!!其早期软件设计时真的并未考虑非专业者的使用啊。再次想起一名老师说的,你以为你每天都在学习,其实大部分时间你不过在了解工具的使用罢了;协议原理你可能早已【滚瓜难熟】,然后再来使用其设计复杂的相应工具,实在是雪上加霜

如此糟糕设计,如此复杂使用方法;竟然还有好一些人以使用这难以恭候的工具为荣,觉得这很酷。是啊,没人看得懂的【黑框框】【命令行】,可真是酷啊。呵呵,等你开机黑屏进不来系统,连你自己都看不懂的时候,那时候绝对更酷!!!当系统崩了时,你需要在网上查阅大量的文档(英文),这是比较痛苦的;当然有人觉得这是一种积极的【折腾精神】,但其实这可能只是消磨你的意志,浪费你的时间。(俺是过来人😵😵)

其实就俺个人作为一名 Linux 爱好者&&年轻小司机(俺在周围人中算是名 Linux 老司机;好一些同学可能因为俺,将自己主力机又 Windows 换成 Linux;虽然并卵😆😆)的看法来说,我们大可不必对一些科学技术(政治亦然)抱有一种看似接近迷信的态度;相反,持【怀/质疑态度】、【批判性思维】去看待问题可能更加滴 Awesome!!!

不用盲目地崇拜任何权威,因为你总能找到相反的权威。

罗素思想十诫

【迷信】、【个人崇拜】(比如大多数同学对于 Linux 创始人 Linus 的个人崇拜)这对于俺们理工科同学是大忌,是严重不符合逻辑的。

额,其实从历史的角度来看待这些问题,这一切或许都只是【顺势而为】。在当时,有比 Linux 优秀得多的操作系统,但却是商业化产品;Linux 的伟大之处在于其开放性。其在当时设计的并不完美,由于其开放性进而发展至今。

再举个栗子,就好比如说如今的各种 TCP/IP 协议【ARP、HTTP、SMTP……】其实在当时那个年代并不是最好的,可它们这些并不是那么完美的协议从同类协议中脱颖而出,发展至今天。究其原因,可能仅仅只是此协议在当时比较【简单上手】;当然还有其他原因(如因政治原因而产生的密码学中的 DES 算法)。这个栗子比较硬核,但希望你能懂俺的意思;

其实聊了这么多。俺排除个人情感(并非此次邮件服务难到了俺)原因仅想说明的与下面所说的一样,Linux、Unix 及其一些自由软件有时候【并非】那么好用。它们给人的感觉就好像是:你用户不会使用不是因为软件设计者的原因,而是你用户人太蠢了;这给俺一种似曾相识的感觉,让人讨厌的【独裁者专制】

Linux 和 Unix 里面包含了一些非常糟糕的设计。不要被 Unix 的教条主义者吓倒。学不会有些东西很多时候不是你的错,而是 Linux 的错,是”Unix 思想“的错。不要浪费时间去学习太多工具的用法,钻研稀奇古怪的命令行。那些貌似难的,复杂的东西,特别要小心分析。

来源:王垠 [谈 Linux,Windows 和 Mac]

前段时间,这篇文章给俺感觉不错,让人重新认识 Linux。有兴趣可以去看完,墙推!!!

邮件传输软件

不好意思啰嗦滴有点多!接下来进入正题……

安装 Postfix,其是一种电子邮件服务器;为改良 sendmail 而产生。

[root@mail ~]# yum install postfix

Postfix 可以调用本地系统的账户和密码,因此在本地系统创建常规账户即可。

[root@mail ~]# useradd mail4
[root@mail ~]# useradd mail5
[root@mail ~]# useradd mail6
[root@mail ~]# echo "789" | passwd --stdin mail4
[root@mail ~]# echo "789" | passwd --stdin mail5
[root@mail ~]# echo "789" | passwd --stdin mail6
# 这种方式给用户设置密码并不推荐,不太安全
[root@mail ~]# usermod -s /sbin/nologin mail4
[root@mail ~]# usermod -s /sbin/nologin mail5
[root@mail ~]# usermod -s /sbin/nologin mail6

修改并完善主配置文件。

[root@mail ~] # vim /etc/postfix/main.cf
myhostname = mail.netskills.net
# mydomain 变量其实就是邮箱地址后缀
mydomain = netskills.net
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, $mydomain
mynetworks = 192.168.10.0/24, 127.0.0.0/8
home_mailbox = Maildir/
[root@mail ~]# systemctl restart postfix
[root@mail ~]# systemctl enable postfix

设置邮件服务黑名单策略,拒收来自 mail5 用户的邮件。

[root@mail ~]# echo "smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/sender_access" >> /etc/postfix/main.cf
[root@mail ~]# echo "mail5@netskills.net REJECT" >> /etc/postfix/sender_access
[root@mail ~]# cat /etc/postfix/sender_access
mail5@netskills.net    REJECT
[root@mail ~]# postmap /etc/postfix/sender_access
[root@mail ~]# systemctl restart postfix.service

验证:

[root@mail ~]# yum install telnet
[root@mail ~]# telnet localhost smtp
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 mail.netskills.net ESMTP Postfix
helo localhost
250 mail.netskills.net
MAIL FROM: mail5@netskills.net
250 2.1.0 Ok
RCPT TO: mail4@netskills.net
554 5.7.1 <mail5@netskills.net>: Sender address rejected: Access denied

创建自签名 SSL 证书。

文件后缀:
.key:一般指私钥文件。

.csr:证书请求文件。

.crt:证书文件,certificate 的缩写。

关于【证书申请文件】(CSR);首先需要先创建一个【私钥】(key),根据私钥生成 CSR。CSR 的主要内容是密钥对中的公钥,以及一些额外的信息 —— 最后这些内容都将在签名时插入到证书里。

创建一个【秘/私钥】,通过回显可以看出还是调用 openssl 命令生成的私钥。

[root@mail ~]# cd /etc/pki/tls/certs/
[root@mail certs]# make server.key
umask 77 ; \
/usr/bin/openssl genrsa -aes128 2048 > server.key
Generating RSA private key, 2048 bit long modulus
.........................+++
.+++
e is 65537 (0x10001)
Enter pass phrase:               # dcncloud
Verifying - Enter pass phrase:   # dcncloud

# 从私钥中删除密码
[root@mail certs]# openssl rsa -in server.key -out server.key 
Enter pass phrase for server.key: # dcncloud
writing RSA key

根据私钥 server.key 生成证书申请文件 server.csr

[root@mail certs]# make server.csr
umask 77 ; \
/usr/bin/openssl req -utf8 -new -key server.key -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Shanghai
Locality Name (eg, city) [Default City]:W
Organization Name (eg, company) [Default Company Ltd]:DCN
Organizational Unit Name (eg, section) []:netskills
Common Name (eg, your name or your server's hostname) []:netskills.net
Email Address []:root@netskills.net
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:      # 回车
An optional company name []:  # 回车

使用私钥 server.key 对证书申请进行签名从而生成证书 server.crt

[root@mail certs]# openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 3650
Signature ok
subject=/C=CN/ST=Shanghai/L=W/O=DCN/OU=netskills/CN=netskills.net/emailAddress=root@netskills.net
Getting Private key
[root@mail certs]# ls
ca-bundle.crt        make-dummy-cert  renew-dummy-cert  server.csr
ca-bundle.trust.crt  Makefile         server.crt        server.key

关于 SMTPS

SMTPS(Simple Mail Transfer Protocol Secure)是一种使用传输层安全性保护 SMTP 的方法。它旨在提供通信伙伴的身份验证,以及数据完整性机密性

SMTPS 不是专有协议,也不是 SMTP 的扩展。通过将 SMTP 包装在 TLS 中,这是一种在传输层保护 SMTP 的方法。从概念上讲,它类似于 HTTPS ;在 TLS 中包装 HTTP 的方式。

参考来源:https://en.wikipedia.org/wiki/SMTPS

为什么启用 SMTPS ? ? ?

用作提交协议的 SMTPS 令人困惑,让我解释,最初于1997年,IANA(互联网号码分配机构)为 SMTPS 分配了465端口,旨在用于加密一个 SMTP 服务器与另一个 SMTP 服务器之间的通信,如 mail.google.com 和 mail.yahoo.com,后来,STARTTLS 出现了,它允许 SMTP 服务器通过现有的 SMTP 端口25安全地相互通信,因此不再需要将465端口专用于安全 SMTP,SMTPS 端口已被撤销,但是,某些邮件客户端(如Microsoft Outlook)错误地将 SMTPS 解释为提交,并使用465端口进行电子邮件提交,直到今天仍然如此。

参考来源:https://ywnz.com/linuxyffq/4817.html。

哦,特么的!原来这是个已弃用的协议呀???无语🤐🤐

编辑 postfix 主配置文件,添加 SMTP 认证相关的 SASL 功能参数以及 SSL 证书路径。

[root@mail ~]# vim /etc/postfix/main.cf
# SMTP-Auth
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname

# SSL
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/pki/tls/certs/server.crt
smtpd_tls_key_file = /etc/pki/tls/certs/server.key

编辑 postfix 的 master 进程配置文件,取消相关注释;使其对 SMTPS 的支持。

[root@mail ~]# vim /etc/postfix/master.cf
submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission

smtps     inet  n       -       n       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
[root@mail ~]# systemctl restart postfix

可以看出 SMTPS 默认端口465是帧听状态滴。

[root@mail ~]# netstat -pantu | grep master
tcp    0    0 0.0.0.0:25    0.0.0.0:*    LISTEN      12816/master 
tcp    0    0 0.0.0.0:587   0.0.0.0:*    LISTEN      12816/master 
tcp    0    0 0.0.0.0:465   0.0.0.0:*    LISTEN      12816/master 
tcp6   0    0 :::25         :::*         LISTEN      12816/master 
tcp6   0    0 :::587        :::*         LISTEN      12816/master 
tcp6   0    0 :::465        :::*         LISTEN      12816/master

关于 POP3S

POP3S (POP3-over-SSL/TLS) 是指用于将电子邮件传输协议 POP3 扩展为 SSL / TLS 加密的网络协议。通常,POP3S 默认在端口 995 上使用 TCP。

POP3S 默认端口 995;连接方式为 SSL / TLS, STARTTLS 不可用。认证方式为普通密码。

Why POP3S ? ? ?

虽然 POP3 服务器要求客户端使用用户名和密码进行身份验证,但由于 POP3 是一种未加密的协议;用户名密码都是【明文传输】滴!

POP3S is POP3 over SSL/TLS。它为邮件协议提供了一个【加密连接】,通过该连接可以传输用户名和密码以进行身份验证。

开源 POP3 服务器

安装 dovecot(一款开源 IMAP、POP3 服务器),编辑其配置文件。

[root@mail ~]# yum install dovecot
[root@mail ~]# vim /etc/dovecot/dovecot.conf
# 由题要求,仅配置 pop3 协议支持
protocols = pop3

listen = *

编辑认证配置文件。

[root@mail ~]# vim /etc/dovecot/conf.d/10-auth.conf
# 允许明文认证
disable_plaintext_auth = no

邮件的相关配置。

[root@mail ~]# vim /etc/dovecot/conf.d/10-mail.conf
# 用户邮件存放的目录
mail_location = maildir:~/Maildir

认证相关配置。

[root@mail ~]# vim /etc/dovecot/conf.d/10-master.conf
# pop3s auth
service pop3-login {
  inet_listener pop3 {
    port = 0
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}

# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
  mode = 0666
  user = postfix
  group = postfix
}

证书相关配置。

[root@mail ~]# vim /etc/dovecot/conf.d/10-ssl.conf
ssl = yes

ssl_cert = </etc/pki/tls/certs/server.crt
ssl_key = </etc/pki/tls/certs/server.key

查看端口,可以看出仅帧听了默认端口为995的 POP3S。

[root@mail ~]# netstat -pantu | grep dovecot
tcp   0   0 0.0.0.0:995    0.0.0.0:*    LISTEN    13300/dovecot

紧张刺激的验证环节

本次验证使用 Windows 上的一款 Thundbird 邮件客户端。

当网络及 DNS 等一切设置正常后;打开客户端软件会自动弹出这个【添加安全例外】,因为证书是自签名,并不被客户端信任。请疯狂点击 确认安全例外

POP3S

然后开始登录邮箱用户。如下图所示,POP3S(POP3-over-SSL/TLS) 默认端口为995,SMTPS(SMTP+TLS) 默认端口为465;验证方式为普通密码。直接点击完成,不必重新测试。

Login

如下,当用户发送邮件时可能弹出以下界面;同上,自签名证书不被信任。

SMTPS

测试发送邮件。

Send

成功接受邮件!!!

Received

  • //
  • //

有感而废话者