netgraph arp issues vs linux veth

Ruslan Ermilov ru at freebsd.org
Tue Apr 27 01:15:02 PDT 2004


On Mon, Apr 26, 2004 at 11:22:43AM -0700, David Yeske wrote:
> I made another attempt with netgraph and I think I'm almost there, but I'm
> still having some issues.  I found a linux solution called veth
> http://www.geocities.com/nestorjpg/veth/ which might do the job, but I would
> prefer to use netgraph if possible.  Here is some more detailed config
> information.
> 
> I ran this on the spoof machine
> 
> # ngctl mkpeer . eiface hook ether
> # ifconfig ngeth0 link 00:bd:03:12:12:12
> # ifconfig ngeth0 192.168.10.3 netmask 255.255.255.0
> 
> # ngctl mkpeer ngeth0: bridge lower link0
> # ngctl name ngeth0:lower broken
> # ngctl connect fxp0: broken: lower link1
> # ngctl connect fxp0: broken: upper link2
> # ngctl connect ngeth0: broken: upper link3
> # ngctl msg ngeth0: setpromisc 1
> # ngctl msg ngeth0: setautosrc 0
> # ngctl msg fxp0: setpromisc 1
> # ngctl msg fxp0: setautosrc 0
> 
> # ngctl show broken:
>   Name: broken          Type: bridge          ID: 00000046   Num hooks: 4
>   Local hook      Peer name       Peer type    Peer ID         Peer hook
>   ----------      ---------       ---------    -------         ---------
>   link3           ngeth0          ether        00000005        upper
>   link2           fxp0            ether        00000004        upper
>   link1           fxp0            ether        00000004        lower
>   link0           ngeth0          ether        00000005        lower
> 
I experminted a bit more here, and it turns out that this can
be further simplified.  Instead of attaching both "lower" and
"upper' of ngeth0: ("ether" node type) to the bridge, you can
only attach "eiface" node's "ether" hook to the bridge (i.e.,
the corresponding "ether" node type will be left unconnected).
So bridge will be with three links: fxp0:lower, fxp0:upper,
and [eiface]:ether.

> on the remote machine an arp -a lists this
> ? (192.168.10.3) at 00:bd:03:12:12:12 on rl0 [ethernet] 
> ? (192.168.10.1) at 00:00:e8:5b:13:44 on rl0 permanent [ethernet]
> 
> on the spoof machine an arp -a lists this
> ? (192.168.10.1) at (incomplete) on ngeth0 [ethernet]
> ? (192.168.10.3) at 00:bd:03:12:12:12 on ngeth0 permanent [ethernet]
> 
> a sniff on the spoof machine listed this while pinging the remote machine
> 
> # tcpdump -i ngeth0 'ether host 00:00:e8:5b:13:44'
> tcpdump: listening on ngeth0
> 14:03:30.519263 arp reply 192.168.10.1 is-at 0:0:e8:5b:13:44
> 14:03:33.416568 192.168.10.1 > 192.168.10.3: icmp: echo request
> 14:03:40.530562 arp reply 192.168.10.1 is-at 0:0:e8:5b:13:44
> 14:03:43.427175 192.168.10.1 > 192.168.10.3: icmp: echo request
> 14:03:50.540805 arp reply 192.168.10.1 is-at 0:0:e8:5b:13:44
> 14:03:53.437845 192.168.10.1 > 192.168.10.3: icmp: echo request
> 14:04:00.550960 arp reply 192.168.10.1 is-at 0:0:e8:5b:13:44
> 14:04:03.448383 192.168.10.1 > 192.168.10.3: icmp: echo request
> 
> a sniff on the remote machine listed this while pinging the spoof machine
> 
> # tcpdump -i rl0 'ether host 00:bd:03:12:12:12'
> tcpdump: listening on rl0
> 14:02:24.918804 192.168.10.1 > 192.168.10.3: icmp: echo request
> 14:02:29.179263 arp reply 192.168.10.1 is-at 0:0:e8:5b:13:44
> 14:02:34.929051 192.168.10.1 > 192.168.10.3: icmp: echo request
> 14:02:44.939136 192.168.10.1 > 192.168.10.3: icmp: echo request
> 14:02:52.052260 arp reply 192.168.10.1 is-at 0:0:e8:5b:13:44
> 14:02:54.949402 192.168.10.1 > 192.168.10.3: icmp: echo request
> 14:03:02.063079 arp reply 192.168.10.1 is-at 0:0:e8:5b:13:44
> 14:03:04.959534 192.168.10.1 > 192.168.10.3: icmp: echo request
> 14:03:12.072830 arp reply 192.168.10.1 is-at 0:0:e8:5b:13:44
> 
> Any clues or pointers are greatly appreciated and will mean I get to deploy
> FreeBSD with netgraph rather than linux with veth.
> 
It seems that you use the same 192.168.10/24 network on both fxp0
and ngeth0 interfaces -- this is troublesome, as ARP in FreeBSD
(this is about to change soon) is the global, non per-interface
property, and is stored in a single routing table.  So when you
ping 192.168.10.3 from the remote box, it sends ARP request,
the bridge correctly forwards it to ngeth0, that correctly
replies with ARP reply, and ICMP ECHO REQUEST gets delivered to
ngeth0.  Then FreeBSD box with ngeth0 tries to send ICMP ECHO
REPLY.  For this, it looks up its routing table, and finds out
that 192.168.10.1 is on fxp0 (not on ngeth0!), so the reply
will be from the fxp0's MAC and with 192.168.10.3 source IP
address -- I've verified this locally.  Generally, it's not
possible to have two broadcast type interfaces in the same
subnetwork on one (FreeBSD) box.  Put it in other way: suppose
it works somehow.  So when you ping 192.168.10.1 from the
box with fxp0 and ngeth0, and both have addresses from the
same IP subnetwork, which interface (i.e., which MAC) should
get used?


Cheers,
-- 
Ruslan Ermilov
ru at FreeBSD.org
FreeBSD committer
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-net/attachments/20040427/42239888/attachment.bin


More information about the freebsd-net mailing list