Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 14 Jan 2010 17:42:54 -0800
From:      Erik Klavon <erikk@berkeley.edu>
To:        Julian Elischer <julian@elischer.org>
Cc:        freebsd-net@freebsd.org
Subject:   Re: netgraph mkpeer and connect failures with ng_ipfw and ng_nat
Message-ID:  <20100115014254.GA29258@malcolm.berkeley.edu>
In-Reply-To: <4B4FB547.8000202@elischer.org>
References:  <20100114224635.GA27139@malcolm.berkeley.edu> <4B4FB547.8000202@elischer.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Jan 14, 2010 at 04:22:31PM -0800, Julian Elischer wrote:
> Erik Klavon wrote:
> >Here are the hooks for one ng_nat(4) node of interest. At the time I
> >obtained this information, this node was working correctly. Everything
> >in this output looks correct.
> >
> >sudo ngctl show ipfw:202182138
> >  Name: WirelessNAT2182138 Type: nat             ID: 000062ee   Num hooks: 
> >  2
> >  Local hook      Peer name       Peer type    Peer ID         Peer hook   
> >  ----------      ---------       ---------    -------         ---------   
> >  in              ipfw            ipfw         00005a83        102182138   
> >  out             ipfw            ipfw         00005a83        202182138   
> >
> >sudo ngctl msg ipfw:102182138 listredirects
> >Rec'd response "listredirects" (10) from "[62ee]:":
> >Args:   { total_count=1 redirects=[ { id=1 local_addr=10.10.118.43 
> >alias_addr=136.152.182.138 proto=259 description="Static NAT" } ] }
> >
> >Running show on ipfw:102174202, I see that this hook is pointing to
> >the above ng_nat(4) node WirelessNAT2182138.
> 
> can you show that output?

The output for ngctl show ipfw:102174202 is below.

> >sudo ngctl show ipfw:102174202
> >  Name: WirelessNAT2182138 Type: nat             ID: 000062ee   Num hooks: 
> >  2
> >  Local hook      Peer name       Peer type    Peer ID         Peer hook   
> >  ----------      ---------       ---------    -------         ---------   
> >  in              ipfw            ipfw         00005a83        102182138   
> >  out             ipfw            ipfw         00005a83        202182138   
> >
> >But WirelessNAT2182138 has no record of a hook102174202. Somehow, two
> >hooks used to refer to what should be two different NAT sessions are
> >pointing to the same ng_nat(4) object (i.e. one session). If I run
> >shutdown on ipfw:102174202, WirelessNAT2182138 goes away. Given the
> >above calls to ngctl(8), I don't know what is causing these two separate
> >hooks to refer to the same ng_nat(4) object.
> 
> you might name the ipfw nodes to make the output clearer.

ng_ipfw(4) uses a single node to pass traffic from ipfw(4) to
netgraph(4). You associate as many hooks with this node as you like and
then direct traffic via the single ng_ipfw(4) node to different hooks
using ipfw(8) rules such as

01230 netgraph tablearg ip from table(87) to any in

Suppose a packet comes in for IP address 10.10.113.226 and rule 1230
is reached during the processing of the ipfw ruleset. According to the
above rule, ipfw(4) will look up 10.10.113.226/32 in table 87 and if
it finds a matching key in the table, it will tag the packet with the
matching table entry's value and send the packet to the ng_ipfw(4)
node. ng_ipfw(4) will then examine the tag and look for an associated
hook with a matching name. If such a hook is found the packet is sent
on to the node associated with the hook. In the case of 10.10.113.226,
table 87 contains the following entry.

10.10.113.226/32 202173114

Hook 202173114 refers to the following ng_nat node.

sudo ngctl show ipfw:202173114
  Name: WirelessNAT2173114 Type: nat             ID: 000015f0   Num hooks: 2
  Local hook      Peer name       Peer type    Peer ID         Peer hook      
  ----------      ---------       ---------    -------         ---------      
  in              ipfw            ipfw         00000001        102173114      
  out             ipfw            ipfw         00000001        202173114      

which is configured for one to one NAT as follows.
 
sudo ngctl msg WirelessNAT2173114: listredirects
Rec'd response "listredirects" (10) from "[15f0]:":
Args:   { total_count=1 redirects=[ { id=1 local_addr=10.10.113.226 alias_addr=x.x.173.114 proto=259 description="Static NAT" } ] }

There is a similar path for traffic coming in to the globally routable
side of these one to one NAT nodes.

> I have not looked at the ipfw node type much but it is possible
> that is suffers from races.
> Especially in the face of ipfw rule changes.

Can you think of an example in any other netgraph module of proper
concurrency handling I can use as a reference when looking at
ng_ipfw(4)?

By using tables we don't need to update the ruleset itself. The
ruleset is (normally) loaded once after the machine boots. The table
updates take place after all the calls to ngctl(8) and after the call
to arp(8). I will take a look at the interface between ipfw(4) and
ng_ipfw(4).

> have you tried adding small delays (sleep 0.5) betwenn the calls by 
> the way?

I've now added sleep 0.5 between the calls to ngctl. I'll let you know
if that helps at all; thanks for the suggestion.

Erik



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20100115014254.GA29258>