OK, I've sorted out my network issues server but it turns out that I
was misinterpreting the tcpdump output on my VPS. When an external
computer tries to ping my client's virtual IP address, the VPS's
gateway router is *not* forwarding the pings to my server where they
can be shoved into the IPsec tunnel to the client. So it looks like
the iked responder needs to send IPv6 neighbor advertisements for the
allocated address after all. Is there a way to do this?

I have tried two things so far:

1. Manually assign the [randomly allocated] IP address to the
   responder's physical network interface so it knows it has ownership
   of that address:

# ifconfig vio0 inet6 alias 2001:db8:2::1234:5678

Of course, this breaks the tunnel. When the responder sees packets with
destination 2001:db8:2::1234:5678 it consumes them locally instead of
routing them down the IPsec tunnel.

2. Advertise ownership of the address with rad:

$ cat /etc/rad.conf
interface vio0 {
        prefix 2001:db8:2::1234:5678/128 {
                autonomous address-configuration no
        }
}

This doesn't work either because a router advertisement is not the same
as a neighbor advertisement. But I tried!

A third option would be to use a layer 2 tunnel so that the client
would be responsible for sending its own neighbor advertisements. But
the cost is high: I need to configure a gif(4) interface on the client
and now I'm pushing big fat Ethernet frames across the tunnel instead
of modestly portly IPv6 packets. Worse, if I want non-OpenBSD clients
to connect to the server, I have to figure out how to set up the client
side of a layer 2 tunnel on whatever OS they're using. So much work
just to get a globally-routable IP address!


Here is my vision of a perfect world. It's common for IPv6 nodes to
request a new random IPv6 address every couple of hours; OpenBSD's
inet6 autoconf does this by default. There is no shortage of IPv6
addresses on a LAN, and the process of requesting new ones is pretty
well standardized . So what would be fantastic is if instead of
putting "config address 2001:db8:2::/64" in the responder's iked.conf,
I could put "config inet6 autoconf vio0" instead. Then iked would
make sure that vio0 is using autoconf addresses and, if so, it would
request a new address via SLAAC (preferably randomizing all 64 bits
instead of just the bottom 32 bits like it does right now), assign
that address to the client, configure all the routing, and then would
somehow configure vio0 to claim ownership of that address for
NDP neighbor solicitation purposes, but have the kernel *not* claim
the address for routing purposes. The client config wouldn't change
at all; it would still say "request address any". But since we're
visualizing a perfect world and not just a great world, there would
also be an optional "temporary" flag which causes the client to
request a new address every couple of hours (just like how inet6
autconf does on regular interfaces)---since one of the intended use
cases for this would be concealing your region of origin, it seems
like privacy features should be easy to request.

But since I'm not [currently] offering to figure out how to implement
this myself I'll make do with what I have. Is there a way to make the
the responder/server send neighbor advertisements for the address it
allocated for the client, so that this address will be usable on the
global Internet?

Thanks,
Anthony

Reply via email to