You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Bash检查SPF查询限制?求相关实现方案或现成脚本

检测SPF记录DNS查询超限的Bash实现

核心逻辑说明

SPF标准规定,解析一条SPF记录时,DNS查询总次数(含include/redirect引用、a/mx等机制触发的递归查询)不得超过10次,超限会导致SPF验证失败。要实现检测,需递归解析SPF记录中的所有引用并统计查询次数。

实现代码片段

以下是基于dig工具的简化实现,可直接集成到你的现有脚本中:

#!/bin/bash

# 全局变量:统计DNS查询次数
query_count=0

# 递归解析SPF记录并计数
resolve_spf() {
    local domain="$1"
    # 获取目标域名的SPF TXT记录
    local spf_record=$(dig +short TXT "$domain" | grep -E '^v=spf1' | head -n1)
    
    [ -z "$spf_record" ] && return

    # 拆分SPF记录的各个机制
    IFS=' ' read -ra mechanisms <<< "$spf_record"
    
    for mechanism in "${mechanisms[@]}"; do
        case "$mechanism" in
            include:*)
                local included_domain="${mechanism#include:}"
                ((query_count++))
                resolve_spf "$included_domain"
                ;;
            redirect=*)
                local redirect_domain="${mechanism#redirect=}"
                ((query_count++))
                resolve_spf "$redirect_domain"
                ;;
            a:*)
                local a_domain="${mechanism#a:}"
                ((query_count++))
                dig +short A "$a_domain" > /dev/null
                ;;
            a)
                ((query_count++))
                dig +short A "$domain" > /dev/null
                ;;
            mx:*)
                local mx_domain="${mechanism#mx:}"
                # 每条MX记录对应一次DNS查询
                local mx_count=$(dig +short MX "$mx_domain" | wc -l)
                ((query_count+=mx_count))
                ;;
            mx)
                local mx_count=$(dig +short MX "$domain" | wc -l)
                ((query_count+=mx_count))
                ;;
            ptr)
                ((query_count++))
                ;;
            # ip4/ip6/all等无需DNS查询的机制直接跳过
            ip4:*)|ip6:*)|all)
                ;;
            *)
                ;;
        esac
    done
}

# 主检测函数
check_spf_query_limit() {
    local target_domain="$1"
    query_count=0
    
    # 初始查询目标域名的SPF记录,计入次数
    ((query_count++))
    resolve_spf "$target_domain"
    
    echo "目标域名: $target_domain"
    echo "SPF总DNS查询次数: $query_count"
    if [ "$query_count" -gt 10 ]; then
        echo "结果: SPF查询次数超限(超过10次限制)"
    else
        echo "结果: SPF查询次数符合标准限制"
    fi
}

# 使用示例:替换为你要检测的域名
# check_spf_query_limit "your-domain.com"

注意事项

  • 需确保系统已安装dig工具(通常包含在dnsutils包中)。
  • 代码中对相对域名(如a:sub)做了简化处理,实际场景中可添加域名拼接逻辑完善准确性。
  • 若需更精准的记录解析,可将dig +short替换为dig +noall +answer,避免过滤掉关键信息。

内容的提问来源于stack exchange,提问作者Dame Bizimoski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:15:33