AES-NI OpenSSL ar branduolio perkėlimas: ko jums iš tikrųjų reikia?
Atskirkite CPU instrukcijų palaikymą nuo to, kur apdorojami paketai: prieš derindami patikrinkite kriptografinį backend, suderintą šifrą ir aktyvų kelią.
Dvi etiketės vartojamos taip, tarsi būtų tas pats: aparatinės įrangos pagreitintas ir perkeltas į branduolį. Viena apibūdina, kokias instrukcijas vykdo bibliotekos AES procedūra, kita – kur vyksta paketų apdorojimas. VPN gali turėti pirmąją be antrosios, antrąją be pirmosios arba abi kartu. Bet koks sprendimas dėl našumo turi prasidėti įvardijant, kurią iš dviejų jūs iš tikrųjų keičiate.
Dvi ašys, o ne vienas balas
Pirmoji ašis – įgyvendinimas: ar kodas, atliekantis AES-256-GCM, nukreipiamas į versiją, kuri naudoja procesoriaus specialias instrukcijas, ar į perkeliamą procedūrą, kuri jas vykdo kaip įprastą aritmetiką. Šis pasirinkimas gyvena kriptografinės bibliotekos viduje ir atliekamas ją inicializuojant.
Antroji ašis – vieta: ar paketas eina branduolio transformacijos keliu, ar vartotojo erdvės demonas skaito iš tunelio įrenginio, šifruoja ir rašo atgal.
Nė viena ašis neriboja kitos. VPN vartotojo erdvėje procesoriuje su AES instrukcijomis gali jas naudoti visą laiką, o branduolio kelias procesoriuje be jų grįžta prie programinės įrangos įgyvendinimo. Tiekėjų medžiagoje etiketės retai parodo šį skirtumą, todėl derinimo patarimai, nukopijuoti tarp dviejų situacijų, taip dažnai nieko nedaro.
Pirmoji ašis: kuris kodas atlieka šifravimą
OpenSSL inicializacijos metu aptinka procesoriaus savybes ir naudoja rezultatą optimizuotiems kodo keliams pasirinkti, kaip aprašo x86 galimybių dokumentacija. AES-NI yra viena iš dokumentuotų galimybių, esančių už to nukreipimo. Niekas iš to nereikalauja, kad biblioteka taptų branduolio komponentu.
Patvirtinkite, kad savybė matoma procesui, prieš manydami, kad naudojamas greitasis kelias. Linux atveju šaltinis yra flags laukas /proc/cpuinfo, o svečio viduje jis atspindi tai, ką atskleidžia hipervizorius, o ne fizinio pagrindinio kompiuterio modelio pavadinimą.
grep -m1 '^flags' /proc/cpuinfo | grep -o '\baes\b'
openssl list -providers -verboseAntroji komanda įvardija teikėjus, įkeltus tame build’e. Ji nepasako, kurią biblioteką susiejo VPN paslauga, o vienas pagrindinis kompiuteris gali turėti dvi OpenSSL instaliacijas, nors veikiantis procesas naudoja tik vieną.
Antroji ašis: kur veikia paketų kelias
Talpinimas branduolyje reiškia, kad transformacija vyksta pačiame branduolio IPsec mechanizme arba branduolio viduje esančiame tunelio tvarkyklėje, todėl paketams nereikia kelionės pirmyn ir atgal per vartotojo erdvės procesą kiekvienai partijai. Tai gali sumažinti kopijavimą ir konteksto perjungimus bei paskirstyti darbą branduoliams taip, kaip vieno srauto demonas negali. Tai taip pat perkelia skaitiklius ir pėdsakus, kuriuos skaitysite, kai pralaidumas kris, nes darbas dabar vyksta kitoje ribos pusėje, kurios nekontroliuojate. Laikykite tai derinimo sąnaudomis, o ne tik našumo sprendimu.
Tai nesukuria instrukcijų palaikymo, nesukonfigūruoja šifro ir nepadaro veikiančio esamo maršruto.
Virtualizacija prideda raukšlę ir šioje ašyje. Svečiui gali būti duotas užmaskuotas procesoriaus modelis, slepiantis savybes, kurias turi pagrindinis kompiuteris, o įdėtasis svečias gali matyti dar mažiau. Galimybių vaizdą skaitykite iš aplinkos, kurioje VPN iš tikrųjų veikia, o ne iš hipervizoriaus konsolės.
Ką kiekvienas pasirinkimas nuperka ir ko negali
Praktinis klausimas – kur dingsta laikas. Jei pralaidumą riboja vienas užimtas srautas, pasikartojančios buferio kopijos ar sistemos iškvietimas kiekvienam paketui, transformacijos perkėlimas į kelią, pašalinantį tas sąnaudas, gali padėti, jei branduolys įgyvendina reikiamą transformaciją.
Jei riba yra perkrauta išorinė jungtis, kelias su nuostoliais, ilgas kelionės laikas, prisotinta paskirties paslauga ar vienas branduoliui pritvirtintas srautas, talpinimas nekeičia nieko svarbaus. Tas pats galioja ir instrukcijų pasirinkimui: AES specializuotoje aparatinėje įrangoje nepataisys trūkstamo maršruto ir nepadės, jei tunelis neveikia, nes nepavyksta vardų skyrimas.
Kur galioja abu, jie derinami. Branduolio kelias gali naudoti tą patį instrukcijų lygio nukreipimą branduolio kripto API viduje, o vartotojo erdvės kelias su gerai parinkta biblioteka jau jį naudoja. Sprendimas yra ne tai, kuris abstrakčiai greitesnis, o tai, už kurią sąnaudą turite įrodymų.
Užsirašykite keturis faktus prieš ką nors keisdami
Užrašykite paslaugos binarius failus ir kriptografinę biblioteką, su kuria jie susieti, nes tai lemia pirmąją ašį. Tada užrašykite suderintą duomenų apsaugą, nes šifras be specialaus instrukcijų kelio elgiasi kitaip nei su juo, o rinkinį renkasi abi pusės.
Toliau – galimybių vaizdas iš veikiančios aplinkos vidaus ir galiausiai aktyvus paketų kelias su įrodymu, kad režimas, kurį manote įjungtu, iš tikrųjų toks yra. Įkeltas modulis neįrodo, kad profilis jį naudoja, o konfigūracijos eilutė neįrodo, kad branduolys ją priėmė.
Pakeiskite vieną dalyką, tada palyginkite su nuosekliu darbo krūviu tais pačiais galiniais taškais ir ta pačia perdavimo kryptimi. Greičio teiginys, kurio neišmatavote, vertas mažiau nei pastaba, kad backend niekada nebuvo abejonių objektas.