如何设置Postfix直出因特网中继?

Postfix

1 前言

一个问题,一篇文章,一出故事。
笔者公司需要配置一台直接出Internet的邮件传输代理(MTA,即Mail Transfer Agent)中继(Relay),于是笔者便整理此文档。

2 最佳实践

2.1 环境配置

2.1.1 系统配置

HostName = postfix.cmdschool.org
OS = Oracle Linux 9.x x86_64
IP Addr = 192.168.0.25
Internet DNS = 8.8.8.8,8.8.4.4

HostName = postfixclient.cmdschool.org
OS = Oracle Linux 9.x x86_64
IP Addr = any
DNS = any

2.1.2 系统的基本配置

请参阅如下章节完成基本设置,

如何完成CentOS 7.x的基本服务?

2.2 中继服务器安装配置

2.2.1 安装软件包

dnf install -y postfix s-nail

启动服务并设置服务自启动,

systemctl start postfix.service
systemctl enable postfix.service

2.2.2 修改服务配置

cp /etc/postfix/main.cf /etc/postfix/main.cf.defautl
vim /etc/postfix/main.cf

修改如下基本配置,

myhostname = postfix.cmdschool.org
mydomain = cmdschool.org
myorigin = $mydomain
inet_interfaces = all
mynetworks = 0.0.0.0/0
relayhost =
smtpd_client_restrictions = check_client_access hash:/etc/postfix/access, reject

参数的作用如下,
– 参数“myhostname”声明postfix运行的主机名称
– 参数“mydomain”声明邮件服务器的域名
– 参数“myorigin”声明邮件服务器的组织域名
– 参数“inet_interfaces”声明发送邮件的网卡接口,范例指定所有
– 参数“mynetworks”声明信任的网段,范例指定所有
– 参数“relayhost”声明smtp邮件中继服务器(空表示直接发送到Internet)
– 参数“smtpd_client_restrictions”声明在访问控制列表“/etc/postfix/access”中声明的客户端可发送邮件,其他拒绝
配置修改后,你可以使用如下命令测试配置,

postfix check

重启使服务生效,

systemctl restart postfix.service

可以使用如下命令测试本机的邮件发送,

echo "This is a test message" | s-nail -s test will@cmdschool.org
echo "This is a test message" | s-nail -s test -r seradmin@cmdschool.org will@cmdschool.org

然后,你可以使用如下命令查看日志,

tail -f /var/log/maillog

2.2.3 配置访问控制

cat >> /etc/postfix/access << EOF
#Allow 10.0.0.0/8
10 OK

#Allow 172.16.0.0/12
172.16 OK
172.17 OK
172.18 OK
172.19 OK
172.2 OK
172.30 OK
172.31 OK

#Allow 192.168/16
192.168 OK

192.168.0.100 REJECT
EOF
postmap /etc/postfix/access

以上需根据实际情况配置允许非本机以外的主机发送邮件,
– 网段后面使用空格分隔后跟“OK”表示允许
– 网段后面使用空格分隔后跟“REJECT”表示拒绝
– 由“smtpd_client_restrictions”中定义访问控制默认值是拒绝,即没有匹配到“OK”条目就会被默认拒绝
– 优先级别“REJECT”高于“OK”条目,即只要有显式声明“REJECT”条目则必然会被拒绝,与顺序无关。
然后你需要使用如下命令重载服务使配置生效,

systemctl reload postfix.service

2.2.4 修改服务配置

firewall-cmd --permanent --add-service smtp
firewall-cmd --reload
firewall-cmd --list-all

2.3 邮件空客户端安装配置

2.3.1 安装软件包

dnf install -y postfix s-nail

启动服务并设置服务自启动,

systemctl start postfix.service
systemctl enable postfix.service

2.3.2 修改服务配置

cp /etc/postfix/main.cf /etc/postfix/main.cf.defautl
vim /etc/postfix/main.cf

修改如下基本配置,

myhostname = postfixclient.cmdschool.org
mydomain = cmdschool.org
myorigin = $mydomain
inet_interfaces = localhost
mydestination =
relayhost = postfix.cmdschool.org
local_transport = error:local mail delivery is disabled

参数的作用如下,
– 参数“myhostname”声明postfix运行的主机名称
– 参数“mydomain”声明邮件服务器的域名
– 参数“myorigin”声明邮件服务器的组织域名
– 参数“inet_interfaces”声明发送邮件的网卡接口,范例指定回环接口
– 参数“relayhost”声明smtp邮件中继服务器(范例中smtp根据IP地址验证,没有开启用户名和密码验证)
– 参数“mydestination”声明本机邮件的目标域名(即本地接收邮件域,如“cmdschool.org”),范例为空即不接收
– 参数“local_transport”声明本地邮件分发,范例“error:local mail delivery is disabled”为禁用本地分发
中继服务器“postfix.cmdschool.org”必须配置DNS解析,否则你需要替换该服务器的IP地址“192.168.0.25”,然后你可以使用如下命令测试配置,

postfix check

重启使服务生效,

systemctl restart postfix.service

2.3.3 测试邮件发送

echo "test" | s-nail -s "test mail 001" -r seradmin@cmdschool.org will@cmdschool.org

参数的作用如下,
– 参数值“test”声明发送的邮件内容
– 参数“s”声明发送的邮件主题
– 参数“r”声明发件人的邮箱地址
– 参数值“will@cmdschool.org”声明邮件的目标地址
另外,可以配合cat使用,

cat << EOF | s-nail -s "test mail 001" -r seradmin@cmdschool.org will@cmdschool.org
test body start
test body end
EOF

如果shell的函数环境,你可能需要这样书写,

cat <<-EOF | s-nail -s "test mail 001" -r seradmin@cmdschool.org will@cmdschool.org
test body start
test body end
EOF

另外,也支持从一个文件导入邮件内容,

echo "test" > message.txt
s-nail -s "test mail 001" -r seradmin@cmdschool.org will@cmdschool.org < message.txt

如果需要发送附件,请参阅如下范例,

echo "test" | s-nail -s "test mail 001" -a /etc/redhat-release -r seradmin@cmdschool.org will@cmdschool.org

参阅文档
=================
https://www.lunanode.com/guides/postfix_smtp_secure
https://www.postfix.org/TLS_README.html
https://www.postfix.org/SMTPD_ACCESS_README.html

没有评论

发表回复

Postfix
如何指定PostFix的默认下一跳地址?

1 前言 一个问题,一篇文章,一出故事。 笔者想要指定邮件的默认下一跳地址,以便邮件可以被送到特定的 …

Postfix
如何实现监视PostFix的延迟邮件警告?

1 前言 一个问题,一篇文章,一出故事。 笔者生产中有一套PostFix集群,最近经历了一次邮件延迟 …

Postfix
如何优化PostFix?

1 前言 一个问题,一篇文章,一出故事。 笔者最近生产服务器遇到队列问题,因此需要通过优化PostF …