[Cerowrt-devel] Nuking the device naming scheme in cerowrt
david at lang.hm
david at lang.hm
Thu Dec 8 06:40:40 EST 2011
On Thu, 8 Dec 2011, Dave Taht wrote:
> This is about the 5th? in a string of emails talking about what might
> be dropped from the next release of cerowrt.
>
> One change I made early on was that I renamed the devices to be
> semantically equivalent to what they did, rather than what they were.
> I also encoded what physical radio a given virtual ssid was attached
> to.
>
> The device naming string is defined here:
>
> http://www.bufferbloat.net/projects/cerowrt/wiki/Device_naming_scheme
>
> I did this for several reasons.
>
> 1) *I* can never remember that 'eth0' is the gateway to the internet
> and eth1 the gateway to the internal network, or is it br-lan the
> bridge that's the internal network, or what?
first off, I am extremely familiar with Linux, but only somewhat with
openWRT, so things that are a limitation of the GUI I will probably get
wrong.
Linux allows you to rename interfaces, and bridges, but I find that it
seldom really helps a lot.
That being said, openwrt by default names the default uplink network 'wan'
(with the interface eth1) and everything else 'lan' (technically br-lan,
with all the other interfaces bridged in to this), it gives you the
ability to name the networks and even name the interfaces.
this already is available today with the stock software, including the
luci gui, but the user needs to decide to use the names.
> 2) I wanted to make more apparent the concept of 'guest' interfaces
> that would let you share correctly with another router, or your
> neighbor.
openwrt supports this, but you do have to setup the mapping yourself. the
good news is that you usually only have to do this once.
It would probably not be a bad thing to have the default configuration
that you ship include a 'guest' set of networks (SSIDs on each radio and a
VLAN that's defined as wired guest, but with no interfaces assigned to it
yet)
> 3) I wanted to be able to have firewall rules and nat not have to be
> re-applied when an interface went up or down, thus not breaking
> existing connections.
firewall rules being applied to an interface do not have to break the
existing connections, flushing the connection table will break the
existing connections, and if a connection has heavy enough traffic on it
so that a packet arrives in the brief period where the interface is down
it will bounce and trigger a connection close.
This may just be getting a flag in place somewhere to not flush the
connection tracking table.
My fireall at home is an ancient pentium 166 (I really do need to around
to replacing it one of these years :-) and about 6 months ago one of the
NICs started getting flaky where it would stop transmitting. As a
temporary work-around I ended up setting up a cron job that did a ping to
an internal server once a minute and bounced the interfact if the ping did
not work. this ran for about 3 months (before I moved to a different
interface on the box) and was triggering a couple dozen times a day and I
never had a connection broken as a result.
> 4) I wanted to be able to easily express the complexity involved in
> writing firewall rules that did the right thing. For example, with 6
> interfaces, you ended up with a combinatorial complexity in creating
> firewall rules, otherwise, and dealing with that, is hard.
>
> With semantically named interfaces, we could theoretically achieve all
> the above without explosion in complexity or performance loss: e.g
>
> iptables -o g+ -j dealwithguestinterfaces
> iptables -o s+ -j dealwithsecureinterfaces
>
> (the '+' is a pattern match character)
>
> 5) Firewall rules and extensive packet classification really impacted
> performance at the time. (hugely) They still do, but not as much as
> they once did, in part due to nbd's unaligned access improvements, in
> part because I took the crazier classification rules and rewrote them
> in C.
There is a huge amount that can be done with iptables that is really hard
to do in a generic way. As a result, every firewall GUI and configuration
tool that I have seen (including the 6 figure commercial ones) manages the
rules for each interface independantly.
what you really want to do is to make real use of custom firewall chains,
so that you do one pass of rules to categorize the traffic (usually by
source/destination), and then jump to a chain to do the ugly, detailed
decision making stuff.
At work I have a firewall that had a 200 line iptables ruleset on it.
using one of the 6 figure commercial firewall management tool and putting
the same effective rules in it, the result was a 2000+ line ruleset, that
was MUCH harder to understand. The performance is also significantly
better if you can take the tree approach to your ruleset instead of having
one massive list of rules (the time it takes to go through the iptables
rules is proporional to the number of rules that you need to evaluate
before hitting an decision, this is analogious to a dpeth first search
through a tree vs a linear search on a list)
OpenWRT has a good start on this in the firewall zone definitions, but
unfortunantly when you are creating the rules you can't really take
advantage of this.
> Problems:
>
> 1) openwrt's methods of dealing with the firewall involve treating
> firewalling as a separate subsystem from the interfaces, and since
> they don't create a lot of interfaces, the added complexity I was
> trying to simplify doesn't appear. There are also, certainly,
> compelling reasons to treat firewalling and nat as separate from the
> interfaces themselves.
>
> Regardless, I'd still really like to see support for the + syntax
> arrive up in the gui and scripts, but I haven't got around to fixing
> it myself, like so many other things.
>
> 2) And it really bugs me that 'nat' is not a discoverable property of
> the interface.
NAT actually has very little to do with the interface. NAT is the result
of decision making rules, and you can have NAT on some packets that go out
an interface, but not others, even from the same source IP to the same
destination IP (although anyone doing so needs to have their head examined
:-)
> 3) I never got around to creating a scheme that handled vlans well.
> The industry standard naming system of device.X doesn't map well into
> the above pattern matching scheme!!
>
> 4) This change REALLY confused openwrt veterans and people that were
> just used to seeing eth0 and stuff like that. Their fingers 'just
> type' eth0.
not just openWRT venterans, I'll bet it confused a lot of linux veterans
as well.
> Conversely, it didn't bother new users at all.
>
> Now, part of this idea was accepted upstream - wireless devices are
> now named wlanX-Y, where X is the radio name - which is good.
>
> Dropping the naming scheme would involve some headache, but bring back
> more backward compatability with 'normal' openwrt.
this would be a very good thing
> I'd like to go back and more thoroughly analyze the performance
> problems we ran into with extensive rules and classification we were
> doing then, particularlly with ipv6, and see what they really cost
> now, and what the semantic change to the device naming scheme can do
> to improve both performance and correctness.
>
> On the other hand, it's just another headache all it's own, unlikely
> to be adopted unless some advantage can be shown to work well.
I'd need to see the rules that you were creating, but I would be surprised
if there wasn't a way to do some cleanup of them to improve the
performance.
David Lang
More information about the Cerowrt-devel
mailing list