1. 引言:DDoS 攻击溯源之困
分布式拒绝服务(DDoS)攻击因其流量来源分散、IP 伪造容易、攻击路径隐蔽等特点,一直是网络安全领域的"顽疾"。传统的防御手段如流量清洗、黑洞路由等,虽能缓解攻击影响,却难以回答一个根本问题:攻击究竟来自哪里? 缺乏有效的溯源能力,意味着防御始终处于被动,攻击者可以肆无忌惮地反复发动攻击。
本文将介绍一种结合 DNS 水印标记 与 区块链存证 的双重保险溯源方案。该方案旨在解决攻击流量身份标识与证据链可信存证两大核心难题,为主动防御和司法追责提供技术支撑。
2. 核心思路:双保险溯源架构
整体方案分为两个阶段:
- 攻击流量标记阶段(DNS 水印):在攻击流量进入网络时,通过精心设计的 DNS 查询序列,将独特的"水印"信息嵌入到攻击包中。该水印如同隐形标签,伴随攻击流量抵达目标。
- 证据固化存证阶段(区块链):在检测到攻击并提取出水印信息后,立即将关键证据(如时间戳、水印特征、源 IP 片段、目标信息)上链。利用区块链的不可篡改、可追溯特性,构建一条司法级可信证据链。
双保险意味着:DNS 水印解决了"如何标记"的问题,区块链解决了"如何让标记可信"的问题。
3. 技术实现一:DNS 水印标记
3.1 水印生成与嵌入
水印本质是一段携带特定信息的编码。我们可以利用 DNS 查询的 qname 字段(查询域名)进行信息携带。
python
import hashlib
import base64
import time
def generate_watermark(attacker_ip_snippet, target_domain):
"""生成水印信息"""
timestamp = int(time.time())
# 组合信息:时间戳 + 攻击者IP片段 + 目标域名
raw_data = f"{timestamp}:{attacker_ip_snippet}:{target_domain}"
# 使用哈希生成固定长度摘要,并做Base64编码缩短
hash_obj = hashlib.sha256(raw_data.encode()).digest()
watermark = base64.urlsafe_b64encode(hash_obj[:12]).decode() # 取前12字节,生成16字符编码
return watermark
def embed_watermark_into_dns_query(watermark):
"""将水印嵌入到DNS查询域名中"""
# 构造一个特殊的子域名,水印作为其中一部分
# 例如:watermark-{编码}.monitor.example.com
query_domain = f"{watermark}.trace.monitor.example.com"
return query_domain
示例:假设检测到可疑流量来自 192.168.1.100,攻击目标为 api.example.com
watermark = generate_watermark("192.168.1.100", "api.example.com")
dns_query = embed_watermark_into_dns_query(watermark)
print(f"生成的水印: {watermark}")
print(f"构造的DNS查询: {dns_query}")
输出示例:
生成的水印: A1B2C3D4E5F6G7H8
构造的DNS查询: A1B2C3D4E5F6G7H8.trace.monitor.example.com
在网关或流量镜像点,检测到疑似攻击流量时,程序自动生成水印,并立即向上述构造的域名发起一次 DNS 查询。这次查询的请求包会经过网络路径,最终(可能)到达我们控制的权威 DNS 服务器,从而被记录。
3.2 水印提取与关联
在受害者侧或流量清洗中心,我们需要部署水印检测模块:
- 流量监听:监听所有到达的 DNS 响应包(或镜像流量中的 DNS 请求)。
- 模式匹配 :识别指向我们监控域名(如
*.trace.monitor.example.com)的查询。 - 水印解码:从查询域名中提取出水印编码部分。
- 关联分析:将提取出的水印与当前正在遭受的攻击流量进行时间、频率等维度关联,确认其是否为攻击标记。
python
import re
def extract_watermark_from_dns_query(query_domain):
"""从DNS查询域名中提取水印"""
pattern = r'^([A-Za-z0-9_-]+).trace.monitor.example.com$'
match = re.match(pattern, query_domain)
if match:
return match.group(1) # 返回水印编码
return None
模拟捕获到一个DNS查询
captured_query = "A1B2C3D4E5F6G7H8.trace.monitor.example.com"
extracted_watermark = extract_watermark_from_dns_query(captured_query)
print(f"从查询 '{captured_query}' 中提取的水印: {extracted_watermark}")
4. 技术实现二:区块链存证
4.1 存证数据结构
提取到水印并确认与攻击关联后,需要将证据上链。存证数据应包含:
- 水印(Watermark):唯一标识此次攻击标记。
- 攻击时间戳(Attack Timestamp):检测到攻击的时间。
- 目标信息(Target):遭受攻击的域名或IP。
- 源信息摘要(Source Digest):攻击流量的特征摘要(如IP前缀、协议类型)。
- 检测节点签名(Signature):由检测节点私钥签名,确保证据来源可信。
javascript
// 存证数据结构的示例(JSON格式)
const evidenceRecord = {
"version": "1.0",
"watermark": "A1B2C3D4E5F6G7H8",
"attackTimestamp": 1743924218,
"target": "api.example.com",
"sourceDigest": "sha256_of_ip_and_protocol",
"signature": "EcdsaSignatureByDetectorNode",
"metadata": {
"detectorId": "node-01",
"geoInfo": "AS4134, CN"
}
};
4.2 上链操作(以以太坊智能合约为例)
部署一个简单的存证合约,提供提交证据的方法。
solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract DDosEvidenceLedger {
struct Evidence {
string watermark;
uint256 attackTimestamp;
string target;
string sourceDigest;
string signature;
address submitter;
uint256 blockTimestamp;
}
Evidence[] public evidences;
mapping(string => bool) public watermarkUsed; // 防止重复提交
event EvidenceSubmitted(uint256 indexed evidenceId, string watermark, address submitter);
function submitEvidence(
string memory _watermark,
uint256 _attackTimestamp,
string memory _target,
string memory _sourceDigest,
string memory _signature
) public {
require(!watermarkUsed[_watermark], "Watermark already used");
evidences.push(Evidence({
watermark: _watermark,
attackTimestamp: _attackTimestamp,
target: _target,
sourceDigest: _sourceDigest,
signature: _signature,
submitter: msg.sender,
blockTimestamp: block.timestamp
}));
watermarkUsed[_watermark] = true;
uint256 newEvidenceId = evidences.length - 1;
emit EvidenceSubmitted(newEvidenceId, _watermark, msg.sender);
}
function getEvidenceCount() public view returns (uint256) {
return evidences.length;
}
}
检测节点通过调用 submitEvidence 函数,将证据结构体上链。一旦交易确认,证据即被永久、不可篡改地记录在区块链上。
5. 双保险溯源流程全景
- 攻击发生:攻击者发起 DDoS 攻击,流量经过部署了水印注入点的网络。
- 水印注入:注入点检测到攻击特征,生成唯一水印,并立即发起一次携带该水印的 DNS 查询。
- 攻击抵达:攻击流量(可能混合着正常流量)抵达目标。
- 水印检测:目标侧的检测模块从流量中捕获到 DNS 水印查询,提取出水印编码。
- 证据生成:检测模块将水印、攻击时间、目标、流量特征等信息打包,并用私钥签名,生成证据记录。
- 区块链存证:通过智能合约将证据记录提交到区块链网络。
- 溯源验证:安全人员或司法机构可根据水印,在区块链上查询到完整的、时间戳可信的攻击证据,结合其他日志(如防火墙日志、NetFlow),完成攻击路径还原与责任认定。
6. 方案优势与挑战
6.1 优势
- 隐蔽性强:DNS 查询是网络中的常见行为,水印查询混杂其中,不易被攻击者察觉和过滤。
- 抗干扰性好:水印基于哈希和编码,短小精悍,即使查询丢失部分,也有一定冗余可恢复。
- 证据链可信:区块链确保了证据的不可篡改性与时间戳权威性,达到了司法存证要求。
- 去中心化:不依赖于单一中心化日志服务器,避免了证据被单点破坏或篡改的风险。
6.2 挑战与应对
- DNS 查询延迟与丢失:网络拥堵可能导致 DNS 查询丢失。应对:可设计重传机制,或使用多个水印注入点提高成功率。
- 区块链成本与性能:公链上链有 Gas 成本,且存在延迟。应对:可采用联盟链或侧链方案,在安全与效率间取得平衡。
- 隐私与合规:记录 IP 等信息需符合 GDPR 等数据保护法规。应对:存证时只记录摘要(如 IP 前缀哈希),而非完整 IP。
7. 总结
"DNS 水印标记 + 区块链存证"的双保险溯源方案,为应对 DDoS 攻击这一"打了就跑"的难题提供了一种主动、可信的技术思路。它不仅在技术层面实现了攻击流量的标记与追踪,更在证据层面利用区块链构建了防篡改的信任基石。随着区块链基础设施的完善和网络安全需求的升级,此类结合传统网络协议与新型信任技术的方案,有望成为未来主动防御体系中的重要一环。
当然,该方案仍需在实际网络环境中进行大量测试与优化,并与现有的流量分析、威胁情报系统进行整合,才能发挥最大效能。