서버에서 여러 도메인 (웹 사이트)에 DKIM 사용


답변:


30

좋은! 나는 질문에서 언급 한 게시물에서 이것을 알아 냈습니다. 나는 답변 자체와 그 안에 제공된 링크를 일종의 혼합으로 만들었습니다. 특히 네 번째 링크는 내가 사용한 링크입니다.

그래서 이런 일은갑니다. 서버 또는 VPS가 있고 도메인 중 하나를 기본 도메인으로 만들고 서버 이름으로 사용한다고 가정합니다 (예 : mydomain.com).

우선, 우리는 루트로 변경하여 작업을 더 쉽게 할 수 있지만이 단계를 건너 뛰고 sudo모든 명령 전에 사용할 수 있습니다 .

sudo su

이제 OpenDKIM을 설치합니다 :

apt-get install opendkim opendkim-tools

구성 파일을 수정합시다. 우리는 /etc/opendkim.conf편집을 위해 열었 습니다. 나는 nano를 사용하지만 다른 편집기와 동일합니다.

nano /etc/opendkim.conf

열면 다음과 같이 보입니다. 당신이 편안 경우 일부 옵션을 변경할 수 있지만, 수 Domain, KeyFileSelector주석 유지해야합니다.

# 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을 사용하고 자신의 것으로 바꾸겠습니다.

내가 전부터 뿌리 였음을 기억하십시오. 그렇지 않은 경우 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
위대한 가이드,하지만 당 오류 mail.log에서 " 'user@example.com'에 대한 어떠한 서명 테이블의 일치"를 방지하기 위해 SigningTable 항목에서 * @를 제거했다 lists.opendkim.org/archive/opendkim/ users / 2011 / 08 / 1332.html
dw1

1
이 가이드에 감사드립니다 .dw1과 동일한 문제가 있었지만 SigningTable에서 * @ 를 제거한 후 모든 것이 예상대로 작동했습니다. 한가지 더는에 있다는 것입니다 /etc/opendkim/TrustedHosts파일 호스트의 IP에 관계없이이 호스트를 통해 실행 얼마나 많은 도메인으로, 한 번 거기에 수 만 있습니다. 다른 선택기를 사용하려면 모든 파일 default에서 선택기 를 변경 하십시오!
Flatron

모든 가이드를 따랐지만 DKIM 서명이 추가되지 않은 것 같습니다. 어떻게 디버깅 할 수 있습니까?
the_nuts

1
감사합니다! Ubuntu 16.x를 사용 중이며 opendkim 2.10.3 ... SigningTable *@의 도메인 이름보다 먼저 필요한 부분이 있습니다. 이 문제를 해결하기 전까지는 서명 된 것이 없습니다. cc : @the_nuts
Patrick Moore

1
/ etc / opendkim / KeyTable 및 / or / etc / opendkim / SigningTable 파일이 없으면 서비스를 처음 다시 시작하지 못할 수 있습니다. 간단하게 사용하는 것 # touch /etc/opendkim/KeyTable # touch /etc/opendkim/SigningTable
크리스티안 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 레코드가 포함됩니다.

참고 : 도메인을 두 번 이상 실행하지 마십시오. 도메인이 이미 있는지 확인하지 않습니다. 스크립트는 루트로 실행해야합니다.

#!/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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.