Вяртанне адраса са скрыпта client-connect выглядае так, нібыта яно павінна задаць IP кліента. Але не задае: адзіны канал хука да сервера — гэта часовы файл, шлях якога прыходзіць апошнім аргументам скрыпта, і адрас трэба запісаць туды ў сінтаксісе ifconfig-push. Скрыпт, які выводзіць адрас або завяршаецца з нулём, нічога не запісаўшы, стварае падключанага кліента з адрасам з пула, а журнал сервера выглядае цалкам здаровым.

Блытаніна зразумелая, бо некалькі іншых хукаў сапраўды адказваюць праз коды выхаду або зменныя асяроддзя. Гэты мае свой кантракт, і кантракт пачынаецца з імені файла.

Хук запісвае файл, а не вяртае значэнне

Аб’ява — гэта два радкі: script-security 2, каб дазволіць выклік, затым client-connect /etc/openvpn/server/assign-address.sh. Калі кліент праходзіць аўтэнтыфікацыю, сервер запускае гэты скрыпт, дадаўшы згенераваны шлях да файла апошнім аргументам, які будзе $1 толькі тады, калі аб’ява не перадае ўласных дадатковых аргументаў. Усё, што ўжываецца да гэтага кліента, запісваецца ў той файл як звычайныя дырэктывы, па адной у радку, гэтак жа, як яны выглядалі б у канфігурацыі. Абгортка, якая дадае свае параметры, зрушвае пазіцыю, і класічны сімптом — скрыпт, які піша ў шлях, падобны на --verbose.

Код выхаду — другая палова кантракта. Нуль азначае прыняць і прачытаць файл; любое іншае значэнне адхіляе злучэнне, і менавіта так неадпаведная ідэнтычнасць адмаўляецца, а не ціха вяртаецца ў пул. Запішыце поўную дырэктыву перад вяртаннем поспеху, каб паўзапісаны файл ніколі не стаў канфігурацыяй кліента.

Дзве дырэктывы вартыя ўвагі, бо яны ўзаемадзейнічаюць з усім астатнім. ifconfig-push фіксуе адрас, а адпраўлены route паведамляе кліенту, што дасягальна праз тунэль; вярніце першую і забудзьце другую — атрымаеце кліента з адрасам і без кірунку. Парадак унутры файла не мае значэння, але паўната мае. Хук, які адпраўляе маршрут для прэфікса, да якога не дасягне ніводны партнёр, — гэта тая ж памылка з іншага боку.

Уваходныя даныя прыходзяць праз зменныя асяроддзя: common_name, trusted_ip, ifconfig_pool_remote_ip і астатнія. Стаўцеся да ўсіх іх як да радкоў звонку сервера, ніколі як да фрагментаў абалонкі.

Адлюстраванне адрасоў — гэта палітыка, а не арыфметыка

Спакуслівы кароткі шлях — разабраць імя сертыфіката і выкарыстаць яго лічбы як апошні актэт. Гэта не размеркавальнік, і ён няўдала спрацоўвае звычайнымі спосабамі: два імені з аднолькавым суфіксам сутыкаюцца, імя, што сканчаецца на 300, не з’яўляецца адрасам, а сертыфікат, перайменаваны адміністратарам, ціха перамяшчае прыладу. Правярайце належнасць да падсеткі, дапушчальны дыяпазон хастоў, зарэзерваваныя адрасы і ўнікальнасць пры кожным выкліку, і трымайце адлюстраванне ў табліцы, якую чалавек можа прачытаць.

Хто кантралюе імя, той кантралюе адрас, таму вырашыце, што common_name насамрэч прадстаўляе ў гэтым разгортванні. Калі ўключаны username-as-common-name, ідэнтычнасць — гэта лагін, а не суб’ект сертыфіката. Ніколі не перадавайце гэтае значэнне ў ацэнку абалонкі і ніколі не дазваляйце кліенту ўплываць на шлях да файла.

Размеркавальнік на аснове рэестра павінен вытрымаць конкурэнтнасць. Рэзервуйце адрас атамарна, апрацоўвайце няўдалы запіс, не дапускаючы паўканфігураванага кліента, і пазначайце кожнае размеркаванне злучэннем, якому яно належыць, каб позняе адключэнне старой сесіі не магло вызваліць адрас, які ўжо трымае навейшая. Некалькі асобнікаў сервера, што дзеляць адзін пул, робяць гэтую патрабаванне больш вострым, а не апцыянальным.

Тапалогія вызначае, што значыць ifconfig-push

З topology subnet на 10.77.0.0/24 ifconfig-push 10.77.0.20 255.255.255.0 — гэта адрас плюс яго маска. Пад topology net30 другі аргумент зусім не маска, а адрас партнёра, таму капіраванне формы падсеткі на net30-сервер дае кліента, які злучаецца і не можа прапускаць трафік. Змяняйце тапалогію свядома, ніколі — каб прыклад выглядаў узгодненым. Сервер, які ўжо працуе з net30, мае жывых кліентаў на старую адрасацыю, таму пераключэнне — гэта міграцыя з акном абслугоўвання, а не праўка ў адзін радок.

Статычныя адрасы павінны знаходзіцца па-за дынамічным пулам і па-за кожным іншым статычным прызначэннем, уключна з тымі, што выдаюцца звычайнымі файламі client-config-dir. Калі два механізмы могуць выдаць адзін і той жа адрас розным кліентам, адзін з іх у рэшце рэшт гэта зробіць.

Праверце чатыры выпадкі, перш чым давяраць

Праганіце тыя ж праверкі супраць адлюстраванай ідэнтычнасці, неадлюстраванай, перападключэння і змадэляванага збою рэестра. openvpn --config client.ovpn --verb 4 паказвае прызначаны адрас у адказе push, а на серверы grep -A2 PUSH_REPLY /var/log/openvpn/openvpn.log пацвярджае, што фактычна было адпраўлена. Для неадлюстраванай ідэнтычнасці чаканы вынік — адхіленае злучэнне, а не адрас з пула.

Затым агледзіце каталог, у які дэман піша гэтыя часовыя файлы. Скрыпт выконваецца ў паніжаным кантэксце службы, таму шлях, даступны для запісу root, але не для дэмана, ператварае кожнае злучэнне ў адмову з памылкай правоў, пахаванай некалькімі радкамі ніжэй у журнале.

Размеркаванне — гэта не аўтарызацыя: замацаваны адрас усё яшчэ не дае доступу да кожнага прызначэння за серверам. Трымайце палітыку маршрутызацыі і брандмаўэра ў асобным пласце і правярайце яе супраць адраса, які вы толькі што замацавалі.

Падобныя артыкулы