„File exists“ на OpenVPN на рута не е проблем со датотека
Пораката доаѓа од табелата со рути на кернелот, не од датотечниот систем. Прочитајте го записот што веќе го поседува префиксот пред да ја смените политиката за LAN.
Започнете таму каде што се појавува пораката. Клиентот се поврзува, тунелот се крева, а потоа дневникот известува дека командата за додавање рута во 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 од едната страна и оддалечена мрежа од другата, проблемот е преклопување на адреси, а не дупликат, и никакво бришење нема да ги направи двете значења вистинити истовремено. Тој случај бара поинаков план за една од двете мрежи. Одлучете која страна ќе се пренумерира пред да допрете која било.