没有产品在购物车中。
DNS 安全工具:使用 Python 监控和检测DDoS攻击

 
在当今的网络世界中,保护 DNS 流量至关重要。DNS 是互联网的核心协议之一,经常成为攻击者发动 DDoS 和 DoS 攻击的目标。
监控 DNS 流量中是否存在异常大的数据包有助于及早发现这些攻击。
本文创建一个基于 Python 的工具,使用pyshark和colorama来监控 DNS 流量。
Windows:
Add Python to PATH   → 安装python --version   显示版本号  macOS/Linux:
bash
# 系统通常预装Python3,直接验证python3 --version打开终端(Windows用CMD/PowerShell)执行:
bash
pip install pyshark colorama
Windows:
Install TShark(重要!)  macOS:
bash
brew install wiresharkLinux (Ubuntu/Debian):
bash
sudo apt-get install tshark
01
模块概述与代码实现
该工具将在检测到超过指定字节大小的 DNS 数据包时向网络管理员发出警报,表明存在潜在的 DDoS 或 DoS 攻击。
为了构建此工具,我们将使用以下 Python 模块:
Pyshark: Wireshark数据包捕获工具的 Python 包装器,允许我们实时监控网络流量。
首先,我们先把所需要的库进行导入:
 
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}")
 
主执行块  
  
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:
打开CMD执行:
cmd
ipconfig
 
可以看到我们正在使用的WLAN接口!
根据系统选择以下命令:
Windows(管理员权限运行):
  
python Demo.py -i "WLAN" -t 50
 
 
为了便于展示我们将阈值设置为50,在py文件所在目录下,运行cmd代码。
  
 
打开浏览器访问:
http://example.com
http://google.combash
# 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()