--- layout: post title: "IPv6 and Netgraph Ethernet pseudo-interface" date: 2017-12-28 12:47:00 +0100 comments: true categories: --- On a NanoBSD firewall, I want to have a separate MAC address on one of the Ethernet interfaces to act as the outer endpoint for IPv6 traffic. This is achieved using a Netgraph eiface: ```plain /etc/rc.local kldload ng_ether ngctl mkpeer sis0: bridge lower link0 ngctl name sis0:lower sis0bridge ngctl connect sis0: sis0bridge: upper link1 ngctl mkpeer sis0bridge: eiface link2 ether ngctl msg sis0: setpromisc 1 ngctl msg sis0: setautosrc 0 ifconfig ngeth0 link 06:00:00:00:00:06 ``` Note that this does *not* include an ifconfig call to set the interface's IPv6 address: this is done by devd, which calls the boot scripts' ifconfig routine when the interface comes up. Thus I have the following line in /etc/rc.conf: ```plain /etc/rc.conf ifconfig_ngeth0_ipv6="inet6 fe80::6/64" ``` If instead of this line I have an explicit ifconfig in `/etc/rc.local` then there is a race condition between rc.local and devd. If devd runs last, the boot scripts won't see any IPv6 address configured for the newly created interface in `/etc/rc.conf`, and they will set `ifdisabled` on it (blocking all IPv6 traffic, and marking the configured link local address as "tentative"). If devd runs first, the problem is dormant, because setting the link local address clears `ifdisabled` as a side effect.