Eu sei que isso provavelmente não é o que você quer ouvir, mas a melhor maneira de lidar com IPsec e roteamento é separar completamente os dois. O IPsec padrão no modo de política (da maneira como o Linux faz e se parece com o que você está usando) tem uma tendência a "mimar" as camadas tornando o roteamento muito obscuro. Uma maneira melhor de fazer isso é tratar o IPsec mais como um link de rede lógico típico: fazer IPsec lidar com comunicação ponto-a-ponto e camada GRE no topo com protocolos de roteamento dinâmico como OSPF e BGP (você pode pular o roteamento dinâmico se você quer, mas é recomendado).
No seu caso, em vez de fazer interface direta com 172.16.0.0/16
com 10.0.0.8/8
, você tem a pilha IPsec para criar um link ponto a ponto em um /30
ou mesmo um /31
. Por exemplo, você pode usar 10.254.254.1/30
para o IP esquerdo e 10.254.254.2/30
para o IP correto. Uma vez estabelecida, crie um túnel GRE com IPs internos 10.100.100.1/30
para o lado local e 10.100.100.2/30
para o lado remoto (e use os IPs 10.254.254.0/30
acima mencionados para o lado externo apropriado). Bônus: se você conseguir executar o IPsec no modo de transporte, poderá renunciar completamente à parte 10.254.254.0/30
e usar os IPs reais dos pontos de extremidade como a parte externa do túnel GRE.
Agora você tem uma interface Ethernet padrão (o túnel GRE) e pode fazer rotas estáticas com muita facilidade: basta apontar 10.0.0.8/8
via 10.100.100.2
e 172.16.0.0/16
at 10.100.100.1
. Melhor ainda: remova completamente estas rotas estáticas e faça com que o OSPF ou o BGP lidem com o roteamento automaticamente para você (veja o quagga para isso).
O IPsec é um protocolo realmente flexível, e por causa disso muitas coisas acabam sendo sugadas em seu vórtice. Em um certo ponto, é realmente melhor que o IPsec se atenha ao que faz de melhor e utilize conceitos de pilha de rede de nível mais alto em vez de jogar a pia da cozinha nele.