DNS 安全工具:使用 Python 监控和检测DDoS攻击

3月 18, 202536 mins read

DNS 安全工具:使用 Python 监控和检测DDoS攻击

0250319001041DNS 安全工具:使用 Python 监控和检测DDoS攻击
 

在当今的网络世界中,保护 DNS 流量至关重要。DNS 是互联网的核心协议之一,经常成为攻击者发动 DDoS 和 DoS 攻击的目标。  

监控 DNS 流量中是否存在异常大的数据包有助于及早发现这些攻击。  

本文创建一个基于 Python 的工具,使用pyshark和colorama来监控 DNS 流量。  

环境准备(首次使用需操作)  

 1.安装Python  

  • Windows  

    • 访问官网 python.org
    • 下载安装包 → 勾选 Add Python to PATH   → 安装
    • 验证安装:打开CMD输入 python --version   显示版本号  
  • macOS/Linux  

    bash  

     
    # 系统通常预装Python3,直接验证python3 --version

2. 安装代码依赖库  

打开终端(Windows用CMD/PowerShell)执行:  

bash  

 
pip install pyshark colorama

3. 安装抓包工具(必须)  

  • Windows  

    • 下载安装 Wireshark
    • 安装时勾选 Install TShark(重要!)  
  • macOS  

    bash  

     
    brew install wireshark
  • Linux (Ubuntu/Debian)  

    bash  

     
    sudo apt-get install tshark


01

模块概述与代码实现

该工具将在检测到超过指定字节大小的 DNS 数据包时向网络管理员发出警报,表明存在潜在的 DDoS 或 DoS 攻击。  

为了构建此工具,我们将使用以下 Python 模块:  

Pyshark: Wireshark数据包捕获工具的 Python 包装器,允许我们实时监控网络流量。  

  • Argparse:处理命令行参数的模块,支持定制网络接口和字节大小阈值。
  • Colorama:一个简化彩色终端输出的库,使警报更加引人注目且更易于阅读。  

首先,我们先把所需要的库进行导入:


 

import pyshark
import argparse
from colorama import Fore, Style, init

# 重要:指定tshark路径(根据您提供的路径)
pyshark.tshark.tshark.TSHARK_PATH = r'E:\tshark.exe'


 

我们的工具以 Python 编写,核心逻辑封装在一个名为 DNSSecurityTool 的类中,具体实现步骤如下:  

初始化:    
 在 __init__ 方法中,我们设置了监控的网络接口(我们选择了WLAN接口)和警报阈值(选择 50 字节便于展示)。  


 

class DNSSecurityTool:
    def __init__(self, interface='eth0', threshold=1000):
        self.interface = interface
        self.threshold = threshold


 

数据包回调:    
 packet_callback 方法实时分析每个捕获的数据包。一旦发现 DNS 数据包大小超过阈值,工具会立即发出红色警报,显示数据包大小和来源 IP。  

 

    def packet_callback(self, packet):
        try:
            if hasattr(packet, 'dns'):
                packet_size = int(packet.length)
                if packet_size > self.threshold:
                    src_ip = packet.ip.src
                    print(
                        f"{Fore.RED}【警报】检测到大流量DNS数据包!"
                        f"\n大小: {packet_size} 字节 | 来源IP: {src_ip}{Style.RESET_ALL}\n")
        except AttributeError:
            pass


 


 


 


 

开始监控:    
 start_monitoring 方法启动实时捕获,持续监控网络流量,直至用户手动停止。  


 


 


 

    def start_monitoring(self):
        print(f"{Fore.GREEN}▶ 开始DNS流量监控(网卡:{self.interface})...{Style.RESET_ALL}")
        try:
            capture = pyshark.LiveCapture(
                interface=self.interface,
                tshark_path=r'E:\tshark.exe'
            )
            capture.apply_on_packets(self.packet_callback)
        except KeyboardInterrupt:
            print(f"\n{Fore.YELLOW}▶ 监控已被用户终止{Style.RESET_ALL}")


 


主执行块  

  • 初始化 colorama,确保终端输出美观。
  • 使用 argparse 解析命令行参数,用户可轻松自定义监控接口和阈值。
  • 创建 DNSSecurityTool 实例并启动监控,满足不同网络环境的需求。  


  

if __name__ == "__main__":
    init(autoreset=True)  # 初始化颜色输出

    # 中文化参数帮助信息
    parser = argparse.ArgumentParser(description="DNS安全监控工具 - 用于检测DDoS/DoS攻击")
    parser.add_argument("-i", "--interface",
                        type=str,
                        default='WLAN',  # 默认使用WLAN接口
                        help="监控的网络接口名称(默认:WLAN)")
    parser.add_argument("-t", "--threshold",
                        type=int,
                        default=1000,
                        help="触发警报的数据包大小阈值(单位:字节,默认:1000)")

    args = parser.parse_args()

    dns_tool = DNSSecurityTool(interface=args.interface, threshold=args.threshold)
    dns_tool.start_monitoring()


 
 

确定网卡名称  

  • Windows  

    1. 打开CMD执行:  

      cmd  

       
      ipconfig
    2. 找到正在使用的连接(如"以太网"或"WLAN")  

sfnikidf45
 

可以看到我们正在使用的WLAN接口!  

运行测试命令  

根据系统选择以下命令:  

Windows(管理员权限运行)  


  

python Demo.py -i "WLAN" -t 50


 


 

为了便于展示我们将阈值设置为50,在py文件所在目录下,运行cmd代码。  

  cdlsd
 

触发警报测试方法  

方法1:浏览器访问  

  1. 保持监控程序运行  
  2. 打开浏览器访问:  

    http://example.com
    http://google.com

方法2:命令行生成流量(新开终端):  

bash  

 
# Windows:nslookup microsoft.comnslookup amazon.com# macOS/Linux:dig google.com ANYnslookup -type=any apple.com0


 

import pyshark
import argparse
from colorama import Fore, Style, init

# 重要:指定tshark路径(根据您提供的路径)
pyshark.tshark.tshark.TSHARK_PATH = r'E:\tshark.exe'

class DNSSecurityTool:
    def __init__(self, interface='WLAN', threshold=1000):  # 默认接口改为WLAN
        self.interface = interface
        self.threshold = threshold

    def packet_callback(self, packet):
        try:
            if hasattr(packet, 'dns'):
                packet_size = int(packet.length)
                if packet_size > self.threshold:
                    src_ip = packet.ip.src
                    print(
                        f"{Fore.RED}【警报】检测到大流量DNS数据包!"
                        f"\n大小: {packet_size} 字节 | 来源IP: {src_ip}{Style.RESET_ALL}\n")
        except AttributeError:
            pass

    def start_monitoring(self):
        print(f"{Fore.GREEN}▶ 开始DNS流量监控(网卡:{self.interface})...{Style.RESET_ALL}")
        try:
            capture = pyshark.LiveCapture(
                interface=self.interface,
                tshark_path=r'E:\tshark.exe'
            )
            capture.apply_on_packets(self.packet_callback)
        except KeyboardInterrupt:
            print(f"\n{Fore.YELLOW}▶ 监控已被用户终止{Style.RESET_ALL}")


if __name__ == "__main__":
    init(autoreset=True)  # 初始化颜色输出

    # 中文化参数帮助信息
    parser = argparse.ArgumentParser(description="DNS安全监控工具 - 用于检测DDoS/DoS攻击")
    parser.add_argument("-i", "--interface",
                        type=str,
                        default='WLAN',  # 默认使用WLAN接口
                        help="监控的网络接口名称(默认:WLAN)")
    parser.add_argument("-t", "--threshold",
                        type=int,
                        default=1000,
                        help="触发警报的数据包大小阈值(单位:字节,默认:1000)")

    args = parser.parse_args()

    dns_tool = DNSSecurityTool(interface=args.interface, threshold=args.threshold)
    dns_tool.start_monitoring()


 

 
图像通讯
图标主要
通讯

订阅我们的时事消息

单击按钮即表示您同意我们的条款和条件