Articles of netfilter

libnetfilter_queue编程,我怎么知道哪个程序发送数据包?

我试图为Linux做一个应用程序级别的防火墙,但现在我只能告诉像IP地址,端口号的东西。 是否有可能知道哪个程序发送数据包? 如果我不需要放置一个内核模块。 谢谢 !

什么是Linux中的NDISfilter的模拟?

我正在linux上as close to real-time系统,只要收到一个特定的数据包就需要在TCP数据包中发送大约600-800字节的数据。 为了获得最好的延迟,我希望这个数据包直接从内核发送,而不是直接从用户空间和应用程序接收数据包,然后再返回。 如果我在窗户上,我会写一个NDISfilter,我将caching要发送的数据包和匹配的参数,以便检查接收到的数据包,并在匹配的情况下将预caching的数据包发送到networking上,而不经过接收到的数据包直到更高层。 所以我的问题是什么是在Linux上的NDISfilter最接近的模拟器? 我已经阅读了关于netfilter,也许这是我会用,但我不知道这是否是最好的方式。 我还能做些什么来实现尽可能低的延迟? 我目前纯粹的用户空间代码在2.6.3x内核上运行Ubuntu 10.04的英特尔至强3.7 GHz处理器上给我提供了大约80-100微秒的时间。

在不使用环回networking的情况下将数据包转发到同一台主机上

我有这个libnetfilter_queue应用程序接收来自内核的一些iptables规则的数据包。 在直接回答我的问题之前,我给了一个示例代码和其他工具来设置一个testing环境,以便我们的问题定义和可能的解决scheme可以更加准确和强大。 以下代码描述了应用程序的核心function: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <netinet/in.h> #include <linux/types.h> #include <linux/netfilter.h> /* for NF_ACCEPT */ #include <errno.h> #include <libnetfilter_queue/libnetfilter_queue.h> #define PREROUTING 0 #define POSTROUTING 4 #define OUTPUT 3 /* returns packet id */ static u_int32_t print_pkt (struct nfq_data *tb) { int id = 0; struct nfqnl_msg_packet_hdr *ph; struct nfqnl_msg_packet_hw *hwph; u_int32_t […]

如何使用netfilter挂钩在内核空间中回显数据包?

我想在内核空间中回显一个数据包。 我使用端口6000在这台机器上运行一个回显服务器。现在客户端运行在另一台机器发送数据到回显服务器。 现在,我想要做的就是从内核空间回显数据包。 我不想用数据包打扰服务器,它会从内核空间静静地回应。 我在下面介绍我的代码: #include <linux/kernel.h> #include <linux/module.h> #include <linux/skbuff.h> #include <linux/netfilter.h> #include <linux/netdevice.h> #include <linux/ip.h> #include <linux/udp.h> #include <linux/mm.h> #include <linux/err.h> #include <linux/crypto.h> #include <linux/init.h> #include <linux/crypto.h> #include <linux/scatterlist.h> #include <net/ip.h> #include <net/udp.h> #include <net/route.h> #include <net/checksum.h> #include <linux/netfilter_ipv4.h> #define IP_HDR_LEN 20 #define UDP_HDR_LEN 8 #define TOT_HDR_LEN 28 static unsigned int pkt_echo_begin(unsigned int […]

将源IP地址从struct iphdr *转换为使用Linux netfilter的等效string

我想将来自使用netfilter捕获的数据包的源和目标IP地址转换为char *。 在我的netfilter钩子函数中,我有: sock_buff = skb; // argument 2 of hook function // ip_header is struct iphdr* ip_header = (struct iphdr *)skb_network_header(sock_buff); // now how to convert ip_header->saddr & ip_header->daddr to char * // ip_header->saddr & ip_header->daddr are of type __be32 谢谢。

如何在内核空间追加数据包?

我试图从内核空间附加一些数据包。 我有一个回声客户端和服务器。 我input如下命令行:./client“message”,服务器只是回显。 该服务器运行./server。 现在,客户端和服务器在两台不同的机器上(可能是虚拟机)。 我正在编写一个在客户机上运行的内核模块。 它的工作是在信息包出去之后在“消息”之后附加“12345”。 我正在呈现下面的代码。 /* * This is ibss_obsf_cat.c */ #include <linux/module.h> #include <linux/moduleparam.h> #include <linux/kernel.h> #include <linux/netfilter.h> #include <linux/skbuff.h> #include <linux/netdevice.h> #include <linux/udp.h> #include <linux/ip.h> #undef __KERNEL__ #include <linux/netfilter_ipv4.h> #define __KERNEL__ /* * Function prototypes … */ static unsigned int cat_obsf_begin (unsigned int hooknum, struct sk_buff *skb, const struct net_device […]