Почните тамо где се порука појављује. Клијент се повеже, тунел се подигне, а затим дневник јавља да је Linux наредба за додавање руте неуспешна уз File exists. Ништа у тој реченици не односи се на сертификат, кључ или конфигурациону датотеку, иако речи на то упућују. Кернел описује своју табелу рутирања, а префикс који сте тражили да се инсталира већ има запис.

Пратите клијентов сопствени редослед: шта је тражио, шта је табела већ садржавала, ко је тај запис тамо поставио и тек онда шта променити. Сваки корак уклања једног могућег власника.

Шта је клијент заправо тражио

Пре неуспеха клијент бележи руту коју намерава да дода, обично као одредиште, мрежну маску, гејтвеј и понекад као метрику или табелу. Тај ред је захтев. Грешка која следи је одговор кернела на њега, и њих двоје треба читати једно уз друго.

journalctl -u openvpn-client@office -b --no-pager | grep -nE 'route|File exists'
openvpn --config /etc/openvpn/client/office.ovpn --verb 4 --log /tmp/ovpn.log

Ненулти излазни статус помоћника за руте мање је информативан од текста испод њега, јер различити одговори кернела дају ненулти статус. Сачувајте тачну поруку; разлика између постојећег записа и недоступног гејтвеја одлучује који од следећих одељака важи.

Читајте постојећу руту, не само адресу

Претрага табеле за исти тачкасти квадрипл није довољна. Објекат руте идентификују адресна фамилија, табела, префикс одредишта, метрика, протокол и излазни уређај, а записи који деле префикс могу легитимно да коегзистирају када се ти атрибути разликују. Судара се цео објекат, а не текст.

ip -4 route show table all | grep -F '10.40.'
ip -4 route show match 10.40.0.0/16
ip -4 route get 10.40.0.5

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

Забележите префикс, табелу, метрику и уређај поред неуспелог захтева. Ако постојећи запис има исте атрибуте и исти следећи хоп, имате дуплирану инструкцију, а не проблем са рутирањем.

Четири власника која префикс може имати

Повезане руте долазе из додељене адресе и систем их поново ствара кад год та адреса постоји. DHCP клијент или менаџер веза инсталира руте као део сопственог животног циклуса. Други VPN клијент можда већ носи исти префикс. А локална кука или скрипта може додати ону за коју ништа друго не зна.

Сваки власник захтева другачију исправку. Повезана рута није ваша за брисање; њено уклањање може прекинути локални приступ пре него што тунел буде употребљив, а кернел ће је вратити. Руту коју поседује менаџер треба мењати кроз тај менаџер, а не ручном ip route del коју следеће поновно повезивање поништава.

Задржани интерфејс олакшава исту збрку. Када уређај тунела преживи поновно повезивање, руте које је инсталирао прилагођени код за подешавање могу и даље постојати при другом покретању, па скрипта која претпоставља чисто стање не успева други пут и ради први. Или намерно очистите застарели запис или учините код за подешавање идемпотентним.

block-local одговара на друго питање

Када профил шаље сав саобраћај кроз тунел, клијент мора да одлучи шта се дешава са локалном мрежом. Заставица block-local мења ту одлуку усмеравајући локални LAN кроз тунел, уз задржавање документованог изузетка за LAN гејтвеј; то је избор саобраћајне политике са видљивим последицама на доступност.

То не објашњава зашто је додавање руте вратило грешку постојећег записа, а прихватање тога као универзалне поправке крије стварни сукоб иза промене политике. Ако ваши локални ресурси постану недоступни након измене профила, ова заставица је једна од првих ствари које треба проверити; ако додавање руте не успе, она није одговор.

Третирајте је као одлуку о томе која одредишта остају локална, донету намерно и записану. То није прекидач који треба испробати кад дневник изгледа алармантно.

Затворите круг: уклоните дупликат на његовом извору

Када знате који власник држи запис, уклоните дуплирану инструкцију тамо где је дефинисана. То може бити ред route у профилу, push са сервера или кука коју више не треба извршавати.

ip -4 route show match 10.40.0.0/16
ip -4 route get 10.40.0.5
journalctl -u openvpn-client@office -b --no-pager | tail -n 15

Затим се поново повежите и потврдите три ствари: тунел се подигне, предвиђено одредиште се разреши на путању коју сте желели, и грешка нестане без нове која се појављује на њеном месту. Чист дневник са погрешно одабраном путањом није поправка.

Ако префикс значи локални LAN са једне стране и удаљену мрежу са друге, проблем је преклапање адреса, а не дупликат, и никакво брисање неће учинити оба значења истинитим истовремено. Тај случај тражи другачији план за једну од две мреже. Одлучите која ће страна бити пренумерисана пре него што додирнете било коју.

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