DNS ад OpenVPN застаецца пасля SIGKILL: спачатку праверце ўладальніка
SIGKILL не можа запусціць хук down у OpenVPN, але systemd-resolved можа ўсё роўна скінуць DNS для спасылкі. Вызначце, што завяршылася, хто валодае рэзалверам і што засталося.
DNS перастае вырашацца пасля таго, як кліент OpenVPN забіты, і першы інстынкт — перапісаць /etc/resolv.conf. Гэтае рэдагаванне можа зламаць працуючы рэзалвер, тады як сапраўдны састарэлы стан знаходзіцца ў іншым месцы. Пытанне, якое трэба вырашыць першым, — хто валодае наладамі DNS, якія ўсталяваў тунель, і ці меў значэнне выхад, які прапусціў ачыстку.
Тры ўмовы вызначаюць рамонт: сігнал, які завяршыў працэс, кампанент рэзалвера, які атрымаў налады, і ці існуе спасылка тунеля дагэтуль. Адкажыце на іх у гэтым парадку, і выпраўленне звычайна прыходзіць без дотыку да глабальнага файла.
Вызначце, які від выхаду адбыўся
У Community OpenVPN і SIGINT, і SIGTERM — гэта запыты на карэктны выхад. SIGKILL нельга перахапіць: яго нельга заблакаваць або апрацаваць, таму ніякая працэдура закрыцця не атрымлівае шанцу запусціцца. Звычайны Ctrl+C у тэрмінале на пярэднім плане спараджае SIGINT, а супервізар, які перастаў чакаць, звычайна пераходзіць да SIGKILL. Розніца важная, бо толькі другі выпадак гарантуе, што хукі былі прапушчаны.
Запуск унутры screen або tmux не змяняе, які сігнал пасылае Ctrl+C. Праверце, што працэс атрымаў насамрэч, а не тое, што звычайна робіць тэрмінал.
Калі тунель запускае сэрвіс або менеджэр злучэнняў, спыніце гэтае адно злучэнне праз яго ўладальніка, а не праз забойства pid. Менеджэр можа зноў падняць працэс, пакінуўшы вам свежы тунель і заблытаны стан рэзалвера. Асобнаму працэсу патрэбен толькі звычайны запыт на спыненне, каб ачыстка выканалася.
Вызначце, хто валодае рэзалверам
systemd-resolved, скрыпт у стылі resolvconf і простае перапісванне файла — гэта тры розныя ўладальнікі. Першы трымае налады для спасылкі ў памяці і скідае іх, калі інтэрфейс знікае. Другі трымае запісы, якія застаюцца, пакуль нешта іх не выдаліць. Трэці запісвае файл і пакідае аднаўленне таму, хто яго запісаў.
Вызначце ўладальніка перад выбарам каманды рамонту. Адзін і той жа сімптом мае тры розныя правільныя адказы ў залежнасці ад таго, хто выкарыстоўваецца.
VPN, якім кіруе NetworkManager, можа ўжо валодаць зменамі рэзалвера. Даданне другога памочніка зверху стварае двух уладальнікаў, якія спаборнічаюць за адну спасылку, і стан таго, хто прайграў, з'яўляецца зноў пры наступным перападключэнні. Калі галоўны менеджэр, выпраўляйце наладу ў менеджэры, а не ў скрыпце.
Што можа і чаго не можа хук down
Скрыпт down запускаецца пасля закрыцця прылады TUN/TAP. Даданне down-pre перавяртае гэты парадак і запускае скрыпт, пакуль прылада яшчэ існуе, што патрабуюць памочнікі, якім патрэбна жывая спасылка.
Ні адна з дырэктыў не прымушае хук запусціцца пасля SIGKILL. Прывілеі таксама не аднаўляюцца праз down-pre: калі дэман апускаецца да user або group ці ўваходзіць у chroot, хук працуе з тым доступам, які гэта пакідае. Выкліканы хук усё яшчэ можа не здолець абнавіць рэзалвер. Даведка OpenVPN апісвае сігналы і жыццёвы цыкл зваротнага выкліку.
Праверце ўласную памылку хука побач са статусам выхаду працэсу. Адсутная ачыстка і няўдалая ачыстка выглядаюць аднолькава ў рэзалверы і па-рознаму ў журналах.
Праверце стан, які сапраўды застаецца
У сістэме з systemd-resolved resolvectl status паказвае, якая спасылка ўсё яшчэ нясе DNS-серверы VPN або дамены маршрутызацыі. Гэтая спасылка можа належаць злучэнню, якога ўжо няма, або іншаму тунелю, які яшчэ ўзняты.
Інтэрфейс, які знікае, забірае сваю канфігурацыю для спасылкі з сабой, таму прапушчаны хук можа суіснаваць з чыстым DNS. Калі спасылка ўсё яшчэ зарэгістраваная і належыць выключна спыненаму злучэнню, менеджэр-уладальнік павінен яе выдаліць. Калі стары скрыпт перапісаў глабальны файл рэзалвера, шукайце замест гэтага задакументаваны крок аднаўлення гэтага скрыпта.
Аднаўляйце, не крадучы іншую спасылку
Калі налады для спасылкі — вашая адказнасць, resolvectl revert бярэ імя спасылкі і ачышчае канфігурацыю DNS часу выканання для гэтага інтэрфейса. Гэта дзеянне часу выканання, а не правака профілю, таму пастаянная канфігурацыя злучэння застаецца некранутай. Назавіце няправільную спасылку — і вы ачысціце DNS для працуючага тунеля, менавіта таму імя бярэцца з вываду статусу.
Пераканайцеся, што /etc/resolv.conf — гэта кіраваная сімвалічная спасылка, перш чым рэдагаваць яе, затым яшчэ раз звычайна спыніце кліент і зноў паглядзіце на DNS. Калі другое спыненне ачышчае, ранейшая праблема была ў прымусовым выхадзе, а не ў канфігурацыі.