首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Netfilter字符串模块用法示例

Netfilter字符串模块用法示例
EN

Stack Overflow用户
提问于 2012-11-15 23:47:19
回答 3查看 3.3K关注 0票数 6

谁能给我举一些在netfilter中使用xt_string模块的例子,或者提供一个例子。我要做的是编写netfilter模块,该模块将丢弃在skb->数据字段中包含特定字符串的数据包。

我最初简单地尝试了strnstr(skb->data, "mystring", strlen("mystring")),但这似乎不是解决这个问题的正确方法(而且它似乎不起作用,因为我没有看到任何数据包被丢弃)。

提前感谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-16 13:12:23

如果您指的是在用户空间中使用iptables字符串匹配,这里有一个示例:

代码语言:javascript
复制
iptables -I INPUT 1 -p tcp --dport 80 -m string --string "domain.com" --algo kmp -j DROP

或者,如果你的意思是在内核空间,你可以使用提供KMP/BM/FSM算法的textsearch API,下面的例子来自内核源码lib/textsearch.c:

代码语言:javascript
复制
int pos;
struct ts_config *conf;
struct ts_state state;
const char *pattern = "chicken";
const char *example = "We dance the funky chicken";
conf = textsearch_prepare("kmp", pattern, strlen(pattern),
                             GFP_KERNEL, TS_AUTOLOAD);
if (IS_ERR(conf)) {
    err = PTR_ERR(conf);
    goto errout;
}
pos = textsearch_find_continuous(conf, &state, example, strlen(example));
if (pos != UINT_MAX)
    panic("Oh my god, dancing chickens at %d\n", pos);
textsearch_destroy(conf);
票数 6
EN

Stack Overflow用户

发布于 2015-10-18 18:34:41

你要找的可能就是这个,"skb_find_text“。它使用@Cong Wang提到的linux中的infra。您还可以在内核代码中找到一些示例。

票数 3
EN

Stack Overflow用户

发布于 2012-11-15 23:57:52

下面是netfilter的源代码。它是一个丢弃接收到的ICMP回声的模块

您可以使用此代码来帮助您开发模块。您只需从skb获取数据,然后进行检查。

代码语言:javascript
复制
#define __KERNEL__
#define MODULE
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/list.h>
#include <linux/netfilter_ipv4.h>
#include <linux/ip.h>
#include <linux/icmp.h>
#include <linux/netdevice.h>
#include <linux/netfilter.h>

#include <linux/skbuff.h>
#include <linux/string.h>
#include <linux/inet.h>

MODULE_LICENSE("GPL");


static struct nf_hook_ops netfilter_ops_in;/* IP PRE ROUTING */
static struct nf_hook_ops netfilter_ops_out; /* NF_IP_POST_ROUTING */
struct sk_buff *sock_buff;
struct iphdr *ip_header;
struct net_device *dev;
char *in_face = "eth0";
char *out_face = "eth1";

void log_ip(int sadd,int dadd)
{
    int b1,b2,b3,b4;
    b1 = 255 & sadd;
    b2 = (0xff00 & sadd) >> 8;
    b3 = (0xff0000 & sadd) >> 16;
    b4 = (0xff000000 &sadd) >>24;

    printk("SrcIP: %d.%d.%d.%d",b1,b2,b3,b4);

    b1 = 255 & dadd;
    b2 = (0xff00 & dadd) >> 8;
    b3 = (0xff0000 & dadd) >> 16;
    b4 = (0xff000000 & dadd) >>24;

    printk("  DstIP: %d.%d.%d.%d",b1,b2,b3,b4);
}

unsigned int main_hook(unsigned int hooknum,
                        const struct sk_buff *skb,
                        const struct net_device *in,
                        const struct net_device *out,
                        int(*okfn)(struct sk_buff*))
{
    struct icmphdr* icmp;
    sock_buff = skb_copy(skb,GFP_ATOMIC);
    ip_header = (struct iphdr*)(sock_buff->network_header);
    //ip_header = ip_hdr(sock_buff);

    icmp = (struct icmphdr*) ((char*)ip_header + sizeof(struct iphdr));
    //icmp = icmp_hdr(skb); /* do not return a good value in all cases*/
    log_ip(ip_header->saddr,ip_header->daddr);
    printk("  Dev:%s\n",sock_buff->dev);

    if (icmp->type == ICMP_ECHO)
    {
        printk("ICMP ECHO received and droped\n");
        return NF_DROP;
    }
    return NF_ACCEPT;
}

int init_module(void)
{
    netfilter_ops_in.hook       = main_hook;
    netfilter_ops_in.pf         = PF_INET;
    netfilter_ops_in.hooknum    = NF_INET_PRE_ROUTING; /*NF_INET_PRE_ROUTING;*/
    netfilter_ops_in.priority   = NF_IP_PRI_FIRST;

    nf_register_hook(&netfilter_ops_in);


    printk(KERN_INFO "sw: init_module() called\n");
    return 0;
}

void cleanup_module(void)
{
    printk(KERN_INFO "sw: cleanup_module() called\n");
    nf_unregister_hook(&netfilter_ops_in);
    //nf_unregister_hook(&netfilter_ops_out);
    printk(KERN_INFO "sw: hook unregisted, quit called\n");
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13401096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档