Git забива без VPN? OpenSSH маркира пакетите с IPQoS
OpenSSH маркира пакетите си със стойност за QoS по подразбиране. Където пътят изхвърли тази маркировка, push забива, докато тунел не смени маршрута на пакетите.
Клониране от офиса работи, същото клониране през мобилна точка работи, а същото клониране от хотелска мрежа увисва, докато не се включи VPN. SSH ръкостискането завършва и сесията замлъква при първия реален трансфер. Един ред, добавен в конфигурацията на клиента, излекува git и ssh едновременно. Когато една настройка на клиента поправя няколко инструмента наведнъж, дефектът е в това, което клиентът изпраща, а не в канала, по който го изпраща.
Прочетете симптома като разлика в маршрута
Тунел, който лекува проблем, рядко е ремонт. Той сменя маршрута, оператора и междинните устройства, докато лаптопът продължава да произвежда същите пакети. Ако един маршрут борави зле със заглавка, а друг я пропуска непокътната, разликата е в политиката на междинното устройство, а не в клиента. Тунелът тук е свидетел, а не решение.
Точката, в която сесията умира, стеснява още. Нищо, което се проваля при търсене на име или при обмен на ключове, не изглежда така. Сесия, която се удостоверява, отпечатва банер и след това замръзва при първия голям запис, вече е доказала, че маршрутизацията, имената и идентификационните данни работят.
Клиентът слага байт за QoS на всеки SSH сокет
Всяка OpenSSH връзка от 7.8 нататък носи в IP заглавката стойност, която рутерите могат да използват за приоритизиране на трафика. Терминалните сесии получават една стойност, а масовите копия — друга, на теорията, че човекът, който пише, заслужава по-добро отношение от трансфера на файл. Повечето мрежи напълно пренебрегват подсказката и затова тя остава незабелязана с години. Малцинство от Wi-Fi драйвери, мобилни оператори и VPN концентратори реагират на нея, а някои от тях реагират лошо.
Когато тази стойност се пренапише или изхвърли по средата на потока, връзката не се проваля, тя спира да напредва. Повторните предавания растат, прозорецът се срива, а приложението не съобщава нищо, защото нищо не е дало грешка. Точно тази тишина кара хората да описват симптома като забиване, а не като отказ.
Първо потвърдете версията на клиента с ssh -V. Всичко на 7.8 или по-високо носи това поведение по подразбиране.
Три команди, които отделят това от MTU и DNS
Две подобни възможности заслужават отхвърляне, преди да редактирате какъвто и да е конфигурационен файл. Дефект в MTU пропуска малките обмени и замръзва при първия голям пакет, докато дефект в имената изобщо не създава сесия.
ssh -o IPQoS=none -v [email protected]
ssh -G [email protected] | grep -i ipqos
sudo tcpdump -ni any -vv "tcp port 22"
Първата команда повтаря неуспешната операция с изключена маркировка и успешното ѝ изпълнение е най-силното единично доказателство, с което разполагате. Втората отпечатва конфигурацията, която клиентът действително ще приложи към тази дестинация, което хваща остарял запис във файл, който сте забравили. Третата показва байта TOS в двете посоки, докато трансферът е зациклил, а интересният модел е стойност по счупения маршрут и липса на такава по работещия.
Правете захвата на лаптопа, а не на сървъра, защото изпращачът задава стойността и всяка посока може да я промени. Сравнете работещ и неуспешен маршрут със същия захват и разликата се появява без догадки.
Сложете изключението в един файл, по един хост наведнъж
Изключението принадлежи до хоста, за който се отнася, с коментар, който казва защо съществува.
Host gitlab.example.internal
IPQoS none
# direct route rewrites the marking; the tunnel route passes it
Обхватът е по-важен от самата стойност. Запис с шаблон изключва поведението навсякъде, изхвърля подсказка, която помага в добре държащи се мрежи, и не оставя никого да каже кога се е появил. Записът за отделен хост е четим, обратим и много лесен за изтриване, след като мрежата бъде поправена. Използвайте потребителския файл за лично заобикаляне и управляван файл, когато цял парк се нуждае от същото изключение.
Бъдете изрични какво не покрива изключението. То важи за SSH, така че HTTPS отдалечено хранилище, огледало на пакети и браузър остават извън него и отказ във всяко от тях изисква собствени доказателства. По верига през бастион всяка стъпка използва конфигурацията на клиента и стъпката, която забива, е тази, която си струва да се ограничи.
Затворете цикъла със собственика на мрежата
Предайте находката като четири факта: версия на клиента, тестван маршрут, използван VPN клиент и коя посока е носила маркировката. Тези четири са достатъчни на собственика на мрежата, за да възпроизведе отношението и да реши дали е умишлено.
Ако изключението не излекува забиването, премахнете го. Заобикаляне, което преживее неуспешен експеримент, се превръща в мит и следващият човек губи час, за да докаже, че не прави нищо. Ако пък излекува забиването, пътят все още е грешен за всеки друг инструмент, който го пресича, и ремонтът е работа на този, който управлява междинното устройство.
Промяната в клиента е временно решение със срок на годност. Запишете този срок в коментара.