All of lore.kernel.org
 help / color / mirror / Atom feed
* ip_queue questions
@ 2005-03-26  7:08 Peter Enderborg
  2005-03-26  7:54 ` Jonas Berlin
  2005-03-26 11:46 ` Pablo Neira
  0 siblings, 2 replies; 4+ messages in thread
From: Peter Enderborg @ 2005-03-26  7:08 UTC (permalink / raw)
  To: netfilter

Is there any non trivial example of howto use netlink?
A non trivial is something that use do something with the packet and 
returns a modifyed packet form userland.
And is there any way to do matching rule in userland? ipq_set_verdict() 
must have NF_ACCEPT or NF_DROP.
I whould like to do something similar to the MARK, just modify the data 
and then continue.


-- 
foo!

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: ip_queue questions
  2005-03-26  7:08 ip_queue questions Peter Enderborg
@ 2005-03-26  7:54 ` Jonas Berlin
  2005-03-26 10:04   ` Peter Enderborg
  2005-03-26 11:46 ` Pablo Neira
  1 sibling, 1 reply; 4+ messages in thread
From: Jonas Berlin @ 2005-03-26  7:54 UTC (permalink / raw)
  To: Peter Enderborg; +Cc: netfilter

Peter Enderborg wrote:

> Is there any non trivial example of howto use netlink?

No, it's pretty trivial to do anything with libipq imo :D

> A non trivial is something that use do something with the packet and 
> returns a modifyed packet form userland.

This code has never been used, I just wrote it for you :)

void handle(void)
{
    static unsigned char packet[65536];

    // fetch data
    if(ipq_read(ipq_h, packet, sizeof(packet), 0) < 0) {
       ipq_perror("ipq_read");
       return;
    }

    // check type
    if (ipq_message_type(packet) != IPQM_PACKET) {
       fprintf(stderr, "Received error message %d\n",
               ipq_get_msgerr(packet));
       return;
    }

    ipq_packet_msg_t *msg = ipq_get_packet(packet);

    // ensure we got some data (maybe I'm paranoid)
    if(msg->data_len == 0) {
       ipq_set_verdict(ipq_h, msg->packet_id, NF_DROP, 0, 0);
       return;
    }

    // IP, TCP etc structs I have copypasted from /usr/include/linux/ip.h etc
    struct iphdr *iph = (struct iphdr *)msg->payload;

    // let's say we want to remove all ip options
    // get pointer to start of ip options..
    unsigned char *options = &iph[1];
    // .. and current end of ip header = end of ip options
    unsigned char *options_end = ((unsigned *)iph) + iph->ihl;

    if(end_of_options == options) {
       // no options, do nothing and accept
       ipq_set_verdict(ipq_h, msg->packet_id, NF_ACCEPT, 0, 0);
       return;
    }

    // kill!
    memmove(options, options_end,
           (unsigned char *)iph + msg->data_len - options_end);

    // update lengths
    iph->ihl = sizeof(struct iphdr) / 4;
    iph->tot_len -= options_end - options;

    // ##TODO## update checksum maybe

    ipq_set_verdict(ipq_h, msg->packet_id, NF_ACCEPT,
                    msg->data_len - (options_end - options), msg->payload);
}

Hope you get some idea.. And hope I didn't do it the wrong way or something :)

> And is there any way to do matching rule in userland? ipq_set_verdict() 
> must have NF_ACCEPT or NF_DROP.
> I whould like to do something similar to the MARK, just modify the data 
> and then continue.

Currently, no :/

Maybe some day.. I don't know enough (yet) to do it myself..

-- 
- xkr47

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: ip_queue questions
  2005-03-26  7:54 ` Jonas Berlin
@ 2005-03-26 10:04   ` Peter Enderborg
  0 siblings, 0 replies; 4+ messages in thread
From: Peter Enderborg @ 2005-03-26 10:04 UTC (permalink / raw)
  To: Jonas Berlin; +Cc: netfilter

Jonas Berlin wrote:

> Peter Enderborg wrote:
>
>> Is there any non trivial example of howto use netlink?
>
>
> No, it's pretty trivial to do anything with libipq imo :D
>
>> A non trivial is something that use do something with the packet and 
>> returns a modifyed packet form userland.
>
>
> This code has never been used, I just wrote it for you :)
>
> void handle(void)
> {
>    static unsigned char packet[65536];
>
>    // fetch data
>    if(ipq_read(ipq_h, packet, sizeof(packet), 0) < 0) {
>       ipq_perror("ipq_read");
>       return;
>    }
>
>    // check type
>    if (ipq_message_type(packet) != IPQM_PACKET) {
>       fprintf(stderr, "Received error message %d\n",
>               ipq_get_msgerr(packet));
>       return;
>    }
>
>    ipq_packet_msg_t *msg = ipq_get_packet(packet);
>
>    // ensure we got some data (maybe I'm paranoid)
>    if(msg->data_len == 0) {
>       ipq_set_verdict(ipq_h, msg->packet_id, NF_DROP, 0, 0);
>       return;
>    }
>
>    // IP, TCP etc structs I have copypasted from 
> /usr/include/linux/ip.h etc
>    struct iphdr *iph = (struct iphdr *)msg->payload;
>
>    // let's say we want to remove all ip options
>    // get pointer to start of ip options..
>    unsigned char *options = &iph[1];
>    // .. and current end of ip header = end of ip options
>    unsigned char *options_end = ((unsigned *)iph) + iph->ihl;
>
>    if(end_of_options == options) {
>       // no options, do nothing and accept
>       ipq_set_verdict(ipq_h, msg->packet_id, NF_ACCEPT, 0, 0);
>       return;
>    }
>
>    // kill!
>    memmove(options, options_end,
>           (unsigned char *)iph + msg->data_len - options_end);
>
>    // update lengths
>    iph->ihl = sizeof(struct iphdr) / 4;
>    iph->tot_len -= options_end - options;
>
>    // ##TODO## update checksum maybe
>
>    ipq_set_verdict(ipq_h, msg->packet_id, NF_ACCEPT,
>                    msg->data_len - (options_end - options), 
> msg->payload);
> }
>
> Hope you get some idea.. And hope I didn't do it the wrong way or 
> something :)
>
Thanks. I think on track now.  But this makes it imposible to modify 
mark. (in ipq_packet_msg_t)
And the MARK target is not avaible in "-t filter" section.  The idea is 
to have diffrent rules in the
QUEUE for userland. But I can only have one netlink queue, right? And I 
can't tag my pakets in the
"filter FORWARD" section where I need to have my userland QUEUE's. Hmm, 
life is hard :-(

>> And is there any way to do matching rule in userland? 
>> ipq_set_verdict() must have NF_ACCEPT or NF_DROP.
>> I whould like to do something similar to the MARK, just modify the 
>> data and then continue.
>
>
> Currently, no :/
>
> Maybe some day.. I don't know enough (yet) to do it myself..
>


-- 
foo!

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: ip_queue questions
  2005-03-26  7:08 ip_queue questions Peter Enderborg
  2005-03-26  7:54 ` Jonas Berlin
@ 2005-03-26 11:46 ` Pablo Neira
  1 sibling, 0 replies; 4+ messages in thread
From: Pablo Neira @ 2005-03-26 11:46 UTC (permalink / raw)
  To: Peter Enderborg; +Cc: netfilter

Peter Enderborg wrote:
> I whould like to do something similar to the MARK, just modify the data 
> and then continue.

Look for ip_queue_vwmark in pom-ng, that enables the nfmark modification.

AFAIK that patch surely won't ever get in kernel mainline since there's 
a more simple way to export nfmark (just adding it to the message). This 
  breaks backward compatibility with current application though.

--
Pablo

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2005-03-26 11:46 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-03-26  7:08 ip_queue questions Peter Enderborg
2005-03-26  7:54 ` Jonas Berlin
2005-03-26 10:04   ` Peter Enderborg
2005-03-26 11:46 ` Pablo Neira

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.