2026年2月,贵州省通信管理局在工业互联网安全监测中发现,贵州某企业内网服务器被挖矿木马感染,持续向矿池IP 13.248.169.48 发起连接请求,挖矿客户端为XMRig。同期,俄罗斯APT组织“森林暴雪”(Forest Blizzard)自2025年8月起大规模入侵家庭及小型办公室路由器,通过篡改DNS设置将受害者流量导向恶意服务器,实施中间人攻击,已识别超过200家组织受影响。阻断挖矿和僵尸网络的核心,不是封域名,而是识别“最终要连的那个IP”——矿池IP、C2服务器IP。 本文从原理到实战,拆解如何通过本地IP查询风险情报实现DNS层的实时拦截。
一、为什么阻断IP比封域名更有效?
挖矿和僵尸网络攻击者常用的手段是快速更换域名(Domain Flux),但无论域名如何变化,背后C2服务器、矿池服务器的IP地址相对固定。他们为了追求稳定和带宽,通常租用云服务商的数据中心IP。这些IP具有以下特征:
net_type= 数据中心risk_score通常较高(>70)- 部分IP被威胁情报平台标记为“矿池”、“C2”、“僵尸网络”
- ASN归属云服务商或IDC机房
通过识别这些特征,可以在终端发起DNS解析或直连IP时直接阻断,而不需要等待域名黑名单更新。
二、IP离线库阻断的两种部署模式

2.1 模式一:集成到DNS服务器
在企业内部DNS服务器上,增加一个响应策略层:当客户端请求解析域名时,DNS服务器先查询该域名对应的A记录IP,然后调用离线库对该IP进行风险判断。如果判定为高风险(数据中心IP且risk_score>70),则返回虚假IP(如0.0.0.0)或直接拒绝解析。
优势:在DNS层面就完成阻断,客户端无法拿到恶意IP,有效切断连接。
2.2 模式二:集成到网络防火墙
在网络出口防火墙或EDR终端上,实时监控外连IP,通过调用离线库查询目标IP的风险特征。发现高风险IP时,立即阻断会话。
优势:即使客户端通过IP直连(绕过DNS),也能拦截。
以下以模式一为例,提供完整的集成代码。
三、实战集成:DNS服务器 + IP离线库阻断
第一步:部署离线库
下载离线库文件(.mmdb格式),放置于DNS服务器内网,应用启动时加载至内存。以下代码使用离线库SDK。
import ipdatacloud
# 加载IP数据云离线库(应用启动时加载,常驻内存,查询微秒级)
ip_lib = ipdatacloud.OfflineIPLib('/data/ipdb/ip_data_cloud.mmdb', enable_risk=True)
第二步:定义高风险IP判断函数
def is_malicious_ip(ip: str) -> bool:
info = ip_lib.query(ip)
net_type = info.get('net_type')
risk_score = info.get('risk_score', 0)
threat_tags = info.get('threat_tags', '')
# 规则1:数据中心IP且风险评分>70 -> 高度可疑
if net_type == '数据中心' and risk_score > 70:
return True
# 规则2:威胁标签包含矿池/C2相关关键词
if any(keyword in threat_tags.lower() for keyword in ['mining', 'c2', 'cobalt', 'beacon', 'botnet']):
return True
# 规则3:特定ASN归属(如已知恶意托管商)
asn_org = info.get('asn_org', '').lower()
if 'bitcoin' in asn_org or 'mining' in asn_org:
return True
return False
第三步:集成到DNS解析响应策略
使用DNS插件,结合外部HTTP API判断。更简单的做法是编写一个小型DNS代理服务,拦截响应。以下是一个简化的Python DNS代理示例:
from dnslib import *
from dnslib.server import DNSServer
import socket
class MaliciousDNSHandler:
def resolve(self, request, handler):
reply = request.reply()
qname = str(request.q.qname)
# 先尝试正常解析
try:
answers = socket.gethostbyname_ex(qname.rstrip('.'))
for ip in answers[2]:
if is_malicious_ip(ip):
# 发现恶意IP,返回虚假地址
reply.add_answer(RR(qname, QTYPE.A, rdata=A("0.0.0.0"), ttl=60))
print(f"阻断恶意域名 {qname} -> {ip}")
return reply
else:
reply.add_answer(RR(qname, QTYPE.A, rdata=A(ip), ttl=60))
except:
pass
return reply
server = DNSServer(MaliciousDNSHandler(), port=53, address='0.0.0.0')
server.start()
生产环境建议使用成熟DNS软件配合外部策略插件,或使用支持IP数据云离线库查询的DNS防火墙。核心逻辑一致:解析到IP后,用离线库判断风险,再决定是否放行。
四、实战案例:阻断挖矿通信
某制造企业部署上述方案后,DNS服务器每日可拦截数百至上千次对已知矿池或C2服务器的解析请求。典型场景:
- 内网一台服务器被植入挖矿木马,尝试解析矿池域名。DNS服务器解析到IP
13.248.169.48(该IP正是2026年2月贵州某企业挖矿事件中被查到的矿池IP),调用离线库查询,发现该IPnet_type,risk_score超过85,threat_tags包含“mining”。DNS服务器返回0.0.0.0,挖矿木马连接失败。 - 安全团队通过DNS日志溯源到失陷服务器,立即清理。
效果模拟: 该方案在类似企业的实际部署中,矿池及C2连接阻断率显著提升。相比仅依赖域名黑名单的方案,识别效率大幅改善,对正常业务的误拦率也处于较低水平,同时查询耗时从依赖云端API的百毫秒级降至微秒级。
五、总结
挖矿和僵尸网络通信的阻断,不应依赖不断失效的域名黑名单,而应直接定位到背后的恶意IP。该方案纯本地化部署,不依赖外网,单机QPS超250万,P99延迟0.35ms,是构建主动防御体系的数据底座。