飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • IP协议

    • 认识 IP 协议与网络层定位
    • IPv4 编址体系与分类地址
    • CIDR 与子网划分实战
    • IPv6 编址体系
    • ARP 协议详解
    • NDP 协议详解
    • IGMP 与 MLD 组播侦听发现
    • VRRP 与网关冗余
    • IPv4 数据报首部解析
    • IPv6 数据报与扩展首部
    • IPsec 安全扩展
    • 分片、MTU 与路径发现
    • ICMP 与 Traceroute 原理
    • 路由基础与转发流水线
    • 动态路由协议
    • NAT 网络地址转换
    • DHCP 与自动配置
    • Wireshark 与命令行工具
    • IPv6 过渡技术
    • IP 协议栈排障与攻击防御
  • TCP协议

    • 认识 TCP 协议与传输层定位
    • TCP 报文段首部解析
    • 三次握手与连接建立
    • 四次挥手与连接释放
    • TCP 有限状态机
    • 序列号与确认机制
    • 超时重传与 RTO 计算
    • 滑动窗口与流量控制
    • 拥塞控制基础
    • 现代拥塞控制算法
    • TCP 选项与扩展
    • TCP 性能调优与内核参数
    • Nagle 算法与糊涂窗口综合征
    • TCP 定时器与 Keep-Alive 机制
    • TCP 安全与攻击防御
    • TCP 与上层/下层交互
    • TCP 综合实践与排障

TCP 安全与攻击防御

TCP 层攻击面

TCP 的设计年代(1981 年 RFC 793)互联网还是学术网络,安全不是首要考虑。现代 TCP 实现需要防御多种攻击:

SYN Flood 与 SYN Cookie

攻击原理

攻击者伪造大量源 IP,发送 SYN 但不回复 ACK,占满服务端半连接队列:

防御:SYN Cookie(RFC 4987)

服务端收到 SYN 后不分配 TCB,而是计算 Cookie 放入 SYN-ACK 的序列号:

Cookie = Hash(客户端IP, 客户端端口, 服务端IP, 服务端端口, 时间戳, 秘密密钥)

合法客户端回复 ACK(Ack = Cookie + 1),服务端验证 Cookie 后才分配 TCB。

# Linux 开启 SYN Cookie
sysctl net.ipv4.tcp_syncookies=1

注意:SYN Cookie 有副作用:

  • 不支持 TCP 选项(如 Window Scale、SACK)的协商
  • 高负载时可能降低性能

序列号预测与连接劫持

攻击原理

如果 ISN 可预测,攻击者可以:

  1. 嗅探到客户端与服务端的连接
  2. 预测下一个 ACK 的序列号
  3. 伪造报文注入数据或 RST 切断连接

防御:ISN 随机化

现代操作系统使用强随机化策略:

  • Linux:基于密钥的伪随机生成器
  • 每个新连接使用不同 ISN
  • 增加 32 位秘密密钥,使预测计算上不可行
# Linux ISN 生成方式(不可调,内核自动处理)
# 旧版本可能使用较弱算法,建议保持内核更新

RST 攻击

攻击者伪造 RST 报文切断连接:

防御:

  • 现代系统要求 RST 的序列号落在接收窗口内才处理
  • 窗口外的 RST 被静默丢弃
  • 结合 ISN 随机化,攻击者难以构造有效序列号

TCP MD5 签名与 TCP-AO

BGP 等关键协议使用 TCP 连接,需要防止中间人篡改。

TCP MD5(RFC 2385,已废弃)

在 TCP 选项中加入 MD5 签名,验证报文完整性。但 MD5 已被破解,不再安全。

TCP-AO(TCP Authentication Option,RFC 5925)

替代 TCP MD5,使用更安全的 HMAC 算法(如 SHA-1、AES)。

# Linux 支持 TCP_MD5SIG(用于 BGP 等)
setsockopt(sockfd, TCP_MD5SIG, ...)

TIME_WAIT 与端口耗尽攻击

攻击者快速建立并关闭大量连接,让服务端进入大量 TIME_WAIT,耗尽端口:

# 攻击者脚本(示意)
for i in {1..65535}; do
    nc target_ip target_port &
done

防御:

  • tcp_tw_reuse=1:允许复用 TIME_WAIT 连接
  • 限制单 IP 连接数(iptables connlimit)
  • 应用层限流(Rate Limiting)

本篇小结

  • SYN Flood:伪造 SYN 占满半连接队列,用 SYN Cookie 防御
  • 序列号预测:ISN 随机化,现代系统已免疫
  • RST 攻击:伪造 RST 切断连接,窗口检查 + ISN 随机化防御
  • TCP-AO:替代 TCP MD5,为关键连接提供认证
  • TIME_WAIT 攻击:快速建连拆连耗尽端口,用 reuse + 限流防御

动手实践

  1. 查看 SYN Cookie 是否开启:

    sysctl net.ipv4.tcp_syncookies
    
  2. 用 hping3 模拟 SYN Flood(测试环境!):

    sudo hping3 -S -p 80 --flood --rand-source target_ip
    
  3. 观察半连接队列状态:

    watch -n 1 'ss -tan | grep SYN-RECV | wc -l'
    
  4. 思考:为什么 SYN Cookie 不支持 TCP 选项协商?如果客户端在 SYN 中请求 Window Scale,服务端用 SYN Cookie 回复,后续连接会怎样?

上一页
TCP 定时器与 Keep-Alive 机制
下一页
TCP 与上层/下层交互