基于 netfilter 修改 HTTP 数据包(插入、修改、删除)
一、 设计实现
1. 概述:
测试内核:3.13.0-32-generic(ubuntu14.04/centos7)
网关服务器上的内核模块,实现功能:
� 修改经过网关的 HTTP 数据包,修改前后数据长度可变。
tcp 数据包:next_seq = 当前 seq + 当前数据包长度
由于修改数据包长度后后续 tcp 连接 seq 以及 ack 都会发生变化,需要调用 nf_conntrack 会话跟踪模块中的方法跟
踪修改整个 tcp 连接后续的 seq 和 ack。
模块基于 netfilter hook 编写,在 NF_INET_FORWARD 数据包转发处挂在模块,hook 点信息:
{
.hook = hook_func,
.pf = NFPROTO_IPV4,
.hooknum = NF_INET_FORWARD,
.priority = NF_IP_PRI_MANGLE,
.owner = THIS_MODULE
},
2. 主要函数接口:
/* *
* Generic function for mangling variable-length address changes inside
* NATed TCP connections (like the PORT XXX,XXX,XXX,XXX,XXX,XXX
* command in FTP).
* */
static inline int nf_nat_mangle_tcp_packet(
struct sk_buff *skb,
struct nf_conn *ct,
enum ip_conntrack_info ctinfo,
// IP 头偏移量
unsigned int protoff,
// 插入点偏移量(距离 payload 首部)
unsigned int match_offset,
// 插入点覆盖长度
unsigned int match_len,
// 待插入数据
const char *rep_buffer,
// 带插入数据长度
unsigned int rep_len)