One big issue that we will have to deal with before really launching is the fact that several home routers use 10.0.0.0

I honestly don't know if any of them use 10.0.0.0/8 or if they're all 10.0.0.0/24 but either way it's a problem.

There are two possible solutions.

= We don't use 10.x.x.x for the mesh =

There _are_ alternatives but one of them look great. Here are some I've looked at.

== 44.0.0.0/8 ==

This is the HAM or AMPRnet subnet. It looks like it's very scarcely used, if it's really used at all. It's for HAM packet radio and experimentation. One the one hand I don't want to piss of the HAMs, but on the other hand their entire subnet is in violation of net neutrality since they don't allow commercial traffic on their subnet. This is definitely the easy solution.

Here's an overview of their allocations:

  https://portal.ampr.org/networks.php

I'm sure if we did a ping scan of the address space we'd see only very few hosts. Anyone wanna take a stab at that?

== 238.0.0.0/8 ==

Using multicast address space as unicast unfortunately does not work.
All of 240.0.0.0 and above is designated as "future use". However, an IETF proposal to take it into use was rejected, apparently partially because many IP stacks just outright reject or ignore any packets from this address space. We'd need an overview of which systems are affected, but I don't really think this is a viable option.

= We use 10.x.x.x for the mesh =

If we are to use 10.x.x.x for the mesh then we will have to do something clever/ugly.

A solution would contain the following parts:

* The DHCP client would have to remap 10/8 DHCP responses on eth0 to a different subnet (this could be 240/8) such that the interface takes on an address different from the one provided by the DHCP server.
* ARP spoofing would have to be enabled on eth0 such that the node will respond to ARP requests for the address it was assigned via DHCP.
* All incoming traffic on eth0 with a destination of 10/8 would have to be remapped to 240/8 before routing happens
* All outgoing traffic on eth0 with a destination of 240/8 would have to be remapped to 10/8 after routing happens

To accomplish the DHCP fakery, a modification to the openwrt dhcp client would have to be written. I don't foresee that being very difficult. Depending on the ARP spoofing difficulty, it could be as simple as adding support for a hook script that runs on dhcp lease acceptance.

I'm not sure how best to do the ARP spoofing. There may be mechanisms built into the Linux kernel. It may be that we can actually just assign the 10.x.x.x address gotten from the dhcp server to eth0 in addition to the 240.x.x.x address and just ensure that no mention of the 10.x.x.x address appears in the routing table and that the kernel is configure to _not_ respond to ARP requests on interfaces other than the interface they are inquiring about (the default is to always answer).

It seems that the address remapping might already be possible. I haven't yet tested if it works as expected, but the following commands seem to be what we'd need:

iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j NETMAP --to 239.0.0.0/8
iptables -t nat -A POSTROUTING -o eth0 -d 239.0.0.0/8 -j NETMAP --to 10.0.0.0/8

I'll try to set up a little experiment later tonight to see if this remapping works as expected. Honestly though, using 44.0.0.0/8 seems really attractive to me at this point.

--
marc/juul