第7章:网络安全(Network Security)
一、导读
1.1 本章学习目标
第7章讲解网络安全的基础知识——从密码学原理到安全协议,从防火墙到 DDoS 防御。网络安全是互联网面临的最大挑战之一,理解其基本原理是每个网络工程师的必修课。
本章核心学习目标:
- 掌握对称加密和公钥加密:AES、RSA 的基本原理
- 理解数字签名和证书:如何验证身份和完整性?
- 掌握 TLS 协议:HTTPS 的安全基础
- 理解防火墙和 IDS:网络防御的基本工具
- 了解 DDoS 攻击与防御
1.2 为什么本章如此重要
网络安全威胁日益严峻,从数据泄露到 DDoS 攻击,从中间人攻击到供应链攻击。理解安全原理是保护系统的基础。
1.3 核心问题引导
为什么对称加密需要密钥分发,而公钥加密不需要?
TLS 握手过程中,如何防止中间人攻击?
DDoS 攻击为什么难以防御?
二、核心概念详解
2.1 密码学基础
对称加密:
- 加密和解密使用相同的密钥
- 算法: AES-256, ChaCha20
- 优势: 速度快
- 劣势: 密钥分发困难
- 应用: 数据加密、VPN
公钥加密 (非对称加密):
- 公钥加密,私钥解密
- 算法: RSA, ECC
- 优势: 解决密钥分发问题
- 劣势: 速度慢(比对称加密慢 100-1000 倍)
- 应用: 密钥交换、数字签名
混合加密 (TLS 使用):
1. 使用公钥加密协商会话密钥
2. 使用对称加密加密实际数据
→ 兼顾安全性和性能2.2 TLS 协议
TLS 1.3 握手 (1-RTT):
Client Server
|---ClientHello--------------------->|
| (支持的密码套件, key_share, |
| supported_versions, ...) |
| |
|<---ServerHello--------------------|
| (选择的密码套件, key_share, |
| encrypted_extensions) |
| |
|<---Certificate--------------------|
| (服务器证书) |
| |
|<---CertificateVerify--------------|
| (用私钥签名握手消息) |
| |
|<---Finished----------------------|
| (握手消息 MAC) |
| |
|---Finished----------------------->|
| |
|======== 加密数据传输 =============|
TLS 1.3 改进:
- 1-RTT 握手 (TLS 1.2 需要 2-RTT)
- 0-RTT 恢复 (之前连接过的服务器)
- 移除不安全的密码套件 (RSA 密钥传输, CBC, RC4)
- 前向保密成为强制要求
证书链验证:
根 CA → 中间 CA → 服务器证书
每一级用上一级的私钥签名
客户端内置根 CA 的公钥2.3 防火墙与 IDS
防火墙类型:
1. 包过滤防火墙:
- 基于 IP、端口、协议过滤
- 快速但粗糙
2. 状态检测防火墙:
- 跟踪连接状态
- 只允许已建立连接的返回流量
3. 应用层防火墙 (代理):
- 理解应用协议
- 可以过滤 HTTP 请求内容
IDS (入侵检测系统):
- 基于签名: 匹配已知攻击模式
- 基于异常: 检测偏离正常行为的活动
- IPS: 入侵防御系统(检测 + 自动阻断)2.4 DDoS 攻击与防御
DDoS 攻击类型:
1. 容量耗尽型:
- UDP 洪水: 发送大量 UDP 包
- DNS 放大: 利用 DNS 响应放大流量
- NTP 放大: 利用 NTP monlist 命令
2. 协议型:
- SYN Flood: 大量半开连接耗尽资源
- Ping of Death: 超大 ICMP 包
3. 应用层:
- HTTP Flood: 大量 HTTP 请求
- Slowloris: 慢速连接占用资源
防御措施:
- 流量清洗: 识别并丢弃恶意流量
- 速率限制: 限制单 IP 的请求速率
- Anycast: 分散流量到多个数据中心
- CDN: 利用边缘节点吸收攻击流量
- BGP 黑洞路由: 丢弃指向目标的流量(最后手段)三、实战案例
3.1 案例一:TLS 证书验证
python
import ssl
import socket
import datetime
def check_tls_cert(hostname, port=443):
"""检查网站的 TLS 证书"""
context = ssl.create_default_context()
with socket.create_connection((hostname, port)) as sock:
with context.wrap_socket(sock, server_hostname=hostname) as ssock:
cert = ssock.getpeercert()
print(f"主机: {hostname}")
print(f"TLS 版本: {ssock.version()}")
print(f"密码套件: {ssock.cipher()}")
print(f"证书主题: {dict(x[0] for x in cert['subject'])}")
print(f"颁发者: {dict(x[0] for x in cert['issuer'])}")
print(f"有效期: {cert['notBefore']} - {cert['notAfter']}")
print(f"SAN: {[x[1] for x in cert['subjectAltName']]}")
# 检查过期
not_after = datetime.datetime.strptime(
cert['notAfter'], '%b %d %H:%M:%S %Y %Z')
days_left = (not_after - datetime.datetime.utcnow()).days
print(f"剩余天数: {days_left}")
check_tls_cert("www.google.com")四、本章小结
对称加密速度快但密钥分发困难,公钥加密解决密钥分发但速度慢
TLS 结合两者优势,通过证书验证防止中间人攻击
防火墙和 IDS 是网络防御的基本工具
DDoS 攻击通过流量淹没或资源耗尽使服务不可用
五、思考与练习
思考题
为什么 TLS 1.3 要求前向保密?
DDoS 反射放大攻击的原理是什么?如何防御?
编程练习
实现一个简单的 TLS 客户端,验证服务器证书。
实现基于速率限制的 DDoS 防御模块。