基于 LSTM 的网络异常流量检测代码

在网络安全的攻防对抗中,AI 既可以作为攻击者的利器(如自动化漏洞挖掘、智能恶意流量生成),也可以成为防御者的坚实盾牌。对于防御方而言,利用 AI 进行异常流量检测恶意软件识别是目前最成熟且关键的实践方向。

下面这段代码展示了一个基于深度学习(LSTM 网络)的网络入侵检测系统原型。它通过学习正常网络流量的时序特征,来识别潜在的异常攻击(如 DDoS 或端口扫描)。

🛡️ 基于 LSTM 的网络异常流量检测代码

这段代码构建了一个模拟环境,生成包含“正常”和“攻击”特征的数据,并训练一个循环神经网络(RNN)来识别它们。

import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
from tensorflow.keras.utils import to_categorical
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler

# --- 1. 数据模拟与预处理 ---
def generate_network_traffic_data(samples=10000):
    """
    模拟网络流量数据。
    特征包括: [包大小, 包间隔时间, 协议类型(数值化), 标志位]
    标签: 0 = 正常流量, 1 = 攻击流量 (如 DDoS/扫描)
    """
    np.random.seed(42)
    
    # 生成正常流量 (相对平稳,符合高斯分布)
    normal_data = np.random.normal(loc=[500, 0.05, 1, 2], scale=[100, 0.01, 0.5, 0.5], size=(samples, 4))
    normal_labels = np.zeros(samples)
    
    # 生成攻击流量 (极端值,如大包、极快频率)
    attack_data = np.random.normal(loc=[1200, 0.001, 3, 1], scale=[300, 0.0005, 0.2, 0.2], size=(samples, 4))
    attack_labels = np.ones(samples)
    
    # 合并数据
    X = np.vstack((normal_data, attack_data))
    y = np.hstack((normal_labels, attack_labels))
    
    # 归一化特征 (对于神经网络训练至关重要)
    scaler = MinMaxScaler()
    X_scaled = scaler.fit_transform(X)
    
    # 重塑数据为 LSTM 输入格式 [样本数, 时间步长, 特征数]
    # 这里我们将每个包视为一个时间步,实际上可以使用滑动窗口处理流数据
    X_reshaped = X_scaled.reshape((X_scaled.shape[0], 1, X_scaled.shape[1]))
    
    return X_reshaped, y

# --- 2. 构建 AI 防御模型 (LSTM) ---
def build_ai_defense_model(input_shape):
    model = Sequential([
        # LSTM 层用于捕捉流量中的时序依赖关系
        LSTM(64, input_shape=input_shape, return_sequences=True),
        Dropout(0.2), # 防止过拟合
        LSTM(32, return_sequences=False),
        Dropout(0.2),
        Dense(16, activation='relu'),
        Dense(1, activation='sigmoid') # 二分类输出:正常或攻击
    ])
    
    model.compile(optimizer='adam',
                  loss='binary_crossentropy',
                  metrics=['accuracy'])
    return model

# --- 3. 主执行流程 ---
if __name__ == "__main__":
    print("🔍 正在生成模拟网络流量数据...")
    X, y = generate_network_traffic_data(samples=5000)
    
    # 划分训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    
    print("🛠️ 正在构建 AI 安全防御模型...")
    model = build_ai_defense_model((1, 4))
    
    print("🚀 开始训练模型 (模拟防御系统学习过程)...")
    # epochs=10 仅为演示,实际生产环境需要更多轮次
    history = model.fit(X_train, y_train, epochs=10, batch_size=32, validation_split=0.1, verbose=1)
    
    print("🧪 正在评估模型性能...")
    loss, accuracy = model.evaluate(X_test, y_test, verbose=0)
    
    print(f"\n✅ 训练完成!")
    print(f"📊 测试集准确率: {accuracy * 100:.2f}%")
    
    # --- 模拟实时检测 ---
    print("\n--- 实时流量检测模拟 ---")
    sample_idx = np.random.randint(0, len(X_test))
    prediction = model.predict(X_test[sample_idx:sample_idx+1], verbose=0)
    true_label = "攻击流量" if y_test[sample_idx] == 1 else "正常流量"
    pred_label = "攻击流量" if prediction[0][0] > 0.5 else "正常流量"
    
    print(f"真实情况: {true_label}")
    print(f"AI 判定: {pred_label} (置信度: {prediction[0][0]:.4f})")

💡 代码实践解析

  1. 数据特征工程

    • 代码模拟了网络数据包的四个关键特征:包大小包间隔时间协议类型TCP标志位
    • 为什么重要? 攻击流量(如 DDoS)通常表现为包大小异常大、发送频率极快(间隔极短)或标志位组合异常。AI 通过学习这些统计特征的分布来识别攻击。
  2. 模型选择 (LSTM)

    • 使用了长短期记忆网络(LSTM)。
    • 为什么重要? 网络攻击往往不是孤立的单点事件,而是具有时间序列特征的(例如端口扫描是一连串的动作)。LSTM 能够“记住”之前的流量状态,比传统的全连接网络更适合处理这种时序数据。
  3. 防御逻辑

    • 这是一个典型的二分类问题。模型输出一个 0 到 1 之间的概率值。
    • 如果输出 > 0.5,系统判定为“攻击”,并可以触发防火墙规则进行阻断。

🛡️ 实际部署建议

在真实的网络安全环境中,这套代码的演进方向包括:

  • 数据源接入:将 generate_network_traffic_data 替换为真实的日志解析器,读取 Zeek、Suricata 或防火墙日志。
  • 对抗样本防御:攻击者可能会尝试通过微调流量特征来欺骗 AI(对抗性攻击)。需要在训练中加入对抗样本训练,提高模型的鲁棒性。
  • 无监督学习:对于未知的 0-day 攻击,可以使用自编码器(Autoencoder)进行无监督训练,只学习“正常流量”的重构,重构误差大的即为异常流量。
posted @ 2026-03-30 22:06  左耳听风  阅读(1)  评论(0)    收藏  举报