Acontece que você pode colocar uma interface de túnel em um namespace de rede. Todo o meu problema foi um erro ao trazer a interface:
ip addr add dev $tun_tundv \
local $ifconfig_local/$ifconfig_cidr \
broadcast $ifconfig_broadcast \
scope link
O problema é "link de escopo", que eu entendi como afetando apenas o roteamento. Faz com que o kernel configure o endereço de origem de todos os pacotes enviados para o túnel para 0.0.0.0
; presumivelmente, o servidor OpenVPN então os descartaria como inválidos por RFC1122; mesmo que isso não acontecesse, o destino obviamente seria incapaz de responder.
Tudo funcionou corretamente na ausência de namespaces de rede porque o script de configuração de rede interno do openvpn não cometeu esse erro. E sem "link de escopo", meu script original funciona também.
(Como eu descobri isso, você pergunta? Ao executar strace
no processo openvpn, defina para hexdump tudo o que ler do descritor de túnel e, em seguida, decodificar manualmente os cabeçalhos de pacote.)