Per què les rutes d’igual cost fan difícils de veure les fallades de VPN
Quan diversos túnels comparteixen un cost, cada flux pot agafar-ne un de diferent. Un ping correcte no diu res sobre el camí que fa servir realment la vostra aplicació.
Un usuari informa que l’aplicació interna funciona des d’una màquina i falla des d’una altra, i que el ping que executeu des de la passarel·la té èxit en tots dos casos. Amb diversos túnels d’igual cost, això no és cap contradicció. Cada flux es col·loca en un següent salt propi, de manera que la vostra sonda i la sessió de l’usuari poden simplement fer servir camins diferents. El recorregut següent reprodueix aquesta tria abans de canviar res.
Un ping, diversos camins possibles
Quan una ruta té més d’un següent salt amb el mateix cost, l’encaminador n’ha de triar un per paquet. La majoria d’implementacions fan un hash de camps del paquet, normalment les adreces d’origen i de destinació juntament amb el protocol i els ports, perquè les respostes es quedin al mateix camí. Aplicacions diferents, o fins i tot connexions diferents d’una mateixa aplicació, produeixen valors hash diferents.
Per això un diagnòstic des de la passarel·la demostra tan poc. La sonda de la passarel·la té les seves pròpies adreces i ports, i per tant el seu propi hash. Pot caure al túnel sa mentre l’usuari continua caient al trencat.
Com tria la plataforma un següent salt
Reproduïu la tria en lloc d’endevinar-la. Pregunteu al nucli quina ruta faria servir per a la mateixa adreça d’origen i de destinació que la sessió que falla. Aquesta consulta inclou camps que una consulta simple de destinació ignora. Executeu-la també des d’un client que funciona i compareu les dues respostes:
ip route get 10.20.5.7 from 10.20.0.14
Les versions més noves d’iproute2 també accepten el protocol i el port de destinació, cosa que importa quan el hash els inclou. Compareu aquesta sortida amb la mateixa consulta des d’un client que funciona, i la diferència és la prova que us faltava.
| Observation | Likely cause | First check |
|---|---|---|
| Ping works, application fails | A different flow hash selects another tunnel | Per-flow lookup from the client's address |
| Some users fail, others do not | One tunnel lacks a prefix or selector | Compare both tunnels' installed routes |
| Fails only at larger sizes | Tunnels have different effective MTU | Probe the same size over each path |
| Fails after a reconnect | Stateful asymmetry between paths | Session state on both gateways |
Seguiu el flux que falla, no la taula d’encaminament
La taula de rutes llista tots dos túnels i, per definició, sembla correcta. La pregunta és què fa cada túnel amb el paquet un cop triat. Verifiqueu que tots dos porten els mateixos prefixos protegits, el mateix permís de reenviament i un camí de tornada que arribi al mateix client.
Fixeu-vos en els dispositius amb estat pel mig. Si una petició surt per un túnel i la resposta torna per l’altre, un tallafoc o un NAT que mai no ha vist el flux original la descartarà. Els dos túnels reenvien el trànsit correctament i la connexió continua fallant.
Comproveu també l’MTU per camí. Un camí amb una encapsulació extra redueix la mida útil, i una transferència que té èxit per un túnel s’encalla per l’altre exactament a la mida on es trenca el més petit.
Compareu un camí alhora
On el disseny permeti manteniment, traieu un túnel de servei i repetiu la tasca de l’usuari. Si la fallada desapareix, el problema és del camí que heu tret, i el següent pas és comparar-ne la configuració amb la del veí en lloc de tornar a examinar la taula d’encaminament.
Compareu l’aplicació real, no pings repetits. Anoteu si la fallada segueix un següent salt concret, una mida de paquet o una transició després de reconnectar, perquè aquests tres patrons apunten a reparacions diferents.
Finalment, anoteu per què els camins es consideren equivalents i com hauria de treure un d’ells de servei una fallada. El multipath només és segur quan els camins són realment intercanviables, i això és una afirmació de disseny que val la pena comprovar en lloc de suposar.