I did this using iptables:
I can't recall the commands, but here are examples from by iptables backup file:
This line allows traffic from the 10.8.1.0/24 subnet to reach the host at 192.168.1.12
-A FORWARD -s 10.8.1.0/255.255.255.0 -d 192.168.1.12 -i tun0 -j ACCEPT
This line drops traffic to the rest of the 192.168.1.0/24 subnet from the 10.8.1.0/24 subnet:
-A FORWARD -s 10.8.1.0/255.255.255.0 -d 192.168.1.0/255.255.255.0 -i tun0 -j DROP
So, you'll need an accept rule for each VPN subnet, (or particular client), for each host, (or hosts on a subnet), and then a drop rule for each VPN subnet and LAN subnet you are pushing routes for.