My organisation currently has two active IPv6 ranges available to it, and we're cutting over from one to the other. I would like to have them both working at once, but it appears that Linux does not support policy routing for IPv6. Our Linux-based router is running 2.6.26-2-686 on Debian Lenny.
Here's what I would like to do:
# ip -6 rule add from 2001:388:7094:4080::/58 lookup oldv6
(policy route the old v6 range using table oldv6)
# ip -6 route add throw 2001:388:7094:4080::/58 table oldv6
(throw back to the main routing table for local routing)
# ip -6 route add default via 2001:388:7094:1::1 dev eth1
(otherwise use the 'old' default router)
However, the second line doesn't work:
RTNETLINK answers: No such device
Having read through the available documentation, it appears that Linux doesn't support real policy routing for IPv6 ([2] - see section 9.2, [3]), and only fakes it when you add tables. Of course, being Linux, these documents haven't been updated for more than five years, and so I'm wondering if anyone has any brilliant insights - is there a parameter or documentation I've missed? There's a 2007 thread suggesting it doesn't work but I would be keen to hear otherwise.
Based on experimentation, the answer appears to be "yes, IPv6 policy routing is supported on Linux". I'm still not sure why the above lines fail, but I've hacked around it for now.