一、语音视频App常见攻击场景
- 窃听与数据篡改
- 攻击方式:中间人攻击(MITM)拦截RTP/RTSP流
- 风险:用户隐私泄露、通话内容被篡改
- DDoS攻击
- 攻击方式:UDP Flood攻击媒体服务器端口(如3478/5349)
- 风险:服务瘫痪、高额带宽成本
- 伪造身份与恶意接入
- 攻击方式:伪造信令服务器身份加入会议
- 风险:会议内容泄露、垃圾消息刷屏
二、核心防御方案与代码实现
1. 加密传输:SRTP+DTLS双重保障
WebRTC安全配置示例(JavaScript):
// 创建PeerConnection时强制加密
const pc = new RTCPeerConnection({
iceServers: [{ urls: "stun:stun.example.com" }],
encodedInsertableStreams: true, // 启用帧级加密
sdpSemantics: "unified-plan"
});
// 强制使用DTLS
pc.createDataChannel("chat", { negotiated: true, id: 0 });
服务端SRTP配置(C++示例):
#include <srtp2/srtp.h>
srtp_policy_t policy;
memset(&policy, 0, sizeof(policy));
srtp_crypto_policy_set_aes_cm_128_hmac_sha1_80(&policy.rtp);
srtp_crypto_policy_set_aes_cm_128_hmac_sha1_80(&policy.rtcp);
policy.ssrc.type = ssrc_any_inbound;
policy.key = (uint8_t*)"your_32byte_key_here";
policy.window_size = 1024;
policy.allow_repeat_tx = 0;
srtp_t session;
srtp_create(&session, &policy);
2. 身份认证与权限控制
信令服务器鉴权(Node.js):
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
// 客户端连接时验证Token
app.ws('/signal', (ws, req) => {
const token = req.query.token;
try {
const decoded = jwt.verify(token, 'SECRET_KEY');
if(decoded.room !== req.query.roomId) {
ws.close(4001, 'Unauthorized');
}
} catch (err) {
ws.close(4000, 'Invalid Token');
}
});
权限粒度控制(API示例):
# 生成会议Token(Python示例)
import jwt
token = jwt.encode({
"user_id": "user123",
"room": "meeting_567",
"permissions": ["audio_send", "video_recv"] # 细粒度权限
}, 'SECRET_KEY', algorithm='HS256')
3. 抗DDoS架构设计
边缘节点流量清洗(Nginx配置):
# 限制UDP包速率(防御UDP Flood)
limit_udp_zone zone=udp_flood:10m rate=1000r/s;
server {
listen 3478 udp;
proxy_pass media_servers;
limit_udp zone=udp_flood burst=2000;
}
自动扩容脚本(AWS CLI):
#!/bin/bash
TRAFFIC=$(vnstat --json | jq '.interfaces[0].traffic.total.rx')
if [ $TRAFFIC -gt 1000000000 ]; then # 流量超过1Gbps
aws autoscaling set-desired-capacity \
--auto-scaling-group-name media-asg \
--desired-capacity 10
fi
三、攻击检测与应急响应
1. 异常流量实时告警
Prometheus监控规则:
groups:
- name: voip_alerts
rules:
- alert: AudioPacketLossHigh
expr: avg(rtp_packet_loss_percent{service="audio"}) > 15
for: 2m
labels:
severity: critical
annotations:
summary: "音频流丢包率过高(疑似攻击)"
2. 自动封禁恶意IP(Python脚本)
from scapy.all import sniff, UDP
from collections import defaultdict
import os
udp_counter = defaultdict(int)
def handle_packet(pkt):
if pkt.haslayer(UDP) and pkt[UDP].dport == 3478:
src_ip = pkt[IP].src
udp_counter[src_ip] += 1
if udp_counter[src_ip] > 5000: # 每秒5000包
os.system(f"iptables -A INPUT -s {src_ip} -j DROP")
print(f"封禁攻击IP: {src_ip}")
sniff(filter="udp", prn=handle_packet, store=0)