mcpField
D
dns-zonefile-config

dns-zonefile-config

github.com/guia-matthieu云与 DevOps150203 次安装4 周前更新
代码仓库

关于 dns-zonefile-config

dns-zonefile-config 面向配置域名和排查 DNS 问题的管理员,重点涉及邮件认证与域名安全。内容涵盖 SPF、DKIM、DMARC、DNSSEC、CAA、TTL 建议,以及通过 OVH API 和 Terraform 自动化的示例。

主要功能

  1. 01配置 SPF、DKIM 和 DMARC
  2. 02设置 DNSSEC 与 CAA 记录
  3. 03查阅不同记录的 TTL 建议
  4. 04使用 OVH API 和 Terraform 自动化 DNS
  5. 05通过命令行工具诊断记录

适用场景

  1. 01为域名配置邮件认证
  2. 02保护域名免受伪造
  3. 03迁移或配置新域名
  4. 04排查 DNS 与邮件投递问题

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/guia-matthieu/clawfu-skills --skill dns-zonefile-config

安装后在 Claude Code 中输入/dns-zonefile-config确认已加载。

详细介绍

DNS 区域文件配置

正确配置 DNS 区域,确保电子邮件送达率(SPF、DKIM、DMARC)、安全性(DNSSEC、CAA)和自动化(OVH API、Cloudflare、Terraform),遵循 2024-2025 年的最佳实践。

何时使用此技能

  • 配置电子邮件身份验证 - 使用 SPF、DKIM、DMARC,避免邮件进入垃圾邮件文件夹
  • 保护域名安全 - 使用 DNSSEC、CAA 记录,防止欺骗
  • 自动化 DNS 管理 - 使用 OVH API、Cloudflare API、Terraform
  • 调试 DNS 问题 - 使用 dig、nslookup、MXToolbox
  • 迁移或配置新域名 - 从零开始完成完整设置

方法论基础

来源:

为何重要:自 2024 年 2 月起,Google 和 Yahoo 要求批量邮件发送必须配置 SPF、DKIM 和 DMARC。配置不当,邮件就会进入垃圾邮件文件夹。通过身份验证的发件人,进入收件箱的可能性高出 2.7 倍。

Claude 的工作与由你决定的事项

Claude 的工作由你决定
构建销售框架交易策略
提出需求探索问题客户关系处理方式
创建提案模板定价决策
识别异议模式谈判策略
分析交易动态最终交易条款

此技能的功能

  1. 配置电子邮件身份验证 - 使用正确的值配置 SPF、DKIM、DMARC
  2. 保护域名安全 - 配置 DNSSEC、CAA,保护证书
  3. 优化 TTL - 按记录类型设置推荐值
  4. 通过 API 自动化 - 使用 OVH、Cloudflare、Terraform
  5. 诊断问题 - 使用工具进行故障排查

说明

步骤 1:了解区域结构
## Anatomie d'un Fichier de Zone

$ORIGIN example.com.     ; Le domaine de base
$TTL 3600                ; TTL par défaut (1 heure)

; SOA Record (Start of Authority)
@   IN  SOA   ns1.example.com. admin.example.com. (
            2024012801  ; Serial (YYYYMMDDNN)
            7200        ; Refresh (2h)
            3600        ; Retry (1h)
            1209600     ; Expire (2 semaines)
            3600        ; Minimum TTL (1h)
)

; Nameservers
@       IN  NS      ns1.example.com.
@       IN  NS      ns2.example.com.

; A Records
@       IN  A       203.0.113.10
www     IN  A       203.0.113.10
mail    IN  A       203.0.113.20

; CNAME Records
blog    IN  CNAME   www.example.com.

; MX Records (priorité croissante = préférence décroissante)
@       IN  MX  10  mail.example.com.
@       IN  MX  20  mail-backup.example.com.

; TXT Records (SPF, DKIM, DMARC, etc.)
@       IN  TXT     "v=spf1 ..."

步骤 2:电子邮件身份验证 - SPF

SPF(发件人策略框架) - 声明哪些服务器可以代表你的域名发送电子邮件。

## SPF Record Syntax

v=spf1 [mechanisms] [qualifier]all

Mechanisms:
- ip4:203.0.113.0/24    ; Autoriser une plage IP
- ip6:2001:db8::/32     ; IPv6
- a                      ; Autoriser l'IP du record A du domaine
- mx                     ; Autoriser les serveurs MX
- include:_spf.google.com  ; Inclure le SPF d'un autre domaine
- exists:%{i}.spf.example.com  ; Macro avancée

Qualifiers:
- +all  ; PASS (dangereux, jamais utiliser)
- -all  ; FAIL (hard fail)
- ~all  ; SOFTFAIL (recommandé)
- ?all  ; NEUTRAL

SPF 最佳实践:

## SPF - Règles Critiques

1. UN SEUL record SPF par domaine
   ❌ Plusieurs records = tous invalides

2. Utiliser ~all (softfail), pas -all (hardfail)
   → Permet à DMARC d'évaluer aussi DKIM

3. Maximum 10 DNS lookups
   → include:, a, mx, ptr comptent comme lookups
   → ip4/ip6 ne comptent pas
   → Utiliser des macros SPF si limite atteinte

4. Éviter les gros blocs CIDR
   → Préférer des IPs spécifiques aux /16 ou /8

常见 SPF 示例:

## SPF pour Google Workspace
v=spf1 include:_spf.google.com ~all

## SPF pour Microsoft 365
v=spf1 include:spf.protection.outlook.com ~all

## SPF pour OVH Mail
v=spf1 include:mx.ovh.com ~all

## SPF multi-services (Google + Mailchimp + Sendgrid)
v=spf1 include:_spf.google.com include:servers.mcsv.net include:sendgrid.net ~all

## SPF avec IP dédiée
v=spf1 ip4:203.0.113.10 include:_spf.google.com ~all

步骤 3:电子邮件身份验证 - DKIM

DKIM(DomainKeys Identified Mail,域名密钥识别邮件) - 对电子邮件进行加密签名。

## Structure DKIM

Record Name: [selector]._domainkey.example.com
Record Type: TXT
Value: v=DKIM1; k=rsa; p=[public_key]

Exemple:
google._domainkey.example.com  TXT  "v=DKIM1; k=rsa; p=MIIBIjANBgkq..."

DKIM 最佳实践:

## DKIM - Règles Critiques

1. Un sélecteur différent par service
   → google._domainkey pour Google Workspace
   → mailchimp._domainkey pour Mailchimp
   → sendgrid._domainkey pour Sendgrid

2. Rotation des clés tous les 6 mois
   → Réduit le risque de compromission

3. Clé RSA 2048 bits minimum
   → 1024 bits est obsolète

4. Un sélecteur par tiers
   → Permet de révoquer sans impacter la production

各服务的 DKIM 生成方式:

服务DKIM 密钥的查找位置
Google Workspace管理控制台 → 应用 → Google Workspace → Gmail → 验证电子邮件身份
Microsoft 365Microsoft 365 Defender → 电子邮件 → DKIM
Mailchimp设置 → 域名 → 查看设置说明
Sendgrid设置 → 发件人身份验证 → 域名身份验证
Brevo设置 → 发件人和 IP → 域名

步骤 4:电子邮件身份验证 - DMARC

DMARC(基于域名的邮件身份验证) - 指定 SPF/DKIM 验证失败时服务器应采取的策略。

## Structure DMARC

Record Name: _dmarc.example.com
Record Type: TXT
Value: v=DMARC1; p=[policy]; [options]

Policies:
- p=none      ; Monitoring only (étape 1)
- p=quarantine ; Mettre en spam si échec
- p=reject    ; Rejeter si échec (étape finale)

Options courantes:
- rua=mailto:[email protected]  ; Rapports agrégés (XML)
- ruf=mailto:[email protected]  ; Rapports forensics (détaillés)
- pct=100     ; Pourcentage d'emails concernés
- sp=reject   ; Politique pour sous-domaines
- adkim=r     ; Alignement DKIM (r=relaxed, s=strict)
- aspf=r      ; Alignement SPF (r=relaxed, s=strict)

建议的 DMARC 部署步骤:

## Étape 1: Monitoring (2-4 semaines)
v=DMARC1; p=none; rua=mailto:[email protected]

→ Collecter les rapports, identifier tous les expéditeurs légitimes

## Étape 2: Quarantine (2-4 semaines)
v=DMARC1; p=quarantine; pct=10; rua=mailto:[email protected]

→ Tester sur 10% des emails, augmenter progressivement

## Étape 3: Quarantine 100%
v=DMARC1; p=quarantine; rua=mailto:[email protected]

## Étape 4: Reject (objectif final)
v=DMARC1; p=reject; rua=mailto:[email protected]; sp=reject

DMARC 监控服务:


步骤 5:安全性 - DNSSEC 和 CAA

DNSSEC - 对 DNS 响应进行加密签名,防止欺骗。

## Activer DNSSEC

Chez OVH:
1. Manager → Domaine → Zone DNS → DNSSEC
2. Activer → OVH génère les clés automatiquement

Chez Cloudflare:
1. DNS → Settings → DNSSEC
2. Enable DNSSEC → Copier le DS record
3. Ajouter le DS record chez le registrar

Vérification:
$ dig +dnssec example.com
→ Doit montrer RRSIG records

CAA 记录 - 限制哪些 CA 可以签发 SSL 证书。

## Structure CAA

Record Type: CAA
Flags: 0
Tag: issue | issuewild | iodef
Value: "ca-domain" ou "mailto:..."

Exemples:

# Autoriser uniquement Let's Encrypt
example.com.  CAA  0 issue "letsencrypt.org"
example.com.  CAA  0 issuewild "letsencrypt.org"

# Autoriser Let's Encrypt + Sectigo
example.com.  CAA  0 issue "letsencrypt.org"
example.com.  CAA  0 issue "sectigo.com"

# Reporter les violations
example.com.  CAA  0 iodef "mailto:[email protected]"

# Bloquer tous les wildcards
example.com.  CAA  0 issuewild ";"

CAA 最佳实践:

  • 始终配合 DNSSEC 使用(否则容易受到欺骗攻击)
  • 仅列出实际使用的 CA
  • 添加 iodef,以便在发生尝试时收到提醒

步骤 6:TTL 最佳实践
## TTL Recommandés par Type de Record

| Record Type | Usage | TTL Recommandé | Rationale |
|-------------|-------|----------------|-----------|
| A / AAAA | Serveur web stable | 3600-86400 (1h-24h) | Rarement changé |
| A (failover) | Avec health check | 60-300 (1-5min) | Failover rapide |
| CNAME | Alias stable | 3600-86400 | Suit le TTL de la cible |
| MX | Mail servers | 3600-21600 (1h-6h) | Failover via priorité MX |
| TXT (SPF/DKIM) | Email auth | 3600-86400 | Rarement changé |
| TXT (DMARC) | Email policy | 3600 | Peut nécessiter ajustements |
| NS | Nameservers | 86400-172800 (1-2j) | Très stable |
| CAA | Cert authority | 3600-86400 | Rarement changé |

## Règles Générales

1. Jamais TTL = 0 (non défini dans le standard)
2. Minimum recommandé: 300 (5 min)
3. Avant migration: baisser TTL 24-48h avant
4. Après migration stable: remonter le TTL

步骤 7:自动化 - OVH API
## Installation
# pip install ovh

## Configuration (ovh.conf)
[default]
endpoint=ovh-eu

[ovh-eu]
application_key=YOUR_APP_KEY
application_secret=YOUR_APP_SECRET
consumer_key=YOUR_CONSUMER_KEY

## Obtenir les clés
# https://eu.api.ovh.com/createToken/
# Permissions nécessaires:
# GET /domain/zone/*
# POST /domain/zone/*
# PUT /domain/zone/*
# DELETE /domain/zone/*
## Script Python - Gestion DNS OVH

import ovh

client = ovh.Client()

# Lister tous les domaines
domains = client.get('/domain/zone')
print(domains)

# Lister les records d'une zone
records = client.get(f'/domain/zone/{domain}/record')

# Obtenir un record spécifique
record = client.get(f'/domain/zone/{domain}/record/{record_id}')

# Créer un record TXT (ex: SPF)
result = client.post(
    f'/domain/zone/{domain}/record',
    fieldType='TXT',
    subDomain='',  # @ = racine
    target='v=spf1 include:_spf.google.com ~all',
    ttl=3600
)

# Créer un record DMARC
result = client.post(
    f'/domain/zone/{domain}/record',
    fieldType='TXT',
    subDomain='_dmarc',
    target='v=DMARC1; p=none; rua=mailto:[email protected]',
    ttl=3600
)

# Modifier un record
client.put(
    f'/domain/zone/{domain}/record/{record_id}',
    target='nouvelle_valeur',
    ttl=3600
)

# Supprimer un record
client.delete(f'/domain/zone/{domain}/record/{record_id}')

# IMPORTANT: Rafraîchir la zone après modifications
client.post(f'/domain/zone/{domain}/refresh')

第 8 步:自动化 - Cloudflare
## Terraform - Cloudflare DNS

provider "cloudflare" {
  api_token = var.cloudflare_api_token  # Jamais en dur!
}

# Zone data
data "cloudflare_zone" "example" {
  name = "example.com"
}

# A Record
resource "cloudflare_record" "www" {
  zone_id = data.cloudflare_zone.example.id
  name    = "www"
  value   = "203.0.113.10"
  type    = "A"
  ttl     = 3600
  proxied = true  # Cloudflare proxy
}

# SPF Record
resource "cloudflare_record" "spf" {
  zone_id = data.cloudflare_zone.example.id
  name    = "@"
  value   = "v=spf1 include:_spf.google.com ~all"
  type    = "TXT"
  ttl     = 3600
}

# DMARC Record
resource "cloudflare_record" "dmarc" {
  zone_id = data.cloudflare_zone.example.id
  name    = "_dmarc"
  value   = "v=DMARC1; p=reject; rua=mailto:[email protected]"
  type    = "TXT"
  ttl     = 3600
}

# MX Records
resource "cloudflare_record" "mx_primary" {
  zone_id  = data.cloudflare_zone.example.id
  name     = "@"
  value    = "aspmx.l.google.com"
  type     = "MX"
  ttl      = 3600
  priority = 1
}

# CAA Record
resource "cloudflare_record" "caa" {
  zone_id = data.cloudflare_zone.example.id
  name    = "@"
  type    = "CAA"
  ttl     = 3600
  data {
    flags = 0
    tag   = "issue"
    value = "letsencrypt.org"
  }
}

Terraform/Cloudflare 最佳实践:

  • 切勿以明文存储凭证
  • 使用环境变量或密钥管理器
  • 使用远程状态(S3、GCS)进行协作
  • 每个环境使用一个 workspace(staging/prod)

第 9 步:诊断与故障排查
## Outils CLI

# Vérifier un record spécifique
dig example.com TXT +short
dig _dmarc.example.com TXT +short
dig google._domainkey.example.com TXT +short

# Vérifier les MX
dig example.com MX +short

# Vérifier DNSSEC
dig example.com +dnssec

# Tracer la résolution
dig example.com +trace

# Vérifier la propagation (multiple resolvers)
dig @8.8.8.8 example.com TXT    # Google
dig @1.1.1.1 example.com TXT    # Cloudflare
dig @9.9.9.9 example.com TXT    # Quad9

在线工具:

工具URL用途
MXToolboxmxtoolbox.comSPF、DKIM、DMARC、黑名单
DMARC Analyzerdmarcanalyzer.comDMARC 验证
DNSVizdnsviz.net调试 DNSSEC
Mail-Testermail-tester.com完整的邮件评分
Google Postmasterpostmaster.google.com域名信誉

常见错误:

症状可能原因解决方案
SPF permerror存在多条 SPF 记录合并为一条
SPF permerror>10 次 DNS 查询使用 ip4/ip6、SPF 宏
DKIM fail密钥复制错误检查是否存在换行符
DMARC nonePolicy p=none监控期间属正常情况,之后再升级策略
邮件进入垃圾邮件SPF/DKIM 正常但未对齐检查 DMARC 对齐情况(From: header)
SERVFAILDNSSEC 配置错误在 dnsviz.net 上调试

完整模板

模板:新域名(Google Workspace)
## Records à créer

# MX (mail)
@       MX  1   aspmx.l.google.com.
@       MX  5   alt1.aspmx.l.google.com.
@       MX  5   alt2.aspmx.l.google.com.
@       MX  10  alt3.aspmx.l.google.com.
@       MX  10  alt4.aspmx.l.google.com.

# SPF
@       TXT     "v=spf1 include:_spf.google.com ~all"

# DKIM (obtenir la clé dans Google Admin Console)
google._domainkey   TXT     "v=DKIM1; k=rsa; p=MIIBIjANBgkq..."

# DMARC (commencer en monitoring)
_dmarc  TXT     "v=DMARC1; p=none; rua=mailto:[email protected]"

# CAA (si Let's Encrypt pour SSL)
@       CAA     0 issue "letsencrypt.org"
@       CAA     0 iodef "mailto:[email protected]"
模板:停放域名(反欺骗保护)
## Domaine qui n'envoie JAMAIS d'email

# SPF - Rejeter tout
@       TXT     "v=spf1 -all"

# DMARC - Rejeter tout
_dmarc  TXT     "v=DMARC1; p=reject; sp=reject; rua=mailto:[email protected]"

# Pas de MX = pas de réception
# (ou MX vers null: @  MX  0  .)
模板:多服务(SaaS 技术栈)
## SPF avec plusieurs services
@       TXT     "v=spf1 include:_spf.google.com include:servers.mcsv.net include:sendgrid.net ~all"

## DKIM - Un par service
google._domainkey       TXT     "v=DKIM1; k=rsa; p=..."
k1._domainkey           TXT     "v=DKIM1; k=rsa; p=..."  # Mailchimp
s1._domainkey           TXT     "v=DKIM1; k=rsa; p=..."  # Sendgrid

## DMARC
_dmarc  TXT     "v=DMARC1; p=quarantine; rua=mailto:[email protected]"

DNS 配置清单

## Setup Initial

[ ] A/AAAA records pour web
[ ] CNAME pour www et autres alias
[ ] MX records configurés (avec priorités)
[ ] SPF record (un seul, ~all)
[ ] DKIM configuré pour chaque service d'envoi
[ ] DMARC en mode monitoring (p=none)
[ ] CAA records (limiter les CA autorisées)
[ ] DNSSEC activé chez le registrar

## Après 2-4 semaines de monitoring

[ ] Analyser les rapports DMARC
[ ] Identifier les expéditeurs non authentifiés
[ ] Corriger ou ajouter les sources légitimes
[ ] Escalader DMARC vers p=quarantine
[ ] Puis vers p=reject

## Maintenance

[ ] Rotation DKIM tous les 6 mois
[ ] Review des rapports DMARC mensuellement
[ ] Vérifier le score sur mail-tester.com
[ ] Monitorer la réputation sur Google Postmaster

技能边界

此技能擅长的方面
  • 构建销售对话
  • 创建需求探索框架
  • 分析交易动态
  • 提出谈判方法建议
此技能无法做到的方面
  • 取代关系建立
  • 保证成交
  • 了解特定买家的心理
  • 制定定价决策

参考资料

邮件身份验证
DNS 安全
TTL
自动化
工具

相关技能

  • nurture-sequences/ - 邮件送达率会影响培育流程
  • distribution-engine/ - 营销自动化基础设施

技能版本:1.0 最后更新:2026-01-28 类别:devops

评论

支持 Markdown