Поновно додељивање адресе траје минут. Недеља после тога је место где се премештање квари, и ретко тамо где то сугерише конзола провајдера. Нова јавна IP адреса помиње се на четири места: сокет на ком демон слуша, котва поверења коју клијенти проверавају, свако правило које именује стару адресу и DNS запис који их спаја. Два премештања изгледају исто у контролном панелу, али се понашају потпуно различито: поновно додељивање адресе на машини коју водите, или подизање другог endpoint-а и премештање клијената на њега. Провере испод стављају јефтине отказе прве, и сваки одељак наводи на које се премештање односи.

Замена на месту и паралелни прелаз су различити послови

Замена на месту задржава хост, кључеве, табелу рутирања и списак корисника; мења се само адреса. То ради поновно додељивање лебдеће IP адресе, и код неколико провајдера гост то уопште не примети, јер се превођење дешава испред инстанце. Поновно грађење или додела од провајдера је оштрија: гост види промену, и све што је кеширало стару вредност сазнаје је у истом тренутку.

Паралелни endpoint је други хост који обавља исти посао. Изградите га, тестирајте једним профилом и оставите стари да одговара док нови не докаже себе на стварној путањи. Цена је стање. Без заједничких peer записа, опозива и логовања имате две мреже које случајно деле име.

QuestionIn-place swapParallel endpoint
Rollback in one step?Only if you can get the old address backPoint DNS back; old host still up
Blast radiusEvery client at onceOnly the clients you moved
Best whenThe address is yours to reassignThe old address is gone for good

Пронађите свако место где је стара адреса записана

Почните текстуалним прегледом, јер су конфигурационе датотеке лакша половина. Претражите конфигурацију демона, фрагменте заштитног зида, циљеве надзора и сваки генерисани клијентски пакет на диску. Укључите IPv6 адресу ако је објављујете; премештање које прати само A запис оставља клијенте са двоструким стеком на старом путу.

OLD=203.0.113.10
grep -RIn -- "$OLD" /etc /root
ss -lunpt | grep -F "$OLD"
nft list ruleset | grep -F "$OLD"
iptables-save | grep -F "$OLD"
wg show all endpoints

Затим прегледајте језгро, јер покренут систем држи адресу на местима која ниједна датотека не помиње. Статичко правило изворног NAT-а, запис у ipset-у, bind адреса и запис у conntrack-у надживе конфигурацијску измену која их је уклонила, а неки надживе и рестарт јер су се вратили из сачуваног скупа правила. Један слој изнад, безбедносне групе провајдера, циљеви балансера оптерећења и провере надзора уопште нису на вашем систему датотека.

Запишите инвентар пре него што било шта промените; он служи и као скрипта за враћање.

Клијенти са именом хоста се опорављају; клијенти са дословном IP адресом заћуте

Ако клијенти долазе до сервера преко имена хоста, прелаз је углавном DNS проблем, и TTL који сте поставили јуче одлучује колико ће бити лоше. Резолвери кеширају, stub резолвери кеширају поново, и многи клијенти траже име само при новој вези, па успостављени тунел задржава своју почетну адресу.

Ако је endpoint дословна адреса, ништа се поново не разрешава и ништа не бележи жалбу. WireGuard чува разрешену адресу сокета: Endpoint = vpn.example.net:51820 постаје IP у тренутку када се покрене wg-quick up и остаје та IP адреса док је не промените. OpenVPN је попустљивији: разрешава име хоста remote при повезивању и са resolv-retry infinite поново покушава DNS при поновном повезивању. Са дословном IP адресом, обоје настављају да зову машину која више не постоји.

Оно што људе заварава јесте огледалска слика. Клијент већ усмерен на нову адресу, док стари слушалац још одговара, пролази сваки тест који радите са свог стола. И мене је то преварило: нови endpoint се подигао на телефону из првог покушаја, а клијент са застарелим профилом се појавио тек када је стари слушалац искључен много касније.

Поверење се не премешта са адресом

WireGuard раздваја идентитет од доступности, што премештање адресе чини готово бесплатним. Peer-ови се идентификују јавним кључем, а endpoint је само место где пакети тренутно иду; хост ажурира endpoint peer-а из изворне адресе последњег аутентификованог пакета. Неактиван peer ипак има потребу за разлогом да разговара са новим местом, и адресу учи тек када му сесија остари и поновљени покушаји handshake-а не успеју на видљивом месту. Брзи водич кроз WireGuard покрива поље endpoint.

Сервери засновани на TLS су супротан случај. Сертификат је везан за име, а клијент који бира адресу пореди изабрано са алтернативним именима субјекта. Повежите се преко IP-а са сертификатом који носи само DNS SAN и провера не успева: име које је клијент користио није у сертификату. Поновно издавање са IP SAN-ом поправља ту једну везу и чини следеће премештање горим. Задржавање имена хоста у профилу и остављање verify-x509-name на месту држи проверу строгом док се адреса испод мења.

Затим проверите за шта је демон везан; сокет причвршћен за стару адресу тихо отказује. OpenVPN сервер покренут са local 203.0.113.10 одбија да се подигне када та адреса нестане, док слушалац на 0.0.0.0 прати промену бесплатно. NAT се дели на исти начин: MASQUERADE прати коју год адресу машина сада има, а статички SNAT --to-source 203.0.113.10 наставља да преписује на адресу коју више не поседујете, па повратни саобраћај нестаје. Ако нова адреса долази са другом upstream капијом, проверите rp_filter: филтрирање обрнуте путање одбацује повратни саобраћај који стиже на интерфејс који језгро није очекивало.

Редослед прелаза и докази да је успео

Смањите TTL дан раније, подигните нови слушалац и докажите га профилом који само ви имате. Тест из унутрашњости исте мреже не доказује готово ништа, зато користите телефон на мобилној мрежи и тестирајте нешто што тунел треба да преноси, а не ping до endpoint-а.

Пратите обе адресе кроз цео прозор. wg show all latest-handshakes на новом хосту, или статусна датотека OpenVPN-а, каже колико се peer-ова заиста преместило. Када нови endpoint има очекиване peer-ове, а стари само оне који су заостали, повуците стари слушалац, уклоните застарело NAT правило и извадите адресу из провајдеровог заштитног зида. Уклањање старог слушаоца је корак који се прескаче, и оно затвара празнину у којој застарели профил још стиже до старе мреже.

Писмено одредите окидач за враћање пре почетка: ако нови endpoint не добије handshake од ниједног стварног клијента после договореног прозора, вратите стару адресу и престаните да делите профиле. Затим поново покрените преглед и потврдите да ниједан слушалац није везан за повучену адресу. Две ствари прелазе у следеће премештање: име хоста у клијентском профилу да следећа промена буде DNS измена, и инвентар сачуван поред белешки о опоравку сервера.

Повезани чланци