3ronco's Answer provides some good insight into how VirtualBox screws us over with this, but I found his Udev solution didn't work on my Ubuntu 19.04, as the link was still down at the time the script runs.
I tried adding the interface in netplan with static routes configured there, however, for reasons unknown the routes were ignored.
If your system has networkd-dispatcher you can put a script here
if [ $IFACE == vboxnet2 ]; then
/sbin/ip route add fdnn:nnnn:nnnn:2::/64 via fdnn:nnnn:nnnn:1::2
/sbin/ip route add fdnn:nnnn:nnnn:3::/64 via fdnn:nnnn:nnnn:1::3
Now it turns out this script won't be run unless the interface has an entry in netplan. Mine includes one of the ignored routing entries, just to make it syntactically correct (there's probably a tidier way to do this). So I have
# These routes are ignored for reasons unknow,
# I have included them just so that vboxnet2 gets
# a mention here. Actual routes are added by
- to: fdnn:nnnn:nnnn:2::/64