Потребител съобщава, че вътрешното приложение работи от една машина и се проваля от друга, а ping, който пускате от шлюза, успява и в двата случая. При няколко тунела с еднаква цена това не е противоречие. Всеки поток се поставя на свой следващ хоп, така че вашата проверка и сесията на потребителя може просто да използват различни пътища. Разборът по-долу възпроизвежда избора, преди да се промени нещо.

Един ping, няколко възможни пътя

Когато маршрутът има повече от един следващ хоп с еднаква цена, рутерът трябва да избере един за всеки пакет. Повечето реализации хешират полета от пакета, обикновено адресите на източника и дестинацията заедно с протокола и портовете, за да останат отговорите на същия път. Различните приложения, дори различните връзки от едно приложение, дават различни хешове.

Ето защо диагностика от шлюза доказва толкова малко. Собствената проверка на шлюза има свои адреси и портове, а следователно и свой хеш. Тя може да попадне на здравия тунел, докато потребителят продължава да попада на счупения.

Как платформата избира следващ хоп

Възпроизведете избора, вместо да го гадаете. Попитайте ядрото кой маршрут би използвало за същите източник и дестинация като при неуспешната сесия. Тази проверка включва полета, които обикновеното търсене по дестинация пренебрегва. Изпълнете я и от работещ клиент и сравнете двата отговора:

ip route get 10.20.5.7 from 10.20.0.14

По-новите издания на iproute2 приемат също протокола и порта на дестинацията, което има значение, когато хешът ги включва. Сравнете този изход със същата проверка от работещ клиент и разликата е доказателството, което ви липсваше.

ObservationLikely causeFirst check
Ping works, application failsA different flow hash selects another tunnelPer-flow lookup from the client's address
Some users fail, others do notOne tunnel lacks a prefix or selectorCompare both tunnels' installed routes
Fails only at larger sizesTunnels have different effective MTUProbe the same size over each path
Fails after a reconnectStateful asymmetry between pathsSession state on both gateways

Проследете неуспешния поток, а не таблицата с маршрути

Таблицата с маршрути изброява двата тунела и по определение изглежда вярна. Въпросът е какво прави всеки тунел с пакета, след като бъде избран. Проверете дали и двата носят едни и същи защитени префикси, същото разрешение за препращане и обратен път, който достига до същия клиент.

Обърнете внимание на устройствата със състояние по средата. Ако заявка излезе през единия тунел, а отговорът се върне през другия, защитна стена или NAT, които никога не са видели първоначалния поток, ще го отхвърлят. Двата тунела препращат трафик правилно, а връзката все пак се проваля.

Проверете също MTU по всеки път. Път с допълнителна инкапсулация свива използваемия размер и трансфер, който успява по единия тунел, засича по другия точно при размера, при който по-малкият се чупи.

Сравнявайте по един път наведнъж

Където дизайнът позволява обслужване, извадете единия тунел от експлоатация и повторете задачата на потребителя. Ако неизправността изчезне, проблемът е в премахнатия път и следващата стъпка е да сравните конфигурацията му със съседния, а не да преглеждате отново таблицата с маршрути.

Сравнявайте реалното приложение, а не повтарящи се ping. Запишете дали неизправността следва определен следващ хоп, размер на пакета или преход след повторно свързване, защото тези три модела сочат към различни поправки.

Накрая запишете защо пътищата се смятат за еквивалентни и как неизправност трябва да извади един от тях от експлоатация. Многопътността е безопасна само когато пътищата наистина са взаимозаменяеми и това е проектно твърдение, което си струва да се провери, вместо да се приема.

Подобни статии