从零实现邮件中继服务

背景

在当前现场环境中,我们面临着一个重要的问题。我们的系统部署在一个内网环境中,邮件告警模块需要连接公网的邮件服务器以便发送邮件来及时通知我们关键事件和紧急情况,而集群与公共互联网络隔离,导致邮件无法发送。为了解决邮件无法发送的问题,我们需要一个可以连接公网环境的节点,通过该节点将邮件转发到对应的邮件服务器上。

目的

如何在内网集群内,将邮件通过可以连接到公网的机器,然后发送到对应的邮件服务器上,实现邮件告警的目的。
在这里插入图片描述

验证准备

前提

准备一个不通公网的机器,一个可以连接公网的机器
注意:当前使用的环境为centos8,postfix版本为3.x,其他版本或有不同

前置过程

安装2个虚拟机节点,即192.168.96.130和192.168.96.187
在这里插入图片描述

修改每个节点的hostname
在这里插入图片描述
在这里插入图片描述

网络约束

在96.130上的网络配置中将网关移除,然后重启网络服务

在这里插入图片描述
在这里插入图片描述

使得96.130无法访问公网,但可以连接局域网
在这里插入图片描述

节点信息

按照以上步骤完成后,得到一个内网和一个可以通公网的环境,且两者互通,并随时可以根据快照恢复至最初。

节点IP外网访问权限
fs_96_130192.168.96.130×
fs_96_187192.168.96.187

账号信息

选项
发信人账号xxx
发信人授权码xxx
邮件服务器smtp.qq.com
邮件服务器端口465
收件人地址xxx

具体验证过程

1、在96.187(跳板机)上安装postfix软件包,以实现邮件中继功能

在这里插入图片描述

2、alternatives --config mta命令用于查看和设置当前系统上的邮箱服务,此时选择postfix作为邮箱服务。
在这里插入图片描述

3、配置96.187(跳板机),使其在接收到96.130(内网机)的邮件后直接发送出去。
进入到postfix配置目录
在这里插入图片描述

修改主配置文件main.cf,并在其中添加如下内容

注释smtp_tls_security_level = may这一行,即736行
在这里插入图片描述

注释inet_interfaces = localhost这一行,即135行

在这里插入图片描述

然后添加下面的内容

smtp_sasl_auth_enable = yes
# 设置qq发件邮箱的发信人和授权码
smtp_sasl_password_maps = static:发信人账户:发信人授权码
smtp_sasl_security_options = noanonymous
smtp_tls_wrappermode = yes	# 低版本没有该选项,不会报错,会显示unused_paramater,注释即可
smtp_tls_security_level = encrypt
header_size_limit = 4096000

# 设置发件邮箱的邮件服务器地址和端口号
relayhost = [smtp.qq.com]:587
# 设置允许接收来自xx网络的邮件
mynetworks=192.168.96.0/24

# 指定邮件服务器监听的网络接口
inet_interfaces = all

然后保存退出

5、重启postfix服务
在这里插入图片描述

转发测试

1、从96.187(跳板机)上下载golang相关包并传到96.130(内网机)上
在这里插入图片描述
在96.130(内网机)上安装相关golang包
在这里插入图片描述
在96.130(内网机)上编写发送邮件的go代码进行测试

package main
 
import (
    "crypto/tls"
    "fmt"
    "log"
    "net/smtp"
)
 
func main() {
    from := "731413853@qq.com"
    to := "lirul@snapmail.cc"
    smtpServer := "192.168.96.187"
    smtpPort := 25
 
    // 邮件内容
    subject := "Hello"
    body := fmt.Sprintf("hello %s, This is the test mail", from)
 
    // 构建邮件内容,包括发件人、收件人、主题和正文
    message := []byte(fmt.Sprintf("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n%s", from, to, subject, body))
 
    // 连接到SMTP服务器
    addr := fmt.Sprintf("%s:%d", smtpServer, smtpPort)
    client, err := smtp.Dial(addr)
    if err != nil {
        log.Fatal("connect mail server failed: ", err)
    }
    defer client.Close()
 
    // 配置TLS并跳过证书验证
    tlsConfig := &tls.Config{InsecureSkipVerify: true}
    if err = client.StartTLS(tlsConfig); err != nil {
        log.Fatal("set tls config failed: ", err)
    }
    // 设置发件人
    if err = client.Mail(from); err != nil {
        log.Fatal("set mail sender failed: ", err)
    }
 
    // 设置收件人
    if err = client.Rcpt(to); err != nil {
        log.Fatal("set mail receiver failed: ", err)
    }
 
    // 发送邮件内容
    w, Er := client.Data()
    if Er != nil {
        log.Fatal("set mail data failed:", Er)
    }
 
    _, err = w.Write(message)
    if err != nil {
        log.Fatal("set mail content failed:", err)
    }
 
    if err = w.Close(); err != nil {
        log.Fatal("set mail writer close failed:", err)
    }
 
    if err = client.Quit(); err != nil {
        log.Fatal("set client quit failed:", err)
    }
    log.Println("send success")
}

在96.130(内网机)上执行代码
在这里插入图片描述
查看96.187(跳板机)的邮件中继服务postfix是否收到邮件并转发
在这里插入图片描述
查看邮箱
在这里插入图片描述

相关问题

1、出现这种情况时
在这里插入图片描述
检查sasl相关包是否已经安装
在这里插入图片描述
2、邮件服务状态显示有类似这种连接ipv6失败的
在这里插入图片描述
可以在配置里更改为只使用ipv4
在这里插入图片描述

补充

由于写时没遇到该问题,后续验证截图略有不同:96.54(内网机),96.60(跳板机)

以上在使用代码时发送可以,若要使用命令行直接从96.54(内网机)发送到96.60(跳板机),则需要在发送和接收是分别处理。

96.54(内网机)发送时需要指定连接的smtp地址

例如:
在这里插入图片描述
由于qq邮箱需要邮件中的From和上面配置的发件人相应,所以有两个解决办法:

法一:发送时处理,在发件时指定From,此时跳板机不用单独处理,例如
在这里插入图片描述
缺陷是如果改了跳板机的发件人则发不出去,因为发件人和From不同,尤其是两个公司信息不同步时错过一些重要邮件,不推荐

法二:在跳板机处理(推荐),以后只需更改跳板机的配置即可

使96.60(跳板机)中继邮件时,统一重写为发件人邮箱,使其保持一致,增加两个配置

sender_canonical_maps = regexp:/etc/postfix/sender_canonical
header_checks = regexp:/etc/postfix/header_checks

在这里插入图片描述
创建 /etc/postfix/sender_canonical 文件,用于重写发件人地址
在这里插入图片描述

/^.*$/   731413853@qq.com  # 替换对应邮箱

编辑 /etc/postfix/header_checks 文件,用于更改邮件头中的 “From” 地址。
在这里插入图片描述

/^From:(.*)$/ REPLACE From: 731413853@qq.com # 替换对应邮箱

重启服务
在这里插入图片描述
然后96.54(内网机)发送时,指定或不指定From都会被重写为固定的发件人
在这里插入图片描述
查看邮箱
在这里插入图片描述

查看邮件队列

mailq

清空队列

# 根据mailq看到的queue id,进行清理
postsuper -d queue id
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DNS中继服务器是一种用于增强DNS系统性能和可靠性的网络设备。北邮(即北京邮电大学)作为一个大型网络通信学校,可能需要大量且高效的DNS解析服务来支持校园内的网络通信和学术研究。 首先,北邮可以设置一个或多个本地DNS服务器来处理校园内所有设备的DNS查询请求。本地DNS服务器可以维护一个本地DNS缓存,以提高查询速度并减轻上游DNS服务器的负担。 其次,针对北邮无法直接解析的DNS查询,可以设置一个或多个远程DNS服务器作为中继节点。北邮可以与其他合作伙伴、同行院校或DNS服务提供商协商建立互联互通机制,使得无法在本地解析的DNS查询可以被转发中继服务器。 此外,为了进一步增强北邮DNS系统的性能和可靠性,可以使用DNS负载均衡技术。通过在DNS系统中引入负载均衡设备,可以智能分配DNS查询请求到多个DNS服务器上,从而提高整体的解析速度和吞吐量。 最后,为了确保北邮DNS系统的安全性,可以采取一些安全保护措施,例如利用DNS防火墙、访问控制列表等手段来限制域名的解析范围,防止恶意攻击或非法使用。同时,定期更新DNS软件和系统补丁,保持系统与最新版本的DNS协议保持一致。 通过以上措施的综合运用,北邮可以实现一个高效可靠的DNS中继服务器,为校内用户提供快速、稳定的DNS解析服务,支持校园内的互联网通信和学术研究。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值