I need to send traffic from a client machine, A, to a VPN server, C, but through a relay host, B. All three of them have public IPv4 addresses, but for policy reasons, A must not send traffic directly to C under any circumstances. A is only allowed to talk to B. The other hard requirement is for a "real" VPN, appearing as a network interface on A -- not a SOCKS proxy (which I know how to do with SSH).
I control the software on all three machines, and there shouldn't be any issue with NAT or firewalls.
I have not been able to figure out even which VPN software can do this, let alone how to set it up. All documentation for both OpenVPN and Openswan discusses only direct connections from client to server.
You could setup an HTTP proxy on server B and use OpenVPN.
https://openvpn.net/index.php/open-source/documentation/howto.html#http