Eu tive problemas de correspondência por oif. Eu suspeito (mas não tenho certeza) porque a decisão da interface de saída é tomada depois de decidir qual entrada de rota usar.
Mas você pode combinar o endereço IP de saída e fazer o roteamento de políticas.
Por exemplo:
echo "100 TUN" >> /etc/iproute2/rt_tables
ip route add 10.197.2.0/24 dev tun0 table TUN
ip route add 69.30.217.90 via 10.197.2.1 dev tun0 table TUN
ip rule add from 10.197.2.8 table TUN
O echo cria um alias para a tabela de roteamento # 100 (daqui em diante TUN) para que possa ser referido pelo nome nos comandos iproute2.
O primeiro comando de rota adiciona a rede básica no link para tun0 na tabela TUN. Isso deve ser definido para a mesma rede que a rota pré-existente em sua tabela padrão.
O segundo comando route adiciona o host e o gateway específicos associados ao tun0 na tabela TUN.
Finalmente, a regra corresponde aos pacotes pelo IP de origem. O valor aqui deve ser alterado para o endereço da interface local no tun0 ou toda a rede não sobreposta também funcionaria. Ele direciona os pacotes que correspondem a essa regra para usar a tabela TUN, que seria roteada de acordo com as rotas que adicionamos anteriormente a essa tabela.
Você pode querer experimentar a regra de correspondência oif. Isso nunca funcionou para mim, mas ymmv:
ip rule add oif tun0 table TUN