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

Два начина за смяна на изход

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

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

Цената е сложност: две таблици за маршрутизация, класификатор, който работи на правилната кука, и маркировки, които трябва да се координират с всичко останало на машината.

Дайте на всеки изход собствена таблица

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

ip rule add fwmark 0x10/0x10 table 101
ip rule add fwmark 0x20/0x20 table 102
ip route add default via 192.0.2.1 dev wg-a table 101
ip route add default via 198.51.100.1 dev wg-b table 102

Добавете маршрут blackhole в края на всяка таблица, така че търсене без съвпадение да се проваля шумно, вместо да избяга към подразбиране, което не сте избрали.

Изберете веднъж, при първия пакет

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

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

nftables държи маркировките на пакета и на връзката отделно и ръководството за метаинформация документира явното копиране между тях. Маркировката на връзката не става сама по себе си маркировката на пакета, с която съвпада правилото ви, и това е най-честата причина внимателно написан класификатор да няма ефект.

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

Четири фази на източване

  1. Подгответе B, без да пипате A: маршрутизация, препращане, оторизация, NAT и обратен път. Инсталирайте таблицата и политиката за избор през съществуващия собственик на конфигурацията на шлюза.

  2. Превключете класификатора, така че новите, некласифицирани връзки да избират B, като запазвате запазените избори. Атомарната транзакция на nftables избягва прозорец, в който старото състояние трябва да се изчисти.

  3. Оставете A включен, докато потоците му приключат. Неговият интерфейс, таблица, отдалечен изход и NAT преобразувания са все още част от тези потоци, а редактирането на NAT правило не преизгражда връзки, които вече съществуват.

  4. Изведете A от експлоатация, когато условието за източване е изпълнено, преценено по състоянието на връзките и поведението на приложението, а не по един тих интервал.

Какво източването не може да обещае

Заявката от браузър не е нова транспортна връзка; обединяването продължава да изпраща заявки по старата. Обратно, UDP поток може да остарее от conntrack и по-късен пакет се класифицира наново. Източването следва проследяваните потоци, а не представата на приложението за сесия.

Ако A се провали, преди потоците му да приключат, запазената маркировка не ги спасява. Те се свързват отново през B или не се свързват изобщо. Планираното източване купува непрекъснатост, докато първоначалният път е здрав; то не е репликация на състояние между независими изходи.

Проверете двете половини

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

Не изчиствайте таблицата на conntrack, за да се появи новият избор. Това унищожава точно състоянието, което източването трябва да запази, и превръща контролирана миграция в прекъсване с чисто изглеждащ тест.

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