丢弃包含字符串linux内核模块的数据包

时间:2019-01-15 05:04:47

标签: linux kernel kernel-module netfilter

我正在尝试删除包含字符串的网络数据包:即,如果网页上显示“免费下载”,我需要我的内核模块删除包含该字符串的数据包。我正在尝试通过netfilter钩子中的sk_buff进行扫描,但不确定是否是查找字符串的正确位置。这是代码:

unsigned int hook_func_outgoing(void *priv,
                struct sk_buff *skb,
                const struct nf_hook_state *state) {
    int pos;
    struct ts_config *conf;
    struct ts_state statetext;
    const char *pattern = "free download";

    conf = textsearch_prepare("kmp", pattern, strlen(pattern),
                             GFP_KERNEL, TS_AUTOLOAD);

    pos = textsearch_find_continuous(conf, &statetext, skb->data, skb->len);
    printk(KERN_INFO "pos: %d", pos); 
    printk(KERN_INFO "data: %s ", skb->data); 
    if (pos != UINT_MAX){
            return NF_DROP; 
        printk(KERN_INFO "found spam\n");
    }
    textsearch_destroy(conf);
    return NF_ACCEPT; 
}

1 个答案:

答案 0 :(得分:2)

这听起来并不容易。

我还不太了解编写用于网络过滤的内核模块,因此我无法对您的代码发表评论。但是我认为这里的主要问题是您只能访问“原始”数据包。 当今的Internet大多使用TLS(https)加密,因此您无法在该级别上读取传输的内容(很好)。这意味着您的模块只能在未加密的HTTP连接上工作。另一个问题可能是像GZIP这样的HTTP压缩,它也可能会扰乱您的数据。