如何在 Debian Wheezy 上使用 Postfix 安装和配置 DKIM

embedded/2024/9/20 1:29:43/ 标签: debian, 运维

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

介绍

对于大多数邮件服务器管理员来说,被错误地标记为垃圾邮件发送者的沮丧并不陌生。除了排除服务器被入侵的可能性外,虚假标记通常是由以下原因之一引起的:

  • 服务器是一个开放的邮件中继
  • 发件人或服务器的 IP 地址被列入黑名单
  • 服务器没有完全合格的域名(FQDN)和 PTR 记录
  • 缺少 Sender Policy Framework(SPF)DNS 记录或配置错误
  • 缺少 DomainKeys Identified Mail(DKIM)实现或未正确设置

这些是大多数专有和开源垃圾邮件过滤器(包括 SpamAssassin)检查的一些基本属性。通过这些测试对于配置良好的邮件服务器来说非常重要。

本教程将重点介绍安装和配置 OpenDKIM:DKIM 发件人身份验证系统的开源实现。

假定读者知道如何通过 SSH 访问服务器,已经安装和配置了 Postfix 和 Dovecot(教程),主机名和 FQDN 已设置(教程,教程),并且 SPF 记录已经就位(教程)。

关于 DKIM

DKIM 是一种互联网标准,它使个人或组织能够将域名与电子邮件消息关联起来。实际上,这相当于一种声明对消息负责的方法。在其核心,DKIM 由非对称加密驱动。发件人的邮件传输代理(MTA)使用私钥对每个发出的消息进行签名。收件人从发件人的 DNS 记录中检索公钥,并验证自消息签名以来消息正文和一些标头字段是否未被更改。

安装 OpenDKIM

在开始安装之前,建议进行系统更新:

sudo apt-get update
sudo apt-get dist-upgrade

安装 OpenDKIM 及其依赖项:

sudo apt-get install opendkim opendkim-tools

附加软件包将列在依赖项中,输入 yes 并按 Enter 继续。

配置 OpenDKIM

为了配置 OpenDKIM,必须创建并编辑一些文件。

Nano 将被用作编辑器,因为它默认安装在 DigitalOcean droplets 上,并且操作简单:

  • 使用箭头键进行导航
  • 不保存更改退出:按 CTRL + X,然后按 N
  • 保存更改并退出:按 CTRL + X,然后按 Y,最后按 Enter

重要提示:在所有命令和配置文件中,将每个示例中的 example.com 替换为您自己的域名。编辑后不要忘记保存文件。

让我们从主配置文件开始:

sudo nano /etc/opendkim.conf

将以下行追加到 conf 文件的末尾(下面解释了每个参数)。可选择自定义端口号作为 Socket。确保它没有被其他应用程序使用。

AutoRestart             Yes
AutoRestartRate         10/1h
UMask                   002
Syslog                  yes
SyslogSuccess           Yes
LogWhy                  YesCanonicalization        relaxed/simpleExternalIgnoreList      refile:/etc/opendkim/TrustedHosts
InternalHosts           refile:/etc/opendkim/TrustedHosts
KeyTable                refile:/etc/opendkim/KeyTable
SigningTable            refile:/etc/opendkim/SigningTableMode                    sv
PidFile                 /var/run/opendkim/opendkim.pid
SignatureAlgorithm      rsa-sha256UserID                  opendkim:opendkimSocket                  inet:12301@localhost
  • AutoRestart:在失败时自动重新启动过滤器
  • AutoRestartRate:指定过滤器的最大重新启动速率,如果重新启动速度超过此速率,过滤器将终止;10/1h - 最多允许每小时重新启动 10 次
  • UMask:为 UserID 定义的用户组赋予所有访问权限,并允许其他用户读取和执行文件,这将允许创建和修改 Pid 文件
  • SyslogSyslogSuccessLogWhy:这些参数通过调用 syslog 启用详细日志记录
  • Canonicalization:定义消息签名时使用的规范化方法,simple 方法几乎不允许修改,而 relaxed 方法容忍轻微更改,如空格替换;relaxed/simple - 消息标头将使用 relaxed 算法处理,正文将使用 simple 算法处理
  • ExternalIgnoreList:指定可以作为签名域之一发送邮件的外部主机,无需凭据
  • InternalHosts:定义不应验证但应签名的内部主机列表
  • KeyTable:将密钥名称映射到签名密钥
  • SigningTable:根据 From: 标头字段中找到的地址列出要应用于消息的签名
  • Mode:声明操作模式;在本例中,milter 作为签名者(s)和验证者(v
  • PidFile:包含进程标识号的 Pid 文件路径
  • SignatureAlgorithm:创建签名时选择要使用的签名算法
  • UserID:opendkim 进程以此用户和组运行
  • Socket:milter 将在此处指定的套接字上监听,Postfix 将通过此套接字向 opendkim 发送消息进行签名和验证;12301@localhost 定义了在 localhost 上监听的 TCP 套接字,端口为 12301

此简单配置旨在允许一个或多个域的消息签名。要了解其他选项,请参阅此处。

连接 milter 到 Postfix:

sudo nano /etc/default/opendkim

添加以下行,仅在使用自定义端口时编辑端口号:

SOCKET="inet:12301@localhost"

配置 postfix 使用此 milter:

sudo nano /etc/postfix/main.cf

确保以下两行存在于 Postfix 配置文件中,并且没有被注释掉:

milter_protocol = 2
milter_default_action = accept

很可能 Postfix 已经使用了过滤器(如 SpamAssasin、Clamav 等);如果以下参数已存在,只需将 opendkim milter 追加到它们(多个 milter 用逗号分隔),端口号应与 opendkim.conf 中的相同:

smtpd_milters = unix:/spamass/spamass.sock, inet:localhost:12301
non_smtpd_milters = unix:/spamass/spamass.sock, inet:localhost:12301

如果参数缺失,按以下方式定义它们:

smtpd_milters = inet:localhost:12301
non_smtpd_milters = inet:localhost:12301

创建一个将保存受信任主机、密钥表、签名表和加密密钥的目录结构:

sudo mkdir /etc/opendkim
sudo mkdir /etc/opendkim/keys

指定受信任主机:

sudo nano /etc/opendkim/TrustedHosts

我们将使用此文件来定义 ExternalIgnoreListInternalHosts,来自这些主机、域和 IP 地址的消息将受信任并签名。

由于我们的主配置文件将 TrustedHosts 声明为正则表达式文件(refile),我们可以使用通配符模式,*.example.com 表示来自 example.com 的子域的消息也将受信任,而不仅仅是从根域发送的消息。

自定义并添加以下行到新创建的文件。可以指定多个域,不要编辑前三行:

127.0.0.1
localhost
192.168.0.1/24*.example.com#*.example.net
#*.example.org

创建一个密钥表:

sudo nano /etc/opendkim/KeyTable

密钥表包含每个选择器/域对及其私钥路径。任何字母数字字符串都可以用作选择器,在此示例中使用了 mail,并且不需要更改它。

mail._domainkey.example.com example.com:mail:/etc/opendkim/keys/example.com/mail.private#mail._domainkey.example.net example.net:mail:/etc/opendkim/keys/example.net/mail.private
#mail._domainkey.example.org example.org:mail:/etc/opendkim/keys/example.org/mail.private

创建一个签名表:

sudo nano /etc/opendkim/SigningTable

此文件用于声明域/电子邮件地址及其选择器。

*@example.com mail._domainkey.example.com#*@example.net mail._domainkey.example.net
#*@example.org mail._domainkey.example.org

生成公钥和私钥

切换到密钥目录:

cd /etc/opendkim/keys

为该域创建一个单独的文件夹来保存密钥:

sudo mkdir example.com
cd example.com

生成密钥:

sudo opendkim-genkey -s mail -d example.com

-s 指定选择器,-d 指定域,该命令将创建两个文件,mail.private 是私钥,mail.txt 包含公钥。

将私钥的所有者更改为 opendkim

sudo chown opendkim:opendkim mail.private

将公钥添加到域的 DNS 记录

打开 mail.txt

sudo nano -$ mail.txt

公钥在 p 参数下定义。请不要使用下面的示例密钥,这只是一个示例,不会在您的服务器上起作用。

mail._domainkey IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5N3lnvvrYgPCRSoqn+awTpE+iGYcKBPpo8HHbcFfCIIV10Hwo4PhCoGZSaKVHOjDm4yefKXhQjM7iKzEPuBatE7O47hAx1CJpNuIdLxhILSbEmbMxJrJAG0HZVn8z6EAoOHZNaPHmK2h4UUrjOG8zA5BHfzJf7tGwI+K619fFUwIDAQAB" ; ----- DKIM key mail for example.com

复制该密钥并向您的域的 DNS 条目添加一个 TXT 记录:

  • 名称: mail._domainkey.example.com.
  • 文本: “v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5N3lnvvrYgPCRSoqn+awTpE+iGYcKBPpo8HHbcFfCIIV10Hwo4PhCoGZSaKVHOjDm4yefKXhQjM7iKzEPuBatE7O47hAx1CJpNuIdLxhILSbEmbMxJrJAG0HZVn8z6EAoOHZNaPHmK2h4UUrjOG8zA5BHfzJf7tGwI+K619fFUwIDAQAB”

请注意,DNS 更改可能需要几个小时才能传播。

重新启动 Postfix 和 OpenDKIM:

sudo service postfix restart
sudo service opendkim restart

恭喜!您已成功为邮件服务器配置了 DKIM!

可以通过向 check-auth@verifier.port25.com 发送一封空邮件来测试配置,并将收到一封回复。如果一切正常,您应该在“结果摘要”下看到 DKIM check: pass

==========================================================
Summary of Results
==========================================================
SPF check:          pass
DomainKeys check:   neutral
DKIM check:         pass
Sender-ID check:    pass
SpamAssassin check: ham

或者,您可以向您控制的 Gmail 地址发送一封消息,在 Gmail 收件箱中查看收到的电子邮件的标头,Authentication-Results 标头字段中应该存在 dkim=pass

Authentication-Results: mx.google.com;spf=pass (google.com: domain of contact@example.com designates --- as permitted sender) smtp.mail=contact@example.com;dkim=pass header.i=@example.com;

http://www.ppmy.cn/embedded/56221.html

相关文章

WPF自定义模板--TreeView 实现菜单连接线

有些小伙伴说&#xff0c;在TreeView中&#xff0c;怎么每一个都加上连接线&#xff0c;进行显示连接。 代码和效果如下&#xff1a; 其实就是在原来的模板中增加一列显示线条&#xff0c;然后绘制即可 <Window x:Class"XH.TemplateLesson.TreeViewWindow"xmln…

【TS】TypeScript 中的 any 与 unknown:理解与实践

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 TypeScript 中的 any 与 unknown&#xff1a;理解与实践一、引言二、any&#x…

【介绍下SCSS的基本使用】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

2024最新!将mysql的数据导入到Solr

Solr导入mysql的数据 如何安装导入数据前准备配置Solr的Jar包以及Mysql驱动包1.1、将solr-8.11.3\dist下的两个包进行移动1.2、将mysql-connect包也移动到该位置1.3、重启Solr项目 配置xml2.1、第一步我们需要创建核心2.2、第二步修改xml(这里是结合19年的教程)2.3、 创建data-…

Kotlin设计模式:工厂方法详解

Kotlin设计模式&#xff1a;工厂方法详解 工厂方法模式&#xff08;Factory Method Pattern&#xff09;在Kotlin中是一种常见的设计模式&#xff0c;用于将对象创建的责任委派给单一的方法。本文将详细讲解这一模式的目的、实现方法以及使用场景&#xff0c;并通过具体的示例…

Python爬取国家医保平台公开数据

国家医保服务平台数据爬取python爬虫数据爬取医疗公开数据 定点医疗机构查询定点零售药店查询医保机构查询药品分类与代码查询 等等&#xff0c;数据都能爬 接口地址&#xff1a;/ebus/fuwu/api/nthl/api/CommQuery/queryFixedHospital 签名参数&#xff1a;signData {dat…

QQ录屏文件保存在哪里?一键教你快速查询

无论是记录重要的工作内容&#xff0c;还是分享生活中的点滴&#xff0c;屏幕录制都发挥着至关重要的作用。在众多屏幕录制工具中&#xff0c;qq录屏以其简单易用、功能丰富的特点&#xff0c;受到了广大用户的喜爱。本文将为您揭示qq录屏文件保存在哪里&#xff0c;帮助大家更…

[软件安装]linux下安装steam

1、下载安装包到linux系统 SteamTools 发行版 - Gitee.com 2、选择对应的版本 3、解压安装包steam &#xff08;1&#xff09;在opt路径下新建一个文件夹 sudo mkdir steam &#xff08;2&#xff09;进入压缩包路径下&#xff0c;打开终端&#xff0c;执行以下代码进行解压…

智能化浪潮下的二手车市场:如何构建高效的管理系统

在数字化时代背景下&#xff0c;二手车市场正经历着前所未有的变革。智能化管理系统以其高效、透明的特性&#xff0c;为解决市场长期存在的信息不对称和交易流程复杂问题提供了新思路。 一、二手车市场现状 二手车市场作为汽车行业的重要组成部分&#xff0c;正受到越来越多…

使用Java开发工具包会遇到哪些问题

哈喽&#xff0c;大家好呀&#xff0c;淼淼又来和大家见面啦&#xff0c;Java作为一门广泛应用于企业级应用、安卓开发、大数据处理等领域的编程语言&#xff0c;其强大的跨平台能力和丰富的类库支持吸引了无数开发者。然而&#xff0c;在使用Java开发工具包(Java Development …

前端面试题(13)答案版

姓名&#xff1a; 面试时间&#xff1a; 面试岗位&#xff1a; 1. 介绍介绍自己的项目,权限怎么做?如何添加动态路由? - 答:对于项目介绍,我会重点介绍自己参与的主要功能模块,以及在项目中担任的角色和责任。 在权限管理方面,通常会采用基于…

京东e卡怎么用?

京东618过去后&#xff0c;就没有多大购物欲望了&#xff0c;最后导致我手里还有好几张200块钱面值的e卡没地方用 本来说送朋友&#xff0c;但是又感觉面值太小了 最后还是在收卡云上把提取出来了&#xff0c;主要回收价格不错&#xff0c;而且到账也快&#xff0c;很方便

CriticGPT: 用 GPT-4 找出 GPT-4 的错误

CriticGPT 是 OpenAI 发布的一个基于 GPT-4 的模型&#xff0c;它可以帮助我们人类 Review 并纠正 ChatGPT 在生成代码时的错误。使用 CriticGPT 审查代码时&#xff0c;有 60% 的概率生成的代码更好更正确。

AudioLM音频生成模型:技术革新与应用前景

引言 AudioLM作为一种革命性的音频生成模型&#xff0c;结合了深度学习和自然语言处理的先进技术&#xff0c;能够生成高质量、逼真的音频内容。本文旨在深入探讨AudioLM的技术原理、工作机制、应用场景以及其对音频生成领域的深远影响。 AudioLM技术原理 AudioLM音频生成模…

14-22 深度神经网络中的学习机制(学习类型、激活函数和反向传播)

背景审查 在第一部分中&#xff0c;我们深入探讨了人工智能的兴衰简史以及推动人工智能发展的努力。我们研究了一个简单的感知器&#xff0c;以了解其组件以及简单的 ANN 如何处理数据和权重层。在简单的 ANN 中&#xff0c;不会对数据执行特定操作。ANN 中的激活函数是一个线…

63、基于深度学习网络的数字分类(matlab)

1、基于深度学习网络的数字分类的原理及流程 基于深度学习网络的数字分类是一种常见的机器学习任务&#xff0c;通常使用的是卷积神经网络&#xff08;CNN&#xff09;来实现。下面是其原理及流程的简要说明&#xff1a; 数据收集&#xff1a;首先&#xff0c;需要收集包含数字…

微信小程序根据蓝牙RSSI信号强度测试设备距离

背景 在做小程序连接蓝牙设备的时候&#xff0c;有需求表明在搜索到0.5米之内的设备时自动连接 问题&#xff1a; 蓝牙模组只提供了RSSI信号强度&#xff0c;那又该如何计算蓝牙设备距离小程序的距离呢&#xff1f; 解决方案 通过以下公式做大量测试&#xff1a;求 A、n 的平均…

单片机cmake使用笔记

一、同时拥有两个工程项目时的配置&#xff08;APP IAP&#xff09;方便git等工具的管理 1.1、目录结构如下&#xff1a; |-Power_prj|-CMakelists.txt| |-Power_APP| | |-src| | |-include| | |-main.c| | …

上海市计算机学会竞赛平台2023年3月月赛丙组选取子段

题目描述 给定一个长度为&#x1d45b;n的序列 &#x1d44e;1,&#x1d44e;2,...,&#x1d44e;&#x1d45b;a1​,a2​,...,an​ &#xff0c;请问多少种方案&#xff0c;能够从中选取一个长度恰好为 &#x1d45a;m 的子段&#xff0c;且子段内所有数字的最大值不超过&…

ruoyi mybatis pagehelper 分页优化(自定义limit位置)clickhouse 外部数据源

例如加入clickhouse的分页时发现extends 不生效 则可以添加 startPage();registerDialectAlias("clickhouse", PageMySqlDialectPlus.class);List<MyMonitorlog> list monitorlogService.selectMonitorlogList(monitorlog);主要是需要注册 registerDialectAl…