在我的服务器中将DKIM用于多个域(网站)


Answers:


30

好!我从问题中提到的帖子中弄明白了。我在答案本身和其中提供的链接之间进行了某种混合。特别是第四个链接是我使用的那个。

所以事情就是这样。假设您有一个服务器或VPS,并将您的一个域设为主域并用作服务器名称(在我的示例中为mydomain.com)。

因此,首先,我们将更改为root来简化操作,但是您可以跳过此步骤并sudo在每个命令之前使用。

sudo su

现在,我们安装OpenDKIM:

apt-get install opendkim opendkim-tools

让我们修复配置文件。我们正在开放/etc/opendkim.conf进行编辑。我使用nano,但是其他编辑器也一样。

nano /etc/opendkim.conf

打开后,使其看起来像这样。如果你感觉很舒服,你可以改变一些选项,但是DomainKeyFile并且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

该SigningTable列出了所有已签名的邮件。只需添加域名,来自该域的所有邮件都将被签名。

我不确定是否需要执行下一步,但是我只是这样做了,以防万一...我们打开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
很好的指南,但是我必须从SigningTable条目中删除* @,以避免在mail.log中出现错误“在'user@example.com'上没有与'user@example.com'匹配的签名表” 错误。 users / 2011/08 / 1332.html
dw1 2015年

1
感谢本指南,我遇到了与dw1相同的问题,但是从SigningTable中删除* @后,一切正常。还有一件事是/etc/opendkim/TrustedHosts,无论通过该主机运行多少个域,该主机的IP只需在该文件中一次即可。如果要使用其他选择器,请default确保在所有文件中进行更改!
Flatron '16

按照所有指南进行操作,但似乎未添加DKIM签名...我该如何调试呢?
the_nuts's

1
谢谢你!我在Ubuntu 16.x和opendkim 2.10.3上...我需要*@在SigningTable中的域名前面添加部分;在我纠正此问题之前,没有任何签名。抄送:@the_nuts
Patrick Moore

1
如果文件/ etc / opendkim / KeyTable和/或/ etc / opendkim / SigningTable不存在,则首次重启服务可能不会成功。只需使用# touch /etc/opendkim/KeyTable # touch /etc/opendkim/SigningTable
Kristjan Adojaan

4

该脚本将在“完成!服务器已准备好与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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.