Lobsters

Golang tool to check SPF, DKIM, TLSA, and TLS settings for mailservers

메일 서버의 SPF·DKIM·TLSA·TLS 설정을 점검하는 Go 도구

mailcheck는 Go로 만든 SMTP·DNS·TLS 진단 도구로, 도메인의 메일 수신 설정과 SPF·DKIM·DMARC 정책을 점검합니다. JSON과 Nagios/Icinga 형식으로 결과를 내보내 일일 모니터링에 붙일 수 있습니다.

AI 요약

mailcheck는 도메인이 SMTP 메일을 제대로 받을 수 있도록 설정됐는지 확인하는 명령줄 도구입니다. MX와 A·AAAA 레코드, SMTP 연결과 STARTTLS, 서버 인증서, TLSA, SPF·DKIM·DMARC를 점검합니다. 결과는 사람이 읽는 형식뿐 아니라 JSON과 Nagios/Icinga 호환 형식으로 출력합니다.

SMTP와 TLS 점검

MX 레코드는 우선순위순으로 확인하고, MX가 없으면 A·AAAA 레코드를 사용하는 암시적 MX 동작과 메일 수신 거부를 뜻하는 Null MX도 구분합니다. IPv4·IPv6를 선택해 TCP 연결, SMTP 인사말, EHLO, STARTTLS 협상을 차례로 검사합니다. 포트 465처럼 암시적 TLS를 쓰는 서버도 지정할 수 있습니다.

인증서의 호스트명과 PKIX 검증, 발급자, 유효 기간을 살피고 TLS 1.2·1.3 및 최신 AEAD 암호군을 분류합니다. 인증서 검증은 TLS 핸드셰이크와 따로 수행합니다. 공개 신뢰를 받지 못하는 인증서도 검사하고 DANE의 TLSA 레코드와 비교하려는 설계입니다. 기본 최소 TLS 버전은 1.2이므로 TLS 1.0·1.1만 지원하는 서버는 최신 TLS 검사에서 실패합니다.

DNS와 메일 인증 정책

TLSA 레코드는 DANE-TA(2)와 DANE-EE(3) 사용 유형의 인증서 또는 공개 키 일치를 검사합니다. SMTP에서는 PKIX 사용 유형 0·1을 사용할 수 없다는 RFC 7672 규칙도 반영합니다. DNSSEC 상태는 도구 자체의 완전한 검증 결과가 아닙니다. EDNS DNSSEC 데이터를 요청한 뒤 지정한 재귀 리졸버가 반환한 AD(Authenticated Data) 비트를 보고 상태를 표시합니다. 운영 환경에서 DANE를 감시하려면 신뢰하는 검증 리졸버를 지정해야 합니다. DNSSEC 검증 없이 받은 TLSA 일치는 인증된 DANE와 같지 않습니다.

SPF 검사는 레코드 문법, 중복 레코드, 종료 정책과 최상위 DNS 조회 한도를 확인합니다. 다만 발신 IP별 전체 SPF 평가를 재귀적으로 수행하지는 않습니다. DKIM은 DNS에서 선택자를 자동 열거할 수 없으므로 사용자가 선택자를 지정해야 합니다. 공개 키 인코딩과 RSA 키 길이, Ed25519 키 길이를 검사하지만 서명된 메시지를 검증하지는 않습니다. DMARC는 레코드와 정책 태그를 검사하며 실제 메시지의 SPF·DKIM 정렬 여부는 평가하지 않습니다. 도메인에 DMARC 레코드가 없으면 RFC 7489에 따라 조직 도메인의 레코드를 찾고, 있으면 하위 도메인 정책인 sp도 적용합니다.

결과와 운영 방식

Nagios/Icinga 출력은 OK, WARNING, CRITICAL, UNKNOWN을 사용하며 전체 결과는 가장 심각한 상태를 따릅니다. SMTP 검사는 실제 대상 포트에 TCP 연결을 시도하지만 메일을 보내거나 인증하지 않습니다. 단계별 결과를 분리하므로 TCP 연결 실패 뒤의 TLS·TLSA 상태는 검사 불가로 표시합니다. TLSA는 DNSSEC 인증 여부와 레코드 일치 여부에 따라 경고, 치명적 오류, 알 수 없음으로 나뉩니다. Go 1.24 이상이 필요하며, DNS 서버·시간 초과·호스트명·주소·IP 버전 등을 옵션으로 지정할 수 있습니다.

Lobsters 반응

  • @ptman — 확실히 유용합니다. mox에는 설정 과정에 점검과 안내가 내장돼 있습니다. 메일 서버를 설정할 때 mail-tester.com도 아주 유용합니다.
    • @sigio — 온라인 테스트가 여러 개 있지만, 저는 Nagios/Icinga에 추가해 매일 감시할 수 있는 도구를 원했습니다.

원문: Lobsters / 번역·요약: Trawling