基于 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})")
💡 代码实践解析
-
数据特征工程:
- 代码模拟了网络数据包的四个关键特征:
包大小、包间隔时间、协议类型和TCP标志位。 - 为什么重要? 攻击流量(如 DDoS)通常表现为包大小异常大、发送频率极快(间隔极短)或标志位组合异常。AI 通过学习这些统计特征的分布来识别攻击。
- 代码模拟了网络数据包的四个关键特征:
-
模型选择 (LSTM):
- 使用了长短期记忆网络(LSTM)。
- 为什么重要? 网络攻击往往不是孤立的单点事件,而是具有时间序列特征的(例如端口扫描是一连串的动作)。LSTM 能够“记住”之前的流量状态,比传统的全连接网络更适合处理这种时序数据。
-
防御逻辑:
- 这是一个典型的二分类问题。模型输出一个 0 到 1 之间的概率值。
- 如果输出 > 0.5,系统判定为“攻击”,并可以触发防火墙规则进行阻断。
🛡️ 实际部署建议
在真实的网络安全环境中,这套代码的演进方向包括:
- 数据源接入:将
generate_network_traffic_data替换为真实的日志解析器,读取 Zeek、Suricata 或防火墙日志。 - 对抗样本防御:攻击者可能会尝试通过微调流量特征来欺骗 AI(对抗性攻击)。需要在训练中加入对抗样本训练,提高模型的鲁棒性。
- 无监督学习:对于未知的 0-day 攻击,可以使用自编码器(Autoencoder)进行无监督训练,只学习“正常流量”的重构,重构误差大的即为异常流量。

浙公网安备 33010602011771号