Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 6 Jan 2018 08:22:25 -0500
From:      John Lyon <johnllyon@gmail.com>
To:        Julian Elischer <julian@freebsd.org>
Cc:        "freebsd-net@freebsd.org" <freebsd-net@freebsd.org>, Eugene Grosbein <eugen@grosbein.net>
Subject:   Re: Need Netgraph Help [fixed]
Message-ID:  <47C0E33A-E815-4860-A25C-F29BBB8D6787@gmail.com>
In-Reply-To: <CAKfTJoXdqm0Bj%2B85omHg6oiKhqDNkxfW5rs9nxsqH79qdCd9Gw@mail.gmail.com>
References:  <CAKfTJoUMxo7gsio7JJD8Vj_xPgFx5YEBH3_XViFhR0dt59==Dw@mail.gmail.com> <5A3225BF.6020205@omnilan.de> <CAKfTJoX78JhqsvB669Gxsr5UtZkbwuZrnVhOdU2UMacF7FmP1g@mail.gmail.com> <5A32F63E.8010205@grosbein.net> <5A338C5A.20300@omnilan.de> <CAKfTJoW5H82VLyBZ_5_sa9HU7Xbot7imeiP-ogVCNkHGe0_30Q@mail.gmail.com> <2e0525c8-2251-a5f5-45d1-fe44ebe318f7@freebsd.org> <CAKfTJoXe%2BZjDEMbF12-JcwBAs0uQoAFYAC3g1A_d0yM8by-z6g@mail.gmail.com> <ac0e236e-f27c-d4ed-8527-010dd025efff@freebsd.org> <4fee4ea6-9b35-afba-6d5d-24ecca3e28c6@freebsd.org> <CAKfTJoUuxKKkZEo5%2Bnv98jqk3T2D77-CS-rdqvVUQE%2BczHpzrw@mail.gmail.com> <3b8d46da-75e3-79f2-379c-b27a88e80733@freebsd.org> <CAKfTJoXdqm0Bj%2B85omHg6oiKhqDNkxfW5rs9nxsqH79qdCd9Gw@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
I just woke up with a follow-up question that may be my aha moment.  Are Net=
graph edges between nodes always bidirectional? I have been treating all of t=
he edges as unidirectional, requiring me to create two separate Netgraphs.  B=
ut if they are bidirectional, that would explain some things.

Thanks.

Sent from my iPhone

> On Jan 5, 2018, at 11:16 PM, John Lyon <johnllyon@gmail.com> wrote:
>=20
> Julian,
>=20
> So this didn't work when I tried to implement it on hardware in real life a=
nd I can't figure out why.  I am sure it's really basic, but the error messa=
ge is not very descriptive.
>=20
> I use the following script to create a graph that filters the EAP traffic a=
nd forwards directly from the first Ethernet interface to the second.  It wo=
rks perfectly.
>=20
>     kldload ng_etf
>     ngctl mkpeer igb0: etf lower downstream
>     ngctl name igb0:lower waneapfilter
>     ngctl connect waneapfilter: igb0: nomatch upper
>     ngctl connect wanfilter: igb1: waneapout lower
>     ngctl msg wanfilter: 'setfilter { matchhook=3D"waneapout" ethertype=3D=
0x888e }'
>=20
> The end result is that EAPOL frames are forwarded directly from igb0 (WAN)=
 to igb1 (LAN).  Graphically, it looks like (arrows indicating flow of traff=
ic):
>  igb0]lower--->>downstream[ETF0]nomatch--->>upper[igb0...
>                        waneapout
>                        |
>                        |------>>lower[igb1....
> However, I also need to do the reverse and forward EAPOL frames in the opp=
osite direction from igb1 (LAN) to igb0 (WAN).  Graphically, I want (arrows i=
ndicating flow):
> igb1]lower--->>downstream[ETF1]nomatch--->>upper[igb1...
>                        laneapout
>                        |
>                        |------>>lower[igb0....
> So I try a mirror image of my first script.  However, when I type the firs=
t line of:
>     ngctl mkpeer igb1: etf lower downstream
> I get the following error message:
>     ngctl: send msg: File exists.
> My guess (based on an earlier email in this thread) is that because I've a=
lready connected my first NG_ETF node to the lower hook of igb1 (in order to=
 forward traffic out that interface), I am getting the error that the "File e=
xists" when I try to connect a second ETF node to igb1 lower.  If this is th=
e case, how can I write traffic out the interface, while filtering incoming t=
raffic on the same interface? I tried to used two different ETF nodes, as su=
ggested, but get an error message when I try.=20
> Thanks for any help.  I feel like I am so close.  At this point, I probabl=
y should have just jumped ship and tried an alternate solution, but I just c=
an't allow the machine to win. :-)  I have to get this working!
>=20
>=20
> --------------------------------
> John L. Lyon
> PGP Key Available At:=20
> https://www.dropbox.com/s/skmedtscs0tgex7/02150BFE.asc
>=20
>> On Fri, Dec 29, 2017 at 4:06 AM, Julian Elischer <julian@freebsd.org> wro=
te:
>>> On 29/12/17 10:52 am, John Lyon wrote:
>>> It works!!!  In virtual machine land at least, it works!  It will be int=
eresting to see what happens when the rubber meets the road and I actually t=
est it "in the field."
>>>=20
>>> The issue was a missing single line that was not obvious from the man pa=
ges:
>>>=20
>>>     sudo ngctl connect eapfilter: ix1: eapout lower
>> your next issue will be that you can only attach em1:lower to a single pe=
er at a time. So return packets can not DTRT.
>>=20
>> You will need to either put a multiplexing node in each interface, OR if I=
 wrote it correctly, use the fact that packets fed into an etf match hook wi=
ll feed back out the input hook.
>>=20
>> so you need this:
>>=20
>> em0]lower---downstream[ETF0]nomatch---upper[em0...
>>                        eapout
>>                        |
>>                        |
>>                        eapout
>> em1]lower---downstream[ETF1]nomatch---upper[em1...
>>=20
>>              =20
>> ie. use an etf node on each interface.
>>=20
>>=20
>> =20
>>=20
>>>=20
>>> Apparently, I had not created an alias for the connection between the ET=
F and the ether nodes.  Once this connect command was issued, the connection=
 to the lower hook of the ether node was ready to be connected to the ETF.
>>>=20
>>> Thanks so much for your help.
>>>=20
>>>=20
>>> --------------------------------
>>> John L. Lyon
>>> PGP Key Available At:=20
>>> https://www.dropbox.com/s/skmedtscs0tgex7/02150BFE.asc
>>>=20
>>>> On Thu, Dec 28, 2017 at 9:48 AM, Julian Elischer <julian@freebsd.org> w=
rote:
>>>>> On 28/12/17 9:59 pm, Julian Elischer wrote:
>>>>>> On 28/12/17 1:37 am, John Lyon wrote:
>>>>>> Julian,
>>>>>>=20
>>>>>> Unfortunately, this issue remains unresolved.  I would like to think t=
hat this is just a PEBKAC issue, but I have tried every permutation of escap=
e characters in case it's an issue with my syntax and I get the same set of e=
rrors.  No matter what I do, I can't connect the no match hook of an ETF nod=
e to the upper hook of an ng_ether node.  Do you have any insights into why t=
his might be occurring?
>>>>>>=20
>>>>>> By the way, thanks for reaching out to me!  I was going to email you d=
irectly after the holidays since your name and email address are at the bott=
om of the relevant Netgraph man pages.  I figured that must mean if you didn=
't know the answer, no one does. :-)
>>>>>=20
>>>>> what is EAP?
>>>>> what about return EAP packets? (are there any?)
>>>>=20
>>>> oops left out a line from the cut-n-paste...
>>>>>=20
>>>>> I think this is what you want:
>>>>> $ sudo ngctl list
>>>>> There are 7 total nodes:
>>>>>   Name: igb0            Type: ether           ID: 00000001   Num hooks=
: 0
>>>>>   Name: igb1            Type: ether           ID: 00000002   Num hooks=
: 0
>>>>>   Name: ix0             Type: ether           ID: 00000003   Num hooks=
: 0
>>>>>   Name: ix1             Type: ether           ID: 00000004   Num hooks=
: 0
>>>>>   Name: tap0            Type: ether           ID: 00000005   Num hooks=
: 0
>>>>>   Name: bridge3         Type: ether           ID: 00000006   Num hooks=
: 0
>>>>>   Name: ngctl7372       Type: socket          ID: 00000007   Num hooks=
: 0
>>>>> $ sudo kldload ng_etf
>>>> $ sudo ngctl mkpeer ix0: etf lower downstream
>>>>> $ sudo ngctl name ix0:lower eapfilter
>>>>> $ sudo ngctl connect eapfilter: ix0: nomatch upper
>>>>> $ sudo ngctl connect eapfilter: ix1: eapout lower
>>>>> $ sudo ngctl show eapfilter:
>>>>>   Name: eapfilter       Type: etf             ID: 00000021   Num hooks=
: 3
>>>>>   Local hook      Peer name       Peer type    Peer ID Peer hook
>>>>>   ----------      ---------       --------- ------- ---------
>>>>>   eapout          ix1             ether 00000004                      l=
ower
>>>>>   nomatch         ix0             ether 00000003        upper
>>>>>   downstream      ix0             ether 00000003        lower
>>>>> $ sudo ngctl msg eapfilter: 'setfilter { matchhook=3D"eapout" ethertyp=
e=3D0x888e }'
>>>>> $
>>>>>=20
>>>>>=20
>>>>>>=20
>>>>>> Thanks.
>>>>>>=20
>>>>>>=20
>>>>>> --------------------------------
>>>>>> John L. Lyon
>>>>>> PGP Key Available At:
>>>>>> https://www.dropbox.com/s/skmedtscs0tgex7/02150BFE.asc
>>>>>>=20
>>>>>> On Wed, Dec 27, 2017 at 10:32 AM, Julian Elischer <julian@freebsd.org=
 <mailto:julian@freebsd.org>> wrote:
>>>>>>=20
>>>>>>     John did you get a resolution to this issue?
>>>>>>=20
>>>>>>=20
>>>>>>     On 16/12/17 2:59 am, John Lyon wrote:
>>>>>>=20
>>>>>>         Harry and Eugene (and others),
>>>>>>=20
>>>>>>         I appreciate all of your help.  It's been really
>>>>>>         insightful.  Although I
>>>>>>         feel like I'm getting much closer to the solution, I don't
>>>>>>         think my problem
>>>>>>         has been diagnosed.  I've outlined my thought process
>>>>>>         below.  Can you
>>>>>>         please tell me if I am misunderstanding something?
>>>>>>         Admittedly, I am not a
>>>>>>         kernel developer and my C language skills have atrophied the
>>>>>>         last few
>>>>>>         years.  However, I've reviewed my script and I looked in the
>>>>>>         code for
>>>>>>         ng_etf.c and I don't think I am violating any of the
>>>>>>         requirements for
>>>>>>         linking a hook for no match.
>>>>>>=20
>>>>>>         As Eugene stated:
>>>>>>=20
>>>>>>                 1) referenced "matchook" exists and you should not
>>>>>>                 use "indirect name"
>>>>>>=20
>>>>>>         here,
>>>>>>=20
>>>>>>                 only hook own name, or else you get error ENOENT (No
>>>>>>                 such file or
>>>>>>=20
>>>>>>         directory);
>>>>>>=20
>>>>>>         This does not seem to be a problem as the upper and lower
>>>>>>         hooks for the em1
>>>>>>         already exist (I can confirm this).
>>>>>>=20
>>>>>>                 2) referenced "matchook" is *not* downstream hook,
>>>>>>                 or else you get error
>>>>>>                 EINVAL (Invalid argument);
>>>>>>=20
>>>>>>         I read the ng_etf.c file in the source tree and found this
>>>>>>         little snippet:
>>>>>>=20
>>>>>>         /* and is not the downstream hook */
>>>>>>         if (hook =3D=3D etfp->downstream_hook.hook) {
>>>>>>              error =3D EINVAL;
>>>>>>              break;
>>>>>>         }
>>>>>>=20
>>>>>>         This appears to be an error check to make sure you are not
>>>>>>         creating a cycle
>>>>>>         in the graph by referencing the ETF node's own downstream
>>>>>>         hook (i.e.
>>>>>>         filtering incoming traffic and circularly feeding
>>>>>>         non-matching frames back
>>>>>>         into the ETF's own filter).  I'm not doing this.  I am
>>>>>>         feeding non-matching
>>>>>>         packets into the *lower* hook of another ether node and not
>>>>>>         back into the
>>>>>>         *downstream* hook of the etf node I am creating.  As a
>>>>>>         result, my netgraph
>>>>>>         should not be triggering this error condition.
>>>>>>=20
>>>>>>                 3) it was not already configured, or else you get
>>>>>>                 error EEXIST (File
>>>>>>=20
>>>>>>         exists).
>>>>>>=20
>>>>>>         I am not getting this error, so it appears not to be an
>>>>>>         issue in my case.
>>>>>>=20
>>>>>>         What am I missing here?  The man page states that "*any
>>>>>>         other *hook" can be
>>>>>>=20
>>>>>>         used for the non-matching packets.  So the man page says
>>>>>>         this should work,
>>>>>>         and there's no explicit error condition that I see (caveat,
>>>>>>         I have not
>>>>>>         written in C for at least 10 years  - PEBKAC is entirely
>>>>>>         possible) that
>>>>>>         would be triggered in the ng_etf code.  So what is going wron=
g?
>>>>>>=20
>>>>>>         Thanks for all of your help, patience, and understanding.
>>>>>>=20
>>>>>>=20
>>>>>>         --------------------------------
>>>>>>         John L. Lyon
>>>>>>         PGP Key Available At:
>>>>>>         https://www.dropbox.com/s/skmedtscs0tgex7/02150BFE.asc
>>>>>> <https://www.dropbox.com/s/skmedtscs0tgex7/02150BFE.asc>;
>>>>>>=20
>>>>>>         On Fri, Dec 15, 2017 at 3:48 AM, Harry Schmalzbauer
>>>>>>         <freebsd@omnilan.de <mailto:freebsd@omnilan.de>>
>>>>>>         wrote:
>>>>>>=20
>>>>>>             Bez=C3=BCglich Eugene Grosbein's Nachricht vom 14.12.2017=

>>>>>>             23:07 (localtime):
>>>>>>=20
>>>>>>                 15.12.2017 4:27, John Lyon wrote:
>>>>>>=20
>>>>>>                             I'm a new Netgraph user, but am having
>>>>>>                             some problems with a simple
>>>>>>                             Netgraph
>>>>>>                             script I have written. Unfortunately,
>>>>>>                             the error message is cryptic
>>>>>>=20
>>>>>>             and I
>>>>>>=20
>>>>>>                             can't tell what I am doing wrong since
>>>>>>                             my script closely follows the
>>>>>>                             example provided in the                 n=
g_etf man page.
>>>>>>=20
>>>>>>                             For some context, I'm trying to filter
>>>>>>                             EAP traffic coming in on my LAN
>>>>>>                             interface.  Any ethernet                 f=
rames that
>>>>>>                             correspond to EAP traffic need
>>>>>>=20
>>>>>>             to be
>>>>>>=20
>>>>>>                             immediately forwarded from the LAN
>>>>>>                             interface to my WAN interface.  All
>>>>>>                             other ethernet frames coming in on my
>>>>>>                             LAN interface need to be
>>>>>>=20
>>>>>>             handled by
>>>>>>=20
>>>>>>                             the kernel's network stack.  A (horrid)
>>>>>>                             ASCII art representation of my
>>>>>>                             desired netgraph would look like this:
>>>>>>=20
>>>>>>                             lower -> em0 -> downstream -> ETF -> no
>>>>>>                             match -> upper em0
>>>>>>                                             -> match ->
>>>>>>                             lower em1
>>>>>>=20
>>>>>>                             The script I have written is this:
>>>>>>=20
>>>>>>                                  #! /bin/sh
>>>>>>                                  ngctl mkpeer em0: etf lower downstre=
am
>>>>>>                                  ngctl name em0:lower lan_filter
>>>>>>                                  ngctl connect em0: lan_filter:
>>>>>>                             upper nomatch
>>>>>>                                  ngctl msg lan_filter: setfilter {
>>>>>>                             matchhook=3D"em1:lower"
>>>>>>                             ethertype=3D0x888e }
>>>>>>=20
>>>>>>                             Unfortunately, the last line of my
>>>>>>                             script generates the following
>>>>>>=20
>>>>>>             error
>>>>>>=20
>>>>>>                             message:
>>>>>>=20
>>>>>>                                  ngctl: send msg: Invalid Argument
>>>>>>=20
>>>>>>                 For "setfilter" command to work, ng_etf requires that=
:
>>>>>>=20
>>>>>>                 1) referenced "matchook" exists and you should not
>>>>>>                 use "indirect name"
>>>>>>=20
>>>>>>             here,
>>>>>>=20
>>>>>>                 only hook own name, or else you get error ENOENT (No
>>>>>>                 such file or
>>>>>>=20
>>>>>>             directory);
>>>>>>=20
>>>>>>                 2) referenced "matchook" is *not* downstream hook,
>>>>>>                 or else you get error
>>>>>>                 EINVAL (Invalid argument);
>>>>>>                 3) it was not already configured, or else you get
>>>>>>                 error EEXIST (File
>>>>>>=20
>>>>>>             exists).
>>>>>>=20
>>>>>>             Eugene kindly looked into the code and found that the
>>>>>>             error is due to
>>>>>>             wrong matchhook definition.
>>>>>>             I've never had any contact with ng_etf yet, but
>>>>>>             according to the man
>>>>>>             page, you need to set the (additional) filter hook by
>>>>>>             'nghook -a
>>>>>>             lan_filter: mydrain' and use 'matchhook=3Dmydrain' for th=
e
>>>>>>             'msg' command.
>>>>>>=20
>>>>>>             Do idea about the intention, so for the rest you have to
>>>>>>             tweak as needed.
>>>>>>=20
>>>>>>             -harry
>>>>>>=20
>>>>>>=20
>>>>>>         _______________________________________________
>>>>>>         freebsd-net@freebsd.org <mailto:freebsd-net@freebsd.org>
>>>>>>         mailing list
>>>>>>         https://lists.freebsd.org/mailman/listinfo/freebsd-net
>>>>>> <https://lists.freebsd.org/mailman/listinfo/freebsd-net>;
>>>>>>         To unsubscribe, send any mail to
>>>>>>         "freebsd-net-unsubscribe@freebsd.org
>>>>>>         <mailto:freebsd-net-unsubscribe@freebsd.org>"
>>>>>>=20
>>>>>>=20
>>>>>>=20
>>>>>>=20
>>>>>=20
>>>>> _______________________________________________
>>>>> freebsd-net@freebsd.org mailing list
>>>>> https://lists.freebsd.org/mailman/listinfo/freebsd-net
>>>>> To unsubscribe, send any mail to "freebsd-net-unsubscribe@freebsd.org"=

>>>>>=20
>>>>>=20
>>>>=20
>>>=20
>>=20
>=20



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?47C0E33A-E815-4860-A25C-F29BBB8D6787>