CHIqueen

SPF, DKIM, DMARC 왜 차단되었을까? 본문

카테고리 없음

SPF, DKIM, DMARC 왜 차단되었을까?

CHIqueen 2026. 3. 30. 15:22

회사에서 스팸차단 장비 운영하면서 왜 차단 되었을까? 하는것들이 많다.

대부분 SPF는 설정 잘해놔서 통과한다. 근데 DKIM이 맛이간 경우가 대다수다.

가끔 차단되면 우리 기관은 정상인데 니네가 설정 잘못해놔서 그래! 이러는데 실제로 까보면 95% 상대 잘못이다.

 

1. DKIM TXT레코드 나눠버리기

DKIM 정보를 하나의 레코드에 등록을 해야하는데, 255자를 넘어버려서 이를 나눠 등록해야합니다. 여기서 가장 많은 실수를 하는데, 글자 수 넘어간다고 여러 개 등록하는 경우입니다.

chiqueen@CHIqueen:~$ dig google._domainkey.도메인 any

; <<>> DiG 9.18.39-0ubuntu0.24.04.3-Ubuntu <<>> google._domainkey.도메인 any
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64613
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;google._domainkey.도메인.     IN      ANY

;; ANSWER SECTION:
google._domainkey.도메인. 300  IN      TXT     "v=DKIM1;k=rsa;p=값1"
google._domainkey.도메인. 300  IN      TXT     "값2"
google._domainkey.도메인. 300  IN      TXT     "값3"

 

이렇게 등록할 경우 DNS리졸버가 TXT레코드 중 어떤 레코드가 1번인지 모릅니다. MX레코드도 아니고 TXT레코드엔 우선순위는 없습니다.  레코드가 여러 개 리턴될 경우 리졸버는 TXT레코드를 조합하려하지 않습니다. 공식문서에서도 결과는 undefined라고 합니다.

RFC6376
3.6.2.2 Resource Record Types for Key Storage
Strings in a TXT RR MUST be concatenated together before use with no intervening whitespace. TXT RRs MUST be unique for a particular selector name; that is, if there are multiple records in an RRset, the results are undefined.

6.1.2. Get the Public Key
If the query for the public key returns multiple key records, the Verifier can choose one of the key records or may cycle through the key records, performing the remainder of these steps on each record at the discretion of the implementer. The order of the key records is unspecified. If the Verifier chooses to cycle through the key records, then the "return ..." wording in the remainder of this section means "try the next key record, if any; if none, return to try another signature in the usual way".

 

암튼, 하나의 레코드 안에 문자열을 청킹해서 넣어야 합니다.

chiqueen@CHIqueen:~$ dig s20171120._domainkey.도메인.com txt

; <<>> DiG 9.18.39-0ubuntu0.24.04.3-Ubuntu <<>> s20171120._domainkey.도메인.com txt
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33479
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;s20171120._domainkey.도메인.com. IN TXT

;; ANSWER SECTION:
s20171120._domainkey.도메인.com. 300 IN TXT "v=DKIM1;k=rsa;p=값1" "값2"

 

이런식으로 값1, 값2로 나누면 보안장비에서 합치고 알아서 처리하게 됩니다.

 

그래서 요즘 사람들이 하도 등록하는데 실수를 하니까 아예 TXT대신에 CNAME레코드를 등록하라고 합니다.

예시로 제가 이용하고 있는 proton의 경우 아예 CNAME을 등록하고 DKIM TXT값은 proton에서 일괄 관리하는 방식을 채택하고 있습니다.

chiqueen@CHIqueen:~$ dig protonmail._domainkey.chiqueen.dev txt

; <<>> DiG 9.18.39-0ubuntu0.24.04.3-Ubuntu <<>> protonmail._domainkey.chiqueen.dev txt
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41462
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;protonmail._domainkey.chiqueen.dev. IN TXT

;; ANSWER SECTION:
protonmail._domainkey.chiqueen.dev. 14400 IN CNAME protonmail.domainkey.dfy54dpgk2xh25cn6526erhucseiykmgxc4vqic2trc3hg7vm6tvq.domains.proton.ch.
protonmail.domainkey.dfy54dpgk2xh25cn6526erhucseiykmgxc4vqic2trc3hg7vm6tvq.domains.proton.ch. 964 IN TXT "v=DKIM1;k=rsa;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuYxfixXnvmwSD6lslOQbB7o1AzeW9WpZbkUi4d7PGX7MRjndzeMBqSt2BlDVtZTIxDIJoXtaCpz84osF2182O55FhpPTylOR1cUdqfZSWYzBcaaJnyYpGF1W0DlLhRufTVmxU9mTGO0nCG6bnXsomtlS2HA5OrNbH1wAUjTzvG7Hnj8u/x854myBi3a6CtDIVfW" "NtYqvB2VmtUlxGZl4uqZqzwDzDd1eiO4uRxJ3DAaf55SEWfk9pBmclWxL3XCsNz3llOTet6944PIAQ8DhscKYTg0015xbSatGoPQBdrO6EMvPiDMbyY7llUxGttXzvLhMNY1QJlR2RBmrktY28QIDAQAB;"

 

아래 ANSWER SECTION을 보면 리졸버가 알아서 CNAME따라 TXT레코드를 조회해옵니다.

 

2. DMARC adkim fail

나중에 

Comments