I got this working. I'm posting my setup for posterity, since there's a shortage of docs for this stuff. The goal is to set up a TAP VPN in a hub-and-spoke-format:
@jimp:
Never, ever, ever make static routes that point to OpenVPN. It fails in exactly this way.
OpenVPN manages routes internally. Depending on your setup, you need to set them in the local/remote networks on the clients and servers and possibly in client-specific override entries on the server.
If you can describe the setup of your VPN more in-depth that would help. For example, which VPN mode you're using (static key or SSL/TLS), the tunnel network you have set, etc.
I saw what you meant. I should just be able to push the routes I need from the server.
So I ripped everything out, except for the certs and my client specific overrides (which is just used to specify the bridge iface IP). I deleted every route and gateway that I had manually made, and removed every reference to remote or local LANs in both the client and server setting. I added just two directives to the advanced section of the client specific settings.
To set the bridge interface ip address for the client on SITE A:
ifconfig-push 10.0.0.100 255.255.255.0;
I always had that, but to properly set the route, mask, and gw for client on SITE B's subnet, all I needed to do was:
push "route 10.10.0.0 255.255.255.0 10.0.0.101";
Therefore the client on SITE B must have it's address assigned as follows:
ifconfig-push 10.0.0.101 255.255.255.0;
… and it can resolve SITE A through SITE A's client's bridge interface address which we just set above ...
push "route 10.5.0.0 255.255.255.0 10.0.0.100";
The last thing you need to do is allow/block traffic on the bridge interface (Firewall -> Rules -> OpenVPN.)
Block 67-68 (DHCP) from any source to any destination
Allow from * to * (or on on a per subnet basis)
That's it. No need for anything else.
Thanks everyone for all the help..