我已阅读 MountainX 发布的教程(为 Ubuntu、Postfix 和 Mailman 设置 DKIM (DomainKeys)),但如果我想为多个域名托管和发送电子邮件,我不知道如何应用这些步骤。有人知道吗?
答案1
很好!我从问题中提到的帖子中找到了答案。我将答案本身和答案中提供的链接混合在一起。特别是第四个链接是我使用的。
事情是这样的。假设您有一台服务器或 VPS,并将您的一个域设为主域并用作服务器名称(在我的示例中为:mydomain.com)。
因此,首先,我们将更改为 root 以使事情变得简单,但您可以跳过此步骤并sudo
在每个命令之前使用。
sudo su
现在,我们安装OpenDKIM:
apt-get install opendkim opendkim-tools
让我们修复配置文件。我们打开/etc/opendkim.conf
进行编辑。我用的是nano,但其他编辑器也一样。
nano /etc/opendkim.conf
打开后,让它看起来像这样。如果您觉得合适,您可以更改一些选项,但 、Domain
和KeyFile
必须Selector
保留注释。
# This is a basic configuration that can easily be adapted to suit a standard
# installation. For more advanced options, see opendkim.conf(5) and/or
# /usr/share/doc/opendkim/examples/opendkim.conf.sample.
#
#Domain example.com
#KeyFile /etc/opendkim/201205.private
#Selector 201205
#
# Commonly-used options
Canonicalization relaxed/simple
Mode sv
SubDomains yes
# Log to syslog
Syslog yes
LogWhy yes
# Required to use local socket with MTAs that access the socket as a non-
# privileged user (e.g. Postfix)
UMask 022
UserID opendkim:opendkim
#
KeyTable /etc/opendkim/KeyTable
SigningTable /etc/opendkim/SigningTable
ExternalIgnoreList /etc/opendkim/TrustedHosts
InternalHosts /etc/opendkim/TrustedHosts
#
Socket inet:8891@localhost
#EOF
接下来,我们创建一些文件夹和文件,用于保存有关 OpenDKIM 应使用和处理的内容的信息。现在,TrustedHosts
创建文件。我们创建并编辑它:
mkdir /etc/opendkim
nano /etc/opendkim/TrustedHosts
我们必须在此文件中放入可信地址列表:localhost 和 127.0.0.1,以及您的服务器名称和 IP:
127.0.0.1
localhost
192.99.34.121
mydomain.com
现在我们编辑OpenDKIM配置文件。
nano /etc/default/opendkim
并在文件末尾添加以下几行。它们将告诉 OpenDKIM 应该在哪个端口接收签名请求:
SOCKET="inet:8891@localhost"
我们打开 Postfix 配置文件。
nano /etc/postfix/main.cf
并将这些行添加到文件末尾。它们将告诉 Postfix 应该将要签名的电子邮件发送到哪里。
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
如果您现在不添加域,您可以重新启动所有内容,以便配置生效。
/etc/init.d/opendkim restart
/etc/init.d/postfix reload
/etc/init.d/postfix restart
完成!服务器已准备好与 DKIM 配合使用。现在,您需要将您的域添加到此系统。对于您要添加的所有域,以下步骤相同。我将使用 otherdomain.com 作为示例,请将其替换为您自己的。
记住我之前是 root 身份,但如果您不是,请运行sudo su
或在命令前加上关键字sudo
。
sudo su
首先,我们为我们的域创建一个目录并进入其中:
mkdir -p /etc/opendkim/keys/otherdomain.com
cd /etc/opendkim/keys/otherdomain.com
现在我们为域生成一个密钥:
opendkim-genkey -r -d otherdomain.com
我们授予 OpenDKIM 用户新创建文件的所有权:
chown opendkim:opendkim default.private
我们打开KeyTable
文件来为我们的新域名添加新密钥:
nano /etc/opendkim/KeyTable
我们将其添加到文件末尾(位于此处可能拥有的所有其他域之后):
default._domainkey.otherdomain.com otherdomain.com:default:/etc/opendkim/keys/otherdomain.com/default.private
我们打开SigningTable
文件。
nano /etc/opendkim/SigningTable
并将其附加到文件末尾(同样,每个域一行):
otherdomain.com default._domainkey.otherdomain.com
此签名表列出了所有已签名的邮件。只需添加域名,来自该域的所有邮件都将被签名。
我不确定是否有必要执行下一步,但我还是这么做了,以防万一...我们打开文件TrustedHosts
。
nano /etc/opendkim/TrustedHosts
并在文件末尾添加:
otherdomain.com
最后一件事:我们显示文件的内容/etc/opendkim/keys/otherdomain.com/default.txt
。
cat /etc/opendkim/keys/otherdomain.com/default.txt
并将引号之间的信息添加到TXT
域的 DNS 区域中的记录中,并且我们还必须使用它default._domainkey
作为记录的名称。注意:“引号之间”是以“ v=DKIM1;k=rsa; p=WIGfM...
”开头的文本。
如果我们现在已经完成添加域,我们将重新启动所有内容以应用更改。
/etc/init.d/opendkim restart
/etc/init.d/postfix reload
/etc/init.d/postfix restart
完毕!
答案2
此脚本自动执行“完成!服务器已准备好使用 DKIM”之后的部分
为了帮助稍微自动化这个过程,我创建了这个 bash 脚本。只需在 domains=() 数组中每行添加一个“domain.com”即可。
如果文件和目录尚不存在,请首先创建它们
/etc/opendkim/keys/
/etc/opendkim/KeyTable
/etc/opendkim/SigningTable
/etc/opendkim/TrustedHosts
/etc/opendkim/spfs.txt
spfs.txt 文件将包含您需要添加到每个域的 DNS 记录的所有 spf 记录。
注意:不要多次运行,它不会检查域是否已存在。脚本也需要以 root 身份运行。
#!/bin/bash
domains=(
'domain.com'
)
for domain in "${domains[@]}"
do
keydir="/etc/opendkim/keys/$domain"
if [ -d "$keydir" ]
then
cd $keydir
else
mkdir $keydir
cd $keydir
fi
opendkim-genkey -r -d $domain
chown opendkim:opendkim default.private
echo "default._domainkey.$domain $domain:default:$keydir/default.private" >> /etc/opendkim/KeyTable
echo "$domain default._domainkey.$domain" >> /etc/opendkim/SigningTable
echo "$domain" >> /etc/opendkim/TrustedHosts
echo "$(cat $keydir/default.txt)" >> spfs.txt
done
答案3
此脚本自动执行“完成!服务器已准备好使用 DKIM”之后的部分
为了帮助自动化这个过程,我创建了这个 bash 脚本。只需在 domains=() 数组中每行添加一个域名,如“example.com”。
此脚本会为您创建文件并检查文件中是否已有一行
Spfs.txt 每次运行时都会被删除并重新创建,并在附加之前根据 spfs.txt 检查 default.txt 的第二行
您必须将服务器 ipv4 和 ipv6(如果有)放置在提供的变量中。它会检查它们是否为空
由于添加了检查,您可以多次运行此文件。
#!/bin/bash
# List of domains
domains=(
'example.com'
)
# file paths and directories
dkim="/etc/opendkim"
keys="$dkim/keys"
keyfile="$dkim/KeyTable"
signfile="$dkim/SigningTable"
trustfile="$dkim/TrustedHosts"
spffile="$dkim/spfs.txt"
# Set Ipv6 and Ipv4 addresses for the server here
ipv4=""
ipv6=""
# loopback addresses for the server
loop=( localhost 127.0.0.1 )
function loopback {
for back in "${loop[@]}"
do
if ! grep -q "$back" "$trustfile"; then
echo "$back" >> "$trustfile"
fi
done
}
# Check for files and create / write to them if they dont exist
if [ ! -d "$keys" ]; then
mkdir "$keys"
fi
if [ ! -f "$keyfile" ]; then
touch "$keyfile"
fi
if [ ! -f "$signfile" ]; then
touch "$signfile"
fi
if [ ! -f "$trustfile" ]; then
touch "$trustfile"
loopback
else
loopback
fi
if [ ! -f "$spffile" ]; then
touch "$spffile"
else
rm -rf "$spffile"
touch "$spffile"
fi
if [ ! -z "$ipv6" ]; then
if ! grep -q "$ipv6" "$trustfile"; then
echo "$ipv6" >> "$trustfile"
fi
fi
if [ ! -z "$ipv4" ]; then
if ! grep -q "$ipv4" "$trustfile"; then
echo "$ipv4" >> "$trustfile"
fi
fi
# Generate keys and write the spfs records we need for each domain to one file
for domain in "${domains[@]}"
do
keydir="$keys/$domain"
default="$keydir/default.txt"
if [ ! -d "$keydir" ]; then
mkdir $keydir
fi
cd $keydir
opendkim-genkey -r -d $domain
chown opendkim:opendkim default.private
key="default._domainkey.$domain $domain:default:$keydir/default.private"
sign="$domain default._domainkey.$domain"
trust="$domain"
spf="$(cat $default)"
# Check only the last line against the spf file as the first line is always the same
spflast="$(tail -1 $default)"
if ! grep -q "$key" "$keyfile"; then
echo "$key" >> "$keyfile"
fi
if ! grep -q "$sign" "$signfile"; then
echo "$sign" >> "$signfile"
fi
if ! grep -q "$trust" "$trustfile"; then
echo "$trust" >> "$trustfile"
fi
if ! grep -q "$spflast" "$spffile"; then
echo "$spf" >> "$spffile"
fi
done