C, LKM, netfilter, PF_PACKET and ARP.


 
Thread Tools Search this Thread
Operating Systems Linux C, LKM, netfilter, PF_PACKET and ARP.
# 1  
Old 02-06-2011
C, LKM, netfilter, PF_PACKET and ARP.

Hello,
Everyone knows that with PF_PACKET sockets one can "sniff" a determinated frame from the network device, but just that, see the frame without altering its action on the receiving host. What i want is to "intercept" the incoming frame and pass it through some rules, and if it doesn't pass the rules, then DROP it without efecting its action on the host.

Let's say an ARP Request message, normally, the receiving host will create an entry on the ARP cache when it receives the ARP Request frame. If i use a PF_PACKET socket, i'll be able to see the packet, but not to intercept it, so however it passes my program rules or doesn't, its action will be the same, CREATE THE ARP ENTRY.

I know a little about netfilter and LKM programming, and i know that it does exactily what i want to do (intercept frames before it takes any action on the host), but from what i've seen, it just allows the programmer to handle IP level packets, so, what if i want to use netfilter to filter an ARP frame? Is it possible? And how is it done?

Thanks in advance.
Zykl0n-B
# 2  
Old 02-07-2011
Yes, it is possible to do what you wish to do. How you do it depends on the particular platform you are on. If you are on Solaris, BSD or Mac OS-X, you would use the Berkeley Packet Filter (BPF). If you are on GNU/Linux you need to use Linux Socket Filter (LSF). Their APIs are totally different but fortunately LSF uses the BPF format syntax.

Have a look at the following post: Intercept ARP and ICMP ECHOREPLY Using LSF.
# 3  
Old 02-07-2011
Man! I didn't know about Linux Socket Filter, but it looks strange and difficult like hell:
Code:
struct sock_filter macfilter[] =
    {
        BPF_STMT(BPF_LD + BPF_W + BPF_ABS, 2),                      // A <- P[2:4]
        BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, 0xffffffff, 0, 2),  // if A != 0xffffffff GOTO LABEL
        BPF_STMT(BPF_LD + BPF_H + BPF_ABS, 0),                      // A <- P[0:2]
        BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, 0x0000ffff, 2, 0), // if A == 0xffff GOTO ACCEPT
        // LABEL
        BPF_STMT(BPF_LD + BPF_B + BPF_ABS, 0),                      // A <- P[0:1]
        BPF_JUMP(BPF_JMP + BPF_JSET + BPF_K, 0x01, 0, 1),           // if !(A & 1) GOTO REJECT
        // ACCEPT
        BPF_STMT(BPF_RET, 1514),                                    // accept packet
        // REJECT
        BPF_STMT(BPF_RET, 0),                                       // reject packet
    };

I can't even imagine what does that piece of code. :S
But, with this LSF interface, can i "catch/intercept" the ARP message and deceide if DROP it or PASS to the host, BEFORE it takes effect on the host?

I thought it had to be a LKM to do so.

Btw, thank you, fpmurphy, Excellent reference links.!
Zykl0n-B
# 4  
Old 02-07-2011
Quote:
Man! I didn't know about Linux Socket Filter, but it looks strange and difficult like hell:
No more difficult than using the Berkeley Socket Filter.

Quote:
But, with this LSF interface, can i "catch/intercept" the ARP message and deceide if DROP it or PASS to the host, BEFORE it takes effect on the host?
Yes, if you know what you are doing. Look at a bpf(4) man page on any BSD platform for a detailed explanation of the filter machine syntax and read the seminal paper on this topic, i.e. The BSD Packet Filter: A New Architecture for User-level Packet Capture by Steven McCanne and Van Jacobson. It is available on the Internet.
# 5  
Old 02-08-2011
Hello,
This is what i was afraid of.
Code:
This user-defined filter decides whether a packet
is to be accepted and how many bytes of each packet should
be saved. For each filter that accepts the packet, BPF copies
the requested amount of data to the buffer associated with that
filter. The device driver then regains control. If the packet
was not addressed to the local host, the driver returns from the
interrupt. Otherwise, normal protocol processing proceeds.

LSF and BPF are just a filter for deceiding what packets to show and what packet not to. If the frame doesn't pass the filter, then it's returned to the device driver and it will process it normally (so, in my example, the ARP frame will take effect on the host's cache).

It seems i'll have to keep looking for arp support on netfilter.

By the way, i tried to make a module for blocking all ARP frames with netfilter, and it seems it's not possible. Does anyone know why?

Code:
static unsigned int hook_func(unsigned int hooknum,
                        struct sk_buff *skb,
                                const struct net_device *in,
                                const struct net_device *out,
                                int (*okfn)(struct sk_buff *)){

printk(KERN_INFO "ARP Dropped\n");
return NF_DROP;
}

static int __init init_main(void)
{
nfho.hook = hook_func;
nfho.hooknum = NF_ARP_IN;
nfho.pf = NF_ARP;

nf_register_hook(&nfho);

printk(KERN_INFO "Inserted protocool module!\n");
return(0);
}

This is the normal netfilter_hook_ops structure, i fill it with the funcion name (hook_func), the hook type NF_ARP_IN (0) and the protocol family (NF_ARP) and then register the hook. Since hook_func is "return NF_DROP" it should drop every single ARP frame it receives, but it doesn't. Could some one give me a clue about this?
Zykl0n-B
# 6  
Old 02-08-2011
Quote:
Originally Posted by Zykl0n-B
LSF and BPF are just a filter for deceiding what packets to show and what packet not to.
Isn't that what you wanted? The ability to decide what packets are accepted?
# 7  
Old 02-09-2011
Hello, Corona688.
No, that's not what i want. What i want is to filter the traffic, something like NETFILTER modules do, a way to DROP or ACCEPT frames.
Zykl0n-B
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Cybersecurity

How to use Netfilter properly with IPv6?

Hello, on a PC with Debian 8 I try to use a Bash script with Netfilter rules so that only traffic goes in and out that is wanted. For that I set all 3 default policies to "drop". The machine uses DHCP to get its IP, gateway and DNS. And I never checked so I was quite surprised that my... (1 Reply)
Discussion started by: SInt
1 Replies

2. Cybersecurity

Experience with libvirt netfilter API

Hi all, I would like to get some ideas and opinions on matter of libvirt netfilter application in KVM environment. I am looking for some easy way to control it with an API and possible experience with that and its performance in real life application. Thanks for all ideas (0 Replies)
Discussion started by: smoofy
0 Replies

3. UNIX for Advanced & Expert Users

problem with netfilter hook function struct skbuff *sock is null..

iam trying to built a firewall.so i have used netfilter for it. in function main_hook sock_buff is returning null and in my log file continuously "sock buff null" is printed plse help to solve this problem.. (using print_string iam printing strings on current terminal (terminal we ping)) ... (1 Reply)
Discussion started by: pavan6754
1 Replies

4. Linux

netfilter / iptables

HI, Is the Netfilter and IPtables same? Thanks & Regards Arun (1 Reply)
Discussion started by: Arun.Kakarla
1 Replies

5. Cybersecurity

Netfilter conntracking for P2P protocols (edonkey, bittorent...)

Hi everyone, I would like to allow multi users to access P2P networks, so I wonder if there's a way to tracking these kind of protocols with netfilter, and also compatibility with nat, like the module conntrack_ftp seems to do with the FTP protocol. Thanks guys. (0 Replies)
Discussion started by: nekkro-kvlt
0 Replies

6. IP Networking

netfilter connection tracking

hi, i'm using tcpreplay to send a traffic trace to my wireless interface (the trace is been captured by the same interface). It seems as netfilter can't trace connections. Is it possible? (0 Replies)
Discussion started by: littleboyblu
0 Replies

7. Programming

extending netfilter...plz help

Hello friends i'm trying to extend iptables to include a target by which we can change the packet type field of a packet. For this i created a kernel module and a userspace extension. Now i face the problem that when i try to invoke iptable with the target i created i get an error message saying... (1 Reply)
Discussion started by: Rakesh Ranjan
1 Replies

8. Programming

Problem in registering new netfilter target module

Friends I'm facing a big problem trying to extend the netfilter. Somone please help me with your quick reply (any hint) as I've to meet a deadline. My problem is that I've written a new netfilter target module and its corresponding userspace program for iptables to change the packet type of a... (0 Replies)
Discussion started by: Rakesh Ranjan
0 Replies

9. Programming

Help in extending netfilter

Hi everybody, I have to write a module for matching in netfilter , extending the netfilter but I'm facing some problems can somebody guide me in that. I know that I need to write matching module working in kernel space and a program in userspace. I went through the HOWTO on netfilter-hacking but... (0 Replies)
Discussion started by: Trusted Penguin
0 Replies
Login or Register to Ask a Question