Чаму правіла раздвоенага тунеля перастала супадаць з сэрвісам
Правіла фіксуе прэфікс, а сэрвіс пераехаў. Прачытайце прызначэнне, якое праграма рэальна выкарыстоўвае, затым адрамантуйце механізм, а не пашырайце выключэнне.
Раздвоенае тунеляванне звычайна правальваецца адным з двух спосабаў. Альбо трафік, які павінен быць унутры тунеля, абыходзіць яго, альбо трафік, які павінен заставацца зне, зацягваецца ўнутр. Збой састарэлага правіла — гэта першы выпадак, і ён больш заблытаны, бо правіла выконваецца дакладна так, як напісана. Змянілася прызначэнне: сэрвіс цяпер адказвае на адрас, які правіла ніколі не называла, і ў тунелі нічога не няправільна.
Што фіксуе правіла і што вяртае DNS
Правіла раздвоенага тунеля — гэта статычная заява пра прызначэнні, звычайна выяўленая як прэфікс, маршрут або спіс адрасоў. Яно ацэньваецца супраць прызначэння пакета ў момант адпраўкі. Імя хоста — гэта запыт, які вяртае набор адрасоў з тэрмінам жыцця і кэшам, і адказ можа адрознівацца ў залежнасці ад рэзалвера, тыпу запыту і хвіліны.
Гэтыя два аб'екты ніколі не дамаўляюцца адно з адным. Правіла працягвае супадаць з прэфіксам, які яму далі, сэрвіс працягвае змяняць адрас, які выдае, і разрыў паміж імі ціха пашыраецца. Вось чаму сімптом з'яўляецца пасля міграцыі правайдера або абнаўлення сертыфіката, а не пасля змены канфігурацыі. Ніхто не рэдагаваў тунель, таму ніхто не глядзіць на тунель, і дыягназ дрыжыць у бок праграмы замест палітыкі.
Тры спосабы, якімі ламаецца супадзенне
Відавочны выпадак — сэрвіс, які пераехаў: аператар пераадрасаваў яго, DNS пайшоў за ім, а выключэнне не. Другі — сямейства адрасоў, якое правіла ніколі не пакрывала; гэта здараецца, калі імя пачынае вяртаць запісы AAAA, якія выключэнне толькі для v4 ігнаруе. Трэці — розніца рэзалвераў: унутраны і публічны погляды могуць вяртаць розныя адрасы для аднаго імя, таму адрас, які выкарыстоўвае вашая праграма, не той, з якім вы тэставалі.
Кэшаванае злучэнне — гэта чацвёрты варыянт, і яго лёгка прапусціць. Праграма можа ўсё яшчэ размаўляць з адрасам, які яна вызначыла гадзіну таму, а гэта значыць, што ваш свежы запыт і яго адкрыты сокет не згодныя наконт таго, дзе жыве сэрвіс.
Прачытайце прызначэнне, якое праграма рэальна выкарыстоўвае
Спытайце аперацыйную сістэму і табліцу сокетаў, а не ўкладку браўзера. Запыт адказвае, куды імя развязваецца цяпер, а табліца сокетаў паказвае адрас, з якім злучаны працэс, і ён можа быць старэйшым. Запусціце абодва, перш чым будаваць тэорыю, бо розніца паміж імі сама і ёсць адказам прыкладна ў палове выпадкаў.
getent ahosts api.example.com
dig +short api.example.com A
dig +short api.example.com AAAA
ss -tnp | grep -F api
ip route get 203.0.113.40Затым параўнайце з тым, што пакрывае правіла. Калі бягучы адрас выходзіць за межы выключэння і запыт усё яшчэ правальваецца, вы знайшлі прычыну, не кранаючы канфігурацыю тунеля. Калі праграма злучана з адрасам, які адпавядае правілу, і запыт усё яшчэ правальваецца, праблема недзе за тунелем, і гэта няправільнае расследаванне.
Адрамантуйце механізм, а не сімптом
Калі прадукт падтрымлівае кіраванае кіраванне на аснове даменаў, выкарыстоўвайце яго і прытрымлівайцеся дакументаваных паводзін абнаўлення і ахопу. Гэта замяняе статычную здагадку кіраваным адказам, але за кошт залежнасці ад таго, што функцыя працуе так, як дакументавана.
Калі дызайн абапіраецца на статычны спіс, дайце яму ўладальніка і план абнаўлення. План павінен казаць, як выяўляецца адрас, хто ўхваляе змену і як хутка спіс, як чакаецца, пойдзе за міграцыяй правайдера. Спіс без уладальніка — гэта будучы збой з вядомай прычынай.
Не пашырайце выключэнне на вялікую суседнюю сетку толькі каб злавіць кожны адрас, які вы бачылі падчас кароткага тэсту. Гэта не выпраўленне; гэта пастаянная змена мяжы бяспекі, і яна ціха дазволіць несваяцкім сэрвісам абыходзіць тунель, пакуль правіла існуе.
Праверце абедзве паловы намеру
Дызайн раздвоенага тунеля мае два намеры, і выпраўленне павінна захаваць абодва. Абаронены сэрвіс павінен ісці праз тунель, а выключаныя катэгорыі павінны працягваць ісці вакол яго. Праверце новае злучэнне да адрамантаванага прызначэння, затым праверце адну рэч, якая павінна застацца зне.
curl -sv --max-time 5 https://api.example.com/ -o /dev/null 2>&1 | grep -E 'Trying|Connected to'
curl -sS --max-time 5 https://public.example/ -o /dev/null -w '%{http_code}\n'Запішыце новы адрас, выбраны механізм і дату. Менавіта гэтая нататка не дае наступнаму чалавеку зрабіць выснову, што VPN выпадкова праігнараваў сваю ўласную канфігурацыю.