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 і який напрямок ніс позначку. Цих чотирьох достатньо власникові мережі, щоб відтворити ставлення й вирішити, чи воно навмисне.
Якщо виняток не лікує зависання, приберіть його. Обхід, що пережив невдалий експеримент, стає фольклором, і наступна людина витрачає годину, доводячи, що він нічого не робить. Якщо ж він лікує зависання, шлях усе ще неправильний для кожного іншого інструмента, який його перетинає, і ремонт — справа того, хто керує проміжним пристроєм.
Зміна на клієнті — це тимчасове рішення з терміном придатності. Запишіть цей термін у коментар.