Использование DKIM на моем сервере для нескольких доменов (веб-сайтов)


22

Я прочитал учебник, опубликованный MountainX ( Setup DKIM (DomainKeys) для Ubuntu, Postfix и Mailman ), но я не могу понять, как применить эти шаги, если я хочу размещать и отправлять электронную почту для нескольких доменов. У кого-нибудь есть подсказка?

Ответы:


30

Хорошо! Я понял это из поста, упомянутого в вопросе. Я сделал своего рода смесь между самим ответом и ссылками, приведенными в нем. Специально четвертая ссылка - та, которую я использовал.

Так что все идет так. Предположим, у вас есть сервер или VPS, и вы сделаете один из ваших доменов главным доменом и будете использоваться в качестве имени сервера (в моем примере: mydomain.com).

Итак, во-первых, мы изменим на root, чтобы упростить задачу, но вы можете пропустить этот шаг и использовать sudoперед каждой командой.

sudo su

Теперь мы устанавливаем OpenDKIM:

apt-get install opendkim opendkim-tools

Давайте исправим файл конфигурации. Мы открываем /etc/opendkim.confдля редактирования. Я использую нано, но то же самое с другим редактором.

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

Этот 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, чтобы избежать ошибки «нет совпадения таблицы подписей для« user@example.com »» в mail.log, для lists.opendkim.org/archive/opendkim/ users / 2011/08 / 1332.html
dw1

1
Спасибо за это руководство, у меня была та же проблема, что и у dw1, но после удаления * @ из SigningTable все заработало как положено. Еще одна вещь заключается в том, что в /etc/opendkim/TrustedHostsфайле IP-адрес хоста должен быть там только один раз, независимо от того, сколько доменов запущено через этот хост. Если вы хотите использовать какой-то другой селектор, defaultубедитесь, что изменили его во всех файлах!
Флатрон

Следовал всем инструкциям, но подпись DKIM, похоже, не добавлена ​​... как я могу отладить это?
the_nuts

1
Спасибо за это! Я на Ubuntu 16.x и opendkim 2.10.3 ... Мне нужна была *@часть, предшествующая доменному имени в SigningTable; ничего не было подписано, пока я не исправил это. Копия: @the_nuts
Патрик Мур

1
Первый перезапуск служб может быть неудачным, если отсутствуют файлы / etc / opendkim / KeyTable и / или / etc / opendkim / SigningTable. Просто создайте их, используя # touch /etc/opendkim/KeyTable # touch /etc/opendkim/SigningTable
Кристьян Адоян

4

Этот скрипт автоматизирует деталь после «Готово! Сервер готов к работе с DKIM»

Чтобы немного автоматизировать этот процесс, я создал скрипт bash. Просто добавьте по одному «domain.com» на строку внутри массива domains = ().

Сначала создайте файлы и каталоги, если они еще не существуют

/etc/opendkim/keys/
/etc/opendkim/KeyTable
/etc/opendkim/SigningTable
/etc/opendkim/TrustedHosts
/etc/opendkim/spfs.txt

Файл spfs.txt будет содержать все записи spf, которые необходимо добавить в записи DNS для каждого домена.

ПРИМЕЧАНИЕ: не запускайте более одного раза, он не проверяет, существует ли домен. Скрипт также должен быть запущен от имени пользователя 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. Просто добавьте один домен, например, example.com, в строку внутри массива domains = ().

Этот скрипт создает файлы для вас и проверяет, есть ли строка в файле

Spfs.txt удаляется и воссоздается каждый раз при запуске и проверяет вторую строку default.txt на соответствие spfs.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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.