Berkeley Packet Filters (BPF) ir Linux kodola tehnoloÄ£ija, kas jau vairÄkus gadus atrodas angļu valodas tehnoloÄ£iju publikÄciju pirmajÄs lapÄs. Konferences ir piepildÄ«tas ar ziÅojumiem par BPF izmantoÅ”anu un attÄ«stÄ«bu. Deivids Millers, Linux tÄ«kla apakÅ”sistÄmas uzturÄtÄjs, sauc savu runu vietnÄ Linux Plumbers 2018 "Å Ä« runa nav par XDP" (XDP ir viens BPF lietoÅ”anas gadÄ«jums). Brendans Gregs uzstÄjas ar sarunÄm Linux BPF lielvaras. Toke HĆøiland-JĆørgensen smejaska kodols tagad ir mikrokodolu. Tomass Grafs popularizÄ ideju, ka BPF ir javascript kodolam.
BPF izstrÄdi kontrolÄ Linux tÄ«kla kopiena, galvenÄs esoÅ”Äs BPF lietojumprogrammas ir saistÄ«tas ar tÄ«kliem un tÄpÄc ar atļauju @eukariots, seriÄlu nosaucu par āBPF mazajiemā, par godu lieliskajam seriÄlam "TÄ«kli mazajiem".
ÄŖss kurss BPF vÄsturÄ (c)
MÅ«sdienu BPF tehnoloÄ£ija ir uzlabota un paplaÅ”inÄta vecÄs tehnoloÄ£ijas versija ar tÄdu paÅ”u nosaukumu, ko tagad sauc par klasisko BPF, lai izvairÄ«tos no neskaidrÄ«bÄm. Pamatojoties uz klasisko BPF, tika izveidota labi zinÄma utilÄ«ta tcpdump, mehÄnisms seccomp, kÄ arÄ« mazÄk zinÄmiem moduļiem xt_bpf par iptables un klasifikators cls_bpf. MÅ«sdienu Linux klasiskÄs BPF programmas tiek automÄtiski pÄrtulkotas jaunajÄ formÄ, tomÄr no lietotÄja viedokļa API ir palikusi vietÄ un joprojÄm tiek atrasti jauni klasiskÄ BPF lietojumi, kÄ redzÄsim Å”ajÄ rakstÄ. Å Ä« iemesla dÄļ, kÄ arÄ« tÄpÄc, ka, sekojot lÄ«dzi klasiskÄ BPF attÄ«stÄ«bas vÄsturei operÄtÄjsistÄmÄ Linux, kļūs skaidrÄks, kÄ un kÄpÄc tas attÄ«stÄ«jÄs savÄ modernajÄ formÄ, es nolÄmu sÄkt ar rakstu par klasisko BPF.
PagÄjuÅ”Ä gadsimta astoÅdesmito gadu beigÄs inženieri no slavenÄs Lorensa BÄrklija laboratorijas sÄka interesÄties par jautÄjumu, kÄ pareizi filtrÄt tÄ«kla paketes aparatÅ«rÄ, kas bija moderna pagÄjuÅ”Ä gadsimta astoÅdesmito gadu beigÄs. FiltrÄÅ”anas pamatideja, kas sÄkotnÄji tika ieviesta CSPF (CMU/Stanford Packet Filter) tehnoloÄ£ijÄ, bija pÄc iespÄjas agrÄk filtrÄt nevajadzÄ«gÄs paketes, t.i. kodola telpÄ, jo tas ļauj izvairÄ«ties no nevajadzÄ«gu datu kopÄÅ”anas lietotÄja telpÄ. Lai nodroÅ”inÄtu izpildlaika droŔību lietotÄja koda palaiÅ”anai kodola telpÄ, tika izmantota smilÅ”kastes virtuÄlÄ maŔīna.
TomÄr esoÅ”o filtru virtuÄlÄs maŔīnas bija paredzÄtas darbam ar steku balstÄ«tÄm iekÄrtÄm, un tÄs nedarbojÄs tik efektÄ«vi jaunÄkÄs RISC iekÄrtÄs. RezultÄtÄ ar Berkeley Labs inženieru pÅ«lÄm tika izstrÄdÄta jauna BPF (Berkeley Packet Filters) tehnoloÄ£ija, kuras virtuÄlÄs maŔīnas arhitektÅ«ra tika izstrÄdÄta, pamatojoties uz Motorola 6502 procesoru - tÄdu pazÄ«stamu produktu kÄ darba zirgu. Apple II vai NES. JaunÄ virtuÄlÄ maŔīna, salÄ«dzinot ar esoÅ”ajiem risinÄjumiem, palielinÄja filtra veiktspÄju desmitiem reižu.
BPF maŔīnu arhitektūra
DarbÄ iepazÄ«simies ar arhitektÅ«ru, analizÄjot piemÄrus. TomÄr, lai sÄktu, pieÅemsim, ka iekÄrtai bija divi lietotÄjam pieejami 32 bitu reÄ£istri, akumulators. A un indeksu reÄ£istrs X, 64 baiti atmiÅa (16 vÄrdi), kas pieejama rakstÄ«Å”anai un turpmÄkai lasÄ«Å”anai, un neliela komandu sistÄma darbam ar Å”iem objektiem. ProgrammÄs bija pieejami arÄ« lÄcienu norÄdÄ«jumi nosacÄ«to izteiksmju ievieÅ”anai, taÄu, lai garantÄtu programmas savlaicÄ«gu izpildi, lÄcienus varÄja veikt tikai uz priekÅ”u, t.i., konkrÄti, bija aizliegts veidot cilpas.
VispÄrÄjÄ maŔīnas iedarbinÄÅ”anas shÄma ir Å”Äda. LietotÄjs izveido programmu BPF arhitektÅ«rai un, izmantojot daži kodola mehÄnisms (piemÄram, sistÄmas izsaukums), ielÄdÄ programmu un savieno ar to dažiem notikumu Ä£eneratoram kodolÄ (piemÄram, notikums ir nÄkamÄs paketes ienÄkÅ”ana tÄ«kla kartÄ). Kad notiek notikums, kodols palaiž programmu (piemÄram, tulkÄ), un maŔīnas atmiÅa atbilst dažiem kodola atmiÅas apgabals (piemÄram, ienÄkoÅ”Äs paketes dati).
Lai sÄktu aplÅ«kot piemÄrus, pietiks ar iepriekÅ”minÄto: pÄc nepiecieÅ”amÄ«bas iepazÄ«simies ar sistÄmu un komandu formÄtu. Ja vÄlaties nekavÄjoties izpÄtÄ«t virtuÄlÄs maŔīnas komandu sistÄmu un uzzinÄt par visÄm tÄs iespÄjÄm, varat izlasÄ«t oriÄ£inÄlo rakstu BSD pakeÅ”u filtrs un/vai faila pirmo pusi DokumentÄcija/tÄ«kls/filter.txt no kodola dokumentÄcijas. TurklÄt jÅ«s varat izpÄtÄ«t prezentÄciju libpcap: ArhitektÅ«ras un optimizÄcijas metodika pakeÅ”u uztverÅ”anai, kurÄ Makkens, viens no BPF autoriem, stÄsta par radÄ«Å”anas vÄsturi libpcap.
Tagad mÄs turpinÄm apsvÄrt visus nozÄ«mÄ«gos piemÄrus klasiskÄ BPF izmantoÅ”anai operÄtÄjsistÄmÄ Linux: tcpdump (libpcap), seccomp, xt_bpf, cls_bpf.
tcpdump
BPF izstrÄde tika veikta paralÄli pakeÅ”u filtrÄÅ”anas priekÅ”gala izstrÄdei - plaÅ”i pazÄ«stamai utilÄ«tai. tcpdump. Un, tÄ kÄ Å”is ir vecÄkais un slavenÄkais klasiskÄ BPF izmantoÅ”anas piemÄrs, kas pieejams daudzÄs operÄtÄjsistÄmÄs, mÄs sÄksim ar to tehnoloÄ£iju izpÄti.
(Es izmantoju visus Å”ajÄ rakstÄ minÄtos piemÄrus operÄtÄjsistÄmÄ Linux 5.6.0-rc6. Dažu komandu izvade ir rediÄ£Äta, lai nodroÅ”inÄtu labÄku lasÄmÄ«bu.)
PiemÄrs: IPv6 pakeÅ”u novÄroÅ”ana
IedomÄsimies, ka mÄs vÄlamies apskatÄ«t visas IPv6 paketes interfeisÄ eth0. Lai to izdarÄ«tu, mÄs varam palaist programmu tcpdump ar vienkÄrÅ”u filtru ip6:
$ sudo tcpdump -i eth0 ip6
Å ajÄ gadÄ«jumÄ, tcpdump apkopo filtru ip6 BPF arhitektÅ«ras baitkodÄ un nosÅ«tiet to kodolam (skatiet sÄ«kÄku informÄciju sadaÄ¼Ä Tcpdump: tiek ielÄdÄts). IelÄdÄtais filtrs tiks palaists katrai paketei, kas iet caur saskarni eth0. Ja filtrs atgriež vÄrtÄ«bu, kas nav nulle n, tad lÄ«dz n paketes baiti tiks kopÄti lietotÄja telpÄ, un mÄs to redzÄsim izvadÄ tcpdump.
IzrÄdÄs, ka mÄs varam viegli noskaidrot, kurÅ” baitkods tika nosÅ«tÄ«ts kodolam tcpdump ar palÄ«dzÄ«bu tcpdump, ja mÄs to palaižam ar opciju -d:
$ sudo tcpdump -i eth0 -d ip6
(000) ldh [12]
(001) jeq #0x86dd jt 2 jf 3
(002) ret #262144
(003) ret #0
Nulles rindÄ mÄs izpildÄm komandu ldh [12], kas apzÄ«mÄ āielÄdÄt reÄ£istrÄ A puse vÄrda (16 biti), kas atrodas adresÄ 12ā, un jautÄjums ir tikai par to, kÄda veida atmiÅu mÄs adresÄjam? Atbilde ir tÄda, ka plkst x sÄkas (x+1)analizÄtÄs tÄ«kla paketes baits. MÄs lasÄm paketes no Ethernet interfeisa eth0un tas nozÄ«mÄka pakete izskatÄs Å”Ädi (vienkÄrŔības labad mÄs pieÅemam, ka paketÄ nav VLAN tagu):
6 6 2
|Destination MAC|Source MAC|Ether Type|...|
TÄtad pÄc komandas izpildÄ«Å”anas ldh [12] reÄ£istrÄ A bÅ«s lauks Ether Type ā Å”ajÄ Ethernet kadrÄ pÄrsÅ«tÄ«tÄs paketes veids. 1. rindÄ mÄs salÄ«dzinÄm reÄ£istra saturu A (iepakojuma veids) c 0x86ddun tas un tur ir MÅ«s interesÄjoÅ”s veids ir IPv6. 1. rindÄ papildus salÄ«dzinÄÅ”anas komandai ir vÄl divas kolonnas - jt 2 Šø jf 3 ā atzÄ«mes, uz kurÄm jÄiet, ja salÄ«dzinÄjums ir veiksmÄ«gs (A == 0x86dd) un neveiksmÄ«gi. TÄtad veiksmÄ«gÄ gadÄ«jumÄ (IPv6) mÄs ejam uz 2. rindu, bet neveiksmÄ«gÄ gadÄ«jumÄ - uz 3. rindu. 3. rindÄ programma beidzas ar kodu 0 (nekopÄt paketi), 2. rindÄ programma beidzas ar kodu. 262144 (kopÄjiet man maksimÄli 256 kilobaitu paketi).
SarežģītÄks piemÄrs: mÄs apskatÄm TCP paketes pÄc mÄrÄ·a porta
ApskatÄ«sim, kÄ izskatÄs filtrs, kas kopÄ visas TCP paketes ar mÄrÄ·a portu 666. MÄs apsvÄrsim IPv4 gadÄ«jumu, jo IPv6 gadÄ«jums ir vienkÄrÅ”Äks. PÄc Ŕī piemÄra izpÄtes varat pats izpÄtÄ«t IPv6 filtru kÄ vingrinÄjumu (ip6 and tcp dst port 666) un filtrs vispÄrÄjam gadÄ«jumam (tcp dst port 666). TÄtad mÅ«s interesÄjoÅ”ais filtrs izskatÄs Å”Ädi:
$ sudo tcpdump -i eth0 -d ip and tcp dst port 666
(000) ldh [12]
(001) jeq #0x800 jt 2 jf 10
(002) ldb [23]
(003) jeq #0x6 jt 4 jf 10
(004) ldh [20]
(005) jset #0x1fff jt 10 jf 6
(006) ldxb 4*([14]&0xf)
(007) ldh [x + 16]
(008) jeq #0x29a jt 9 jf 10
(009) ret #262144
(010) ret #0
MÄs jau zinÄm, ko dara rindas 0 un 1. 2. rindÄ mÄs jau esam pÄrbaudÄ«juÅ”i, vai Ŕī ir IPv4 pakete (Ätera tips = 0x800) un ielÄdÄjiet to reÄ£istrÄ A 24. paketes baits. MÅ«su iepakojums izskatÄs
kas nozÄ«mÄ, ka mÄs ielÄdÄjam reÄ£istrÄ A IP galvenes lauks Protocol, kas ir loÄ£iski, jo mÄs vÄlamies kopÄt tikai TCP paketes. MÄs salÄ«dzinÄm protokolu ar 0x6 (IPPROTO_TCP) 3. rindÄ.
4. un 5. rindÄ mÄs ielÄdÄjam pusvÄrdus, kas atrodas adresÄ 20, un izmantojam komandu jset pÄrbaudiet, vai ir iestatÄ«ts kÄds no trim karogi - izsniegtÄs maskas nÄsÄÅ”ana jset tiek notÄ«rÄ«ti trÄ«s nozÄ«mÄ«gÄkie biti. Divi no trim bitiem norÄda, vai pakete ir daļa no sadrumstalotas IP paketes, un, ja tÄ, vai tÄ ir pÄdÄjais fragments. TreÅ”ais bits ir rezervÄts, un tam jÄbÅ«t nullei. MÄs nevÄlamies pÄrbaudÄ«t ne nepilnÄ«gas, ne bojÄtas paketes, tÄpÄc mÄs pÄrbaudÄm visus trÄ«s bitus.
6. rinda ir visinteresantÄkÄ Å”ajÄ sarakstÄ. Izteiksme ldxb 4*([14]&0xf) nozÄ«mÄ, ka mÄs ielÄdÄjam reÄ£istrÄ X vismazÄk nozÄ«mÄ«gie Äetri paketes piecpadsmitÄ baita biti, kas reizinÄti ar 4. PiecpadsmitÄ baita vismazÄk nozÄ«mÄ«gie Äetri biti ir lauks Interneta galvenes garums IPv4 galvene, kas saglabÄ galvenes garumu vÄrdos, tÄpÄc jums pÄc tam jÄreizina ar 4. Interesanti, ka izteiksme 4*([14]&0xf) ir apzÄ«mÄjums Ä«paÅ”ai adresÄcijas shÄmai, ko var izmantot tikai Å”ajÄ formÄ un tikai reÄ£istram X, t.i. mÄs arÄ« nevaram teikt ldb 4*([14]&0xf) nedz ldxb 5*([14]&0xf) (mÄs varam norÄdÄ«t tikai citu nobÄ«di, piemÄram, ldxb 4*([16]&0xf)). Skaidrs, ka Ŕī adresÄcijas shÄma tika pievienota BPF tieÅ”i tÄpÄc, lai saÅemtu X (indeksa reÄ£istrs) IPv4 galvenes garums.
TÄtad 7. rindÄ mÄs cenÅ”amies ielÄdÄt pusi vÄrda plkst (X+16). Atceroties, ka 14 baitus aizÅem Ethernet galvene, un X satur IPv4 galvenes garumu, mÄs to saprotam A TCP mÄrÄ·a ports ir ielÄdÄts:
14 X 2 2
|ethernet header|ip header|source port|destination port|
Visbeidzot, 8. rindÄ mÄs salÄ«dzinÄm galamÄrÄ·a portu ar vÄlamo vÄrtÄ«bu un 9. vai 10. rindÄ atgriežam rezultÄtu - vai kopÄt paketi vai nÄ.
Tcpdump: tiek ielÄdÄts
IepriekÅ”Äjos piemÄros mÄs Ä«paÅ”i nerunÄjÄm par to, kÄ tieÅ”i mÄs ielÄdÄjam BPF baitu kodu kodolÄ pakeÅ”u filtrÄÅ”anai. VispÄrÄ«gi runÄjot, tcpdump pÄrnests uz daudzÄm sistÄmÄm un darbam ar filtriem tcpdump izmanto bibliotÄku libpcap. ÄŖsumÄ, lai ievietotu filtru saskarnÄ, izmantojot libpcap, jums jÄveic Å”Ädas darbÄ«bas:
izveidot tipa deskriptoru pcap_t no saskarnes nosaukuma: pcap_create,
PirmajÄs divÄs izvades rindÄs mÄs izveidojam neapstrÄdÄta ligzda lai nolasÄ«tu visus Ethernet kadrus un saistÄ«tu to ar interfeisu eth0. no mÅ«su pirmais piemÄrs mÄs zinÄm, ka filtrs ip sastÄvÄs no ÄetrÄm BPF instrukcijÄm, un treÅ”ajÄ rindÄ mÄs redzam, kÄ izmantot Å”o opciju SO_ATTACH_FILTER sistÄmas zvans setsockopt mÄs ielÄdÄjam un pievienojam filtru ar garumu 4. Å is ir mÅ«su filtrs.
Ir vÄrts atzÄ«mÄt, ka klasiskajÄ BPF filtra ielÄde un pievienoÅ”ana vienmÄr notiek kÄ atomu darbÄ«ba, un jaunajÄ BPF versijÄ programmas ielÄde un piesaiste notikumu Ä£eneratoram tiek atdalÄ«ta laikÄ.
SlÄptÄ PatiesÄ«ba
Nedaudz pilnÄ«gÄka izvades versija izskatÄs Å”Ädi:
KÄ minÄts iepriekÅ”, mÄs ielÄdÄjam un pievienojam filtru 5. lÄ«nijas ligzdai, bet kas notiek 3. un 4. lÄ«nijÄ? IzrÄdÄs, ka Å”is libpcap rÅ«pÄjas par mums - lai mÅ«su filtra izvadÄ nebÅ«tu paketes, kas to neapmierina, bibliotÄka savieno manekens filtrs ret #0 (atmest visas paketes), pÄrslÄdz ligzdu uz nebloÄ·ÄÅ”anas režīmu un mÄÄ£ina atÅemt visas paketes, kas varÄtu palikt no iepriekÅ”Äjiem filtriem.
KopumÄ, lai filtrÄtu pakotnes operÄtÄjsistÄmÄ Linux, izmantojot klasisko BPF, jums ir jÄbÅ«t filtram tÄdas struktÅ«ras formÄ kÄ struct sock_fprog un atvÄrta ligzda, pÄc kuras filtru var pievienot ligzdai, izmantojot sistÄmas zvanu setsockopt.
Interesanti, ka filtru var piestiprinÄt pie jebkuras ligzdas, ne tikai neapstrÄdÄtÄ. Å eit piemÄrs programma, kas nogriež visus ienÄkoÅ”os UDP datagrammus, izÅemot pirmos divus baitus. (KodÄ pievienoju komentÄrus, lai nepÄrblÄ«vÄtu rakstu.)
SÄ«kÄka informÄcija par lietoÅ”anu setsockopt par filtru pievienoÅ”anu sk ligzda (7), bet gan par savu filtru rakstÄ«Å”anu, piemÄram struct sock_fprog bez palÄ«dzÄ«bas tcpdump parunÄsim sadaÄ¼Ä BPF programmÄÅ”ana ar savÄm rokÄm.
Klasiskais BPF un XNUMX. gs
BPF tika iekļauts Linux 1997. gadÄ un ilgu laiku ir bijis darba zirgs libpcap bez Ä«paÅ”Äm izmaiÅÄm (protams, Linux specifiskas izmaiÅas, MÄs bijÄm, taÄu tie nemainÄ«ja globÄlo ainu). PirmÄs nopietnÄs pazÄ«mes, ka BPF attÄ«stÄ«sies, parÄdÄ«jÄs 2011. gadÄ, kad Äriks DumazÄ ierosinÄja plÄksteris, kas kodolam pievieno Just In Time Compiler ā tulkotÄju BPF baitkoda konvertÄÅ”anai uz vietÄjo. x86_64 kodu.
JIT kompilators bija pirmais pÄrmaiÅu Ä·ÄdÄ: 2012. gadÄ parÄdÄ«jÄs spÄja rakstÄ«t filtrus seccomp, izmantojot BPF, 2013. gada janvÄrÄ« bija piebilda modulis xt_bpf, kas ļauj rakstÄ«t noteikumus priekÅ” iptables ar BPF palÄ«dzÄ«bu, un 2013. gada oktobrÄ« bija piebilda arÄ« modulis cls_bpf, kas ļauj rakstÄ«t trafika klasifikatorus, izmantojot BPF.
DrÄ«zumÄ visus Å”os piemÄrus apskatÄ«sim sÄ«kÄk, taÄu vispirms mums noderÄs iemÄcÄ«ties rakstÄ«t un kompilÄt patvaļīgas programmas BPF, jo bibliotÄkas nodroÅ”inÄtÄs iespÄjas libpcap ierobežots (vienkÄrÅ”s piemÄrs: izveidots filtrs libpcap var atgriezt tikai divas vÄrtÄ«bas - 0 vai 0x40000) vai parasti, tÄpat kÄ seccomp gadÄ«jumÄ, nav piemÄrojamas.
BPF programmÄÅ”ana ar savÄm rokÄm
IepazÄ«simies ar BPF instrukciju binÄro formÄtu, tas ir ļoti vienkÄrÅ”i:
16 8 8 32
| code | jt | jf | k |
Katra instrukcija aizÅem 64 bitus, no kuriem pirmie 16 biti ir instrukcijas kods, tad ir divi astoÅu bitu ievilkumi, jt Šø jf, un 32 biti argumentam K, kuras mÄrÄ·is dažÄdÄs komandÄs ir atŔķirÄ«gs. PiemÄram, komanda ret, kas pÄrtrauc programmu, ir kods 6, un atgrieÅ”anas vÄrtÄ«ba tiek Åemta no konstantes K. C valodÄ viena BPF instrukcija tiek attÄlota kÄ struktÅ«ra
struct sock_fprog {
unsigned short len;
struct sock_filter *filter;
}
TÄdÄjÄdi mÄs jau varam rakstÄ«t programmas (piemÄram, mÄs zinÄm instrukciju kodus no [1]). Å Ädi izskatÄ«sies filtrs ip6 no mÅ«su pirmais piemÄrs:
TomÄr Ŕī iespÄja nav Ä«paÅ”i Ärta. Tas ir tas, ko Linux kodola programmÄtÄji argumentÄja, un tÄpÄc direktorijÄ tools/bpf kodolos varat atrast montÄtÄju un atkļūdotÄju darbam ar klasisko BPF.
MontÄžas valoda ir ļoti lÄ«dzÄ«ga atkļūdoÅ”anas izvadei tcpdump, bet papildus varam norÄdÄ«t simboliskas etiÄ·etes. PiemÄram, Å”eit ir programma, kas atmet visas paketes, izÅemot TCP/IPv4:
$ cat /tmp/tcp-over-ipv4.bpf
ldh [12]
jne #0x800, drop
ldb [23]
jneq #6, drop
ret #-1
drop: ret #0
PÄc noklusÄjuma montÄtÄjs Ä£enerÄ kodu Å”ÄdÄ formÄtÄ <ŠŗŠ¾Š»ŠøŃŠµŃŃŠ²Š¾ ŠøŠ½ŃŃŃŃŠŗŃŠøŠ¹>,<code1> <jt1> <jf1> <k1>,..., mÅ«su piemÄram ar TCP tÄ bÅ«s
Å o tekstu var iekopÄt tipa struktÅ«ras definÄ«cijÄ struct sock_filter, kÄ mÄs to darÄ«jÄm Ŕīs sadaļas sÄkumÄ.
Linux un netsniff-ng paplaÅ”inÄjumi
Papildus standarta BPF, Linux un tools/bpf/bpf_asm atbalsts un nestandarta komplekts. BÅ«tÄ«bÄ instrukcijas tiek izmantotas, lai piekļūtu struktÅ«ras laukiem struct sk_buff, kas apraksta tÄ«kla paketi kodolÄ. TomÄr ir arÄ« cita veida palÄ«ga instrukcijas, piemÄram ldw cpu tiks ielÄdÄts reÄ£istrÄ A kodola funkcijas palaiÅ”anas rezultÄts raw_smp_processor_id(). (JaunajÄ BPF versijÄ Å”ie nestandarta paplaÅ”inÄjumi ir paplaÅ”inÄti, lai nodroÅ”inÄtu programmÄm kodola palÄ«gu komplektu piekļuvei atmiÅai, struktÅ«rÄm un notikumu Ä£enerÄÅ”anai.) Å eit ir interesants piemÄrs filtram, kurÄ mÄs kopÄjam tikai pakeÅ”u galvenes lietotÄja telpÄ, izmantojot paplaÅ”inÄjumu poff, lietderÄ«gÄs slodzes nobÄ«de:
ld poff
ret a
BPF paplaÅ”inÄjumus nevar izmantot tcpdump, taÄu tas ir labs iemesls, lai iepazÄ«tos ar utilÄ«tu paketi netsniff-ng, kurÄ, cita starpÄ, ir iekļauta uzlabota programma netsniff-ng, kas papildus filtrÄÅ”anai, izmantojot BPF, satur arÄ« efektÄ«vu trafika Ä£eneratoru un daudz modernÄku nekÄ tools/bpf/bpf_asm, sauca BPF montÄtÄjs bpfc. PaketÄ ir diezgan detalizÄta dokumentÄcija, skatiet arÄ« saites raksta beigÄs.
seccomp
TÄtad, mÄs jau zinÄm, kÄ rakstÄ«t patvaļīgas sarežģītÄ«bas BPF programmas un esam gatavi aplÅ«kot jaunus piemÄrus, no kuriem pirmais ir seccomp tehnoloÄ£ija, kas ļauj, izmantojot BPF filtrus, pÄrvaldÄ«t pieejamo sistÄmas izsaukuma argumentu kopu un kopu. dotais process un tÄ pÄcteÄi.
PirmÄ seccomp versija tika pievienota kodolam 2005. gadÄ un nebija Ä«paÅ”i populÄra, jo tÄ nodroÅ”inÄja tikai vienu iespÄju ā ierobežot procesam pieejamo sistÄmas izsaukumu kopu lÄ«dz Å”Ädam: read, write, exit Šø sigreturn, un process, kurÄ tika pÄrkÄpti noteikumi, tika nogalinÄts, izmantojot SIGKILL. TomÄr 2012. gadÄ seccomp pievienoja iespÄju izmantot BPF filtrus, ļaujot definÄt atļauto sistÄmas izsaukumu kopu un pat veikt to argumentu pÄrbaudes. (Interesanti, ka Chrome bija viens no pirmajiem Ŕīs funkcionalitÄtes lietotÄjiem, un Chrome lietotÄji paÅ”laik izstrÄdÄ KRSI mehÄnismu, kura pamatÄ ir jauna BPF versija un kas ļauj pielÄgot Linux droŔības moduļus.) Saites uz papildu dokumentÄciju var atrast beigÄs. no raksta.
Å emiet vÄrÄ, ka centrmezglÄ jau ir bijuÅ”i raksti par seccomp lietoÅ”anu, iespÄjams, kÄds tos vÄlÄsies izlasÄ«t pirms (vai tÄ vietÄ), lai lasÄ«tu turpmÄkÄs apakÅ”sadaļas. RakstÄ Konteineri un droŔība: seccomp sniedz seccomp izmantoÅ”anas piemÄrus, gan 2007. gada versiju, gan versiju, kas izmanto BPF (filtri tiek Ä£enerÄti, izmantojot libseccomp), runÄ par seccomp savienojumu ar Docker, kÄ arÄ« sniedz daudzas noderÄ«gas saites. RakstÄ DÄmonu izolÄÅ”ana ar systemd vai ājums Å”im nav nepiecieÅ”ams Docker!ā Tas jo Ä«paÅ”i attiecas uz to, kÄ pievienot sistÄmas zvanu melnos sarakstus vai baltos sarakstus dÄmoniem, kuros darbojas systemd.
TÄlÄk mÄs redzÄsim, kÄ rakstÄ«t un ielÄdÄt filtrus seccomp tukÅ”ajÄ C valodÄ un izmantojot bibliotÄku libseccomp un kÄdi ir katras opcijas plusi un mÄ«nusi, un, visbeidzot, redzÄsim, kÄ programma izmanto seccomp strace.
Seccomp rakstÄ«Å”anas un ielÄdes filtri
MÄs jau zinÄm, kÄ rakstÄ«t BPF programmas, tÄpÄc vispirms apskatÄ«sim seccomp programmÄÅ”anas saskarni. Varat iestatÄ«t filtru procesa lÄ«menÄ«, un visi pakÄrtotie procesi pÄrmantos ierobežojumus. Tas tiek darÄ«ts, izmantojot sistÄmas zvanu seccomp(2):
seccomp(SECCOMP_SET_MODE_FILTER, flags, &filter)
kur &filter - Ŕī ir norÄde uz mums jau pazÄ«stamu struktÅ«ru struct sock_fprog, t.i. BPF programma.
KÄ programmas seccomp atŔķiras no programmÄm ligzdÄm? PÄrraidÄ«ts konteksts. Sockets gadÄ«jumÄ mums tika pieŔķirts atmiÅas apgabals, kurÄ bija pakete, un seccomp gadÄ«jumÄ mums tika dota tÄda struktÅ«ra kÄ
Å eit nr ir sistÄmas izsaukuma numurs, kas jÄuzsÄk, arch - paÅ”reizÄjÄ arhitektÅ«ra (vairÄk par to zemÄk), args - lÄ«dz seÅ”iem sistÄmas izsaukuma argumentiem un instruction_pointer ir rÄdÄ«tÄjs uz lietotÄja telpas instrukciju, kas veica sistÄmas izsaukumu. TÄ, piemÄram, lai ielÄdÄtu reÄ£istrÄ sistÄmas izsaukuma numuru A mums jÄsaka
ldw [0]
Seccomp programmÄm ir arÄ« citas funkcijas, piemÄram, kontekstam var piekļūt tikai ar 32 bitu izlÄ«dzinÄÅ”anu, un jÅ«s nevarat ielÄdÄt pusi vÄrda vai baitu - mÄÄ£inot ielÄdÄt filtru ldh [0] sistÄmas zvans seccomp atgriezÄ«sies EINVAL. Funkcija pÄrbauda ielÄdÄtos filtrus seccomp_check_filter() kodoli. (SmieklÄ«gi ir tas, ka sÄkotnÄjÄ apÅemÅ”anÄ, kas pievienoja seccomp funkcionalitÄti, viÅi aizmirsa pievienot atļauju izmantot instrukciju Å”ai funkcijai mod (sadalÄ«Å”anas atlikums) un tagad nav pieejams seccomp BPF programmÄm kopÅ” tÄ pievienoÅ”anas salÅ«zÄ«s ABI.)
BÅ«tÄ«bÄ mÄs jau zinÄm visu, lai rakstÄ«tu un lasÄ«tu seccomp programmas. Parasti programmas loÄ£ika tiek sakÄrtota kÄ balts vai melns sistÄmas izsaukumu saraksts, piemÄram, programma
ld [0]
jeq #304, bad
jeq #176, bad
jeq #239, bad
jeq #279, bad
good: ret #0x7fff0000 /* SECCOMP_RET_ALLOW */
bad: ret #0
pÄrbauda Äetru sistÄmas zvanu melno sarakstu ar numuriem 304, 176, 239, 279. Kas ir Å”ie sistÄmas zvani? MÄs nevaram droÅ”i pateikt, jo mÄs nezinÄm, kÄdai arhitektÅ«rai programma tika rakstÄ«ta. TÄpÄc seccomp autori piedÄvÄjums sÄciet visas programmas ar arhitektÅ«ras pÄrbaudi (paÅ”reizÄjÄ arhitektÅ«ra kontekstÄ tiek norÄdÄ«ta kÄ lauks arch struktÅ«ras struct seccomp_data). PÄrbaudot arhitektÅ«ru, piemÄra sÄkums izskatÄ«tos Å”Ädi:
ld [4]
jne #0xc000003e, bad_arch ; SCMP_ARCH_X86_64
un tad mÅ«su sistÄmas zvanu numuri iegÅ«tu noteiktas vÄrtÄ«bas.
MÄs rakstÄm un ielÄdÄjam filtrus seccomp lietoÅ”anai libseccomp
Filtru rakstÄ«Å”ana vietÄjÄ kodÄ vai BPF komplektÄcijÄ Ä¼auj pilnÄ«bÄ kontrolÄt rezultÄtu, taÄu tajÄ paÅ”Ä laikÄ dažreiz ir vÄlams izmantot pÄrnÄsÄjamu un/vai lasÄmu kodu. BibliotÄka mums palÄ«dzÄs Å”ajÄ jautÄjumÄ libseccomp, kas nodroÅ”ina standarta saskarni melnu vai baltu filtru rakstÄ«Å”anai.
PiemÄram, uzrakstÄ«sim programmu, kas palaiž binÄro failu pÄc lietotÄja izvÄles, iepriekÅ” instalÄjot sistÄmas zvanu melno sarakstu no iepriekÅ” minÄtais raksts (programma ir vienkÄrÅ”ota labÄkai lasÄmÄ«bai, var atrast pilno versiju Å”eit):
Vispirms mÄs definÄjam masÄ«vu sys_numbers no 40+ sistÄmas zvanu numuriem, ko bloÄ·Ät. PÄc tam inicializÄjiet kontekstu ctx un pastÄstiet bibliotÄkai, ko mÄs vÄlamies atļaut (SCMP_ACT_ALLOW) visi sistÄmas zvani pÄc noklusÄjuma (vieglÄk ir izveidot melnos sarakstus). PÄc tam pa vienam pievienojam visus sistÄmas zvanus no melnÄ saraksta. Atbildot uz sistÄmas zvanu no saraksta, mÄs pieprasÄm SCMP_ACT_TRAP, Å”ajÄ gadÄ«jumÄ seccomp nosÅ«tÄ«s signÄlu procesam SIGSYS ar aprakstu, kura sistÄmas izsaukumÄ tika pÄrkÄpti noteikumi. Visbeidzot, mÄs ielÄdÄjam programmu kodolÄ, izmantojot seccomp_load, kas apkopos programmu un pievienos procesam, izmantojot sistÄmas izsaukumu seccomp(2).
VeiksmÄ«gai kompilÄcijai programmai jÄbÅ«t saistÄ«tai ar bibliotÄku libseccomp, piemÄram:
cc -std=c17 -Wall -Wextra -c -o seccomp_lib.o seccomp_lib.c
cc -o seccomp_lib seccomp_lib.o -lseccomp
VeiksmÄ«gas palaiÅ”anas piemÄrs:
$ ./seccomp_lib echo ok
ok
BloÄ·Äta sistÄmas zvana piemÄrs:
$ sudo ./seccomp_lib mount -t bpf bpf /tmp
Bad system call
MÄs izmantojam stracesÄ«kÄkai informÄcijai:
$ sudo strace -e seccomp ./seccomp_lib mount -t bpf bpf /tmp
seccomp(SECCOMP_SET_MODE_FILTER, 0, {len=50, filter=0x55d8e78428e0}) = 0
--- SIGSYS {si_signo=SIGSYS, si_code=SYS_SECCOMP, si_call_addr=0xboobdeadbeef, si_syscall=__NR_mount, si_arch=AUDIT_ARCH_X86_64} ---
+++ killed by SIGSYS (core dumped) +++
Bad system call
kÄ mÄs varam zinÄt, ka programma tika pÄrtraukta nelikumÄ«ga sistÄmas izsaukuma izmantoÅ”anas dÄļ mount(2).
TÄtad, mÄs uzrakstÄ«jÄm filtru, izmantojot bibliotÄku libseccomp, iekļaujot netriviÄlu kodu ÄetrÄs rindÄs. IepriekÅ” minÄtajÄ piemÄrÄ, ja ir liels sistÄmas izsaukumu skaits, izpildes laiku var ievÄrojami samazinÄt, jo pÄrbaude ir tikai salÄ«dzinÄjumu saraksts. OptimizÄcijai libseccomp nesen bija komplektÄ plÄksteris, kas pievieno atbalstu filtra atribÅ«tam SCMP_FLTATR_CTL_OPTIMIZE. Iestatot Å”o atribÅ«tu uz 2, filtrs tiks pÄrveidots par binÄro meklÄÅ”anas programmu.
Ja vÄlaties redzÄt, kÄ darbojas binÄrie meklÄÅ”anas filtri, apskatiet vienkÄrÅ”s skripts, kas Ä£enerÄ Å”Ädas programmas BPF montÄtÄjÄ, sastÄdot sistÄmas zvanu numurus, piemÄram:
$ echo 1 3 6 8 13 | ./generate_bin_search_bpf.py
ld [0]
jeq #6, bad
jgt #6, check8
jeq #1, bad
jeq #3, bad
ret #0x7fff0000
check8:
jeq #8, bad
jeq #13, bad
ret #0x7fff0000
bad: ret #0
Nav iespÄjams kaut ko uzrakstÄ«t ievÄrojami ÄtrÄk, jo BPF programmas nevar veikt atkÄpes lÄcienus (mÄs nevaram izdarÄ«t, piemÄram, jmp A vai jmp [label+X]), un tÄpÄc visas pÄrejas ir statiskas.
seccomp un strace
Ikviens zina lietderÄ«bu strace ir neaizstÄjams rÄ«ks procesu uzvedÄ«bas izpÄtei operÄtÄjsistÄmÄ Linux. TomÄr daudzi ir dzirdÄjuÅ”i arÄ« par veiktspÄjas problÄmas izmantojot Å”o utilÄ«tu. Fakts ir tÄds strace ieviests, izmantojot ptrace(2), un Å”ajÄ mehÄnismÄ mÄs nevaram norÄdÄ«t, pie kÄdas sistÄmas izsaukumu kopas ir nepiecieÅ”ams process apturÄt, t.i., komandas
$ time strace du /usr/share/ >/dev/null 2>&1
real 0m3.081s
user 0m0.531s
sys 0m2.073s
Šø
$ time strace -e open du /usr/share/ >/dev/null 2>&1
real 0m2.404s
user 0m0.193s
sys 0m1.800s
tiek apstrÄdÄti aptuveni vienÄ laikÄ, lai gan otrajÄ gadÄ«jumÄ mÄs vÄlamies izsekot tikai vienam sistÄmas izsaukumam.
Jauna iespÄja --seccomp-bpf, pievienots strace versija 5.3, ļauj daudzkÄrt paÄtrinÄt procesu, un palaiÅ”anas laiks zem viena sistÄmas zvana jau ir salÄ«dzinÄms ar parastÄs palaiÅ”anas laiku:
$ time strace --seccomp-bpf -e open du /usr/share/ >/dev/null 2>&1
real 0m0.148s
user 0m0.017s
sys 0m0.131s
$ time du /usr/share/ >/dev/null 2>&1
real 0m0.140s
user 0m0.024s
sys 0m0.116s
(Å eit, protams, ir neliela maldinÄÅ”ana, jo mÄs neizsekojam Ŕīs komandas galveno sistÄmas izsaukumu. Ja mÄs izsekotu, piemÄram, newfsstattad strace bremzÄtu tikpat spÄcÄ«gi kÄ bez --seccomp-bpf.)
KÄ Å”Ä« opcija darbojas? Bez viÅas strace pieslÄdzas procesam un sÄk to lietot PTRACE_SYSCALL. Kad pÄrvaldÄ«tais process izdod (jebkuru) sistÄmas izsaukumu, vadÄ«ba tiek nodota uz strace, kas aplÅ«ko sistÄmas zvana argumentus un palaiž to ar PTRACE_SYSCALL. PÄc kÄda laika process pabeidz sistÄmas izsaukumu un, izejot no tÄ, vadÄ«ba tiek nodota vÄlreiz strace, kas aplÅ«ko atgrieÅ”anas vÄrtÄ«bas un sÄk procesu, izmantojot PTRACE_SYSCALL, un tÄ tÄlÄk.
TomÄr ar seccomp Å”o procesu var optimizÄt tieÅ”i tÄ, kÄ mÄs vÄlÄtos. Proti, ja gribam aplÅ«kot tikai sistÄmas izsaukumu X, tad mÄs varam uzrakstÄ«t BPF filtru, kas paredzÄts X atgriež vÄrtÄ«bu SECCOMP_RET_TRACE, un zvaniem, kas mÅ«s neinteresÄ - SECCOMP_RET_ALLOW:
ld [0]
jneq #X, ignore
trace: ret #0x7ff00000
ignore: ret #0x7fff0000
Å ajÄ gadÄ«jumÄ strace sÄkotnÄji procesu sÄk kÄ PTRACE_CONT, mÅ«su filtrs tiek apstrÄdÄts katram sistÄmas zvanam, ja sistÄmas zvans nav X, process turpinÄs darboties, bet, ja Å”is X, tad seccomp nodos vadÄ«bu stracekas izskatÄ«s argumentus un sÄks procesu lÄ«dzÄ«gi PTRACE_SYSCALL (jo seccomp nevar palaist programmu, izejot no sistÄmas izsaukuma). Kad sistÄmas zvans atgriežas, strace atsÄks procesu, izmantojot PTRACE_CONT un gaidÄ«s jaunus ziÅojumus no seccomp.
Izmantojot opciju --seccomp-bpf ir divi ierobežojumi. PirmkÄrt, nebÅ«s iespÄjams pievienoties jau esoÅ”am procesam (opcija -p programmas strace), jo seccomp to neatbalsta. OtrkÄrt, nav iespÄju nÄ apskatiet bÄrnprocesus, jo seccomp filtrus manto visi bÄrnprocesi bez iespÄjas to atspÄjot.
Nedaudz sÄ«kÄk par to, kÄ tieÅ”i strace strÄdÄ ar seccomp var atrast no nesenais ziÅojums. Mums interesantÄkais fakts ir tas, ka klasiskais BPF, ko pÄrstÄv seccomp, tiek izmantots arÄ« mÅ«sdienÄs.
xt_bpf
Tagad atgriezÄ«simies tÄ«klu pasaulÄ.
PriekÅ”vÄsture: sen, 2007. gadÄ, kodols bija piebilda modulis xt_u32 tÄ«kla filtram. Tas tika uzrakstÄ«ts pÄc analoÄ£ijas ar vÄl senÄku satiksmes klasifikatoru cls_u32 un ļÄva rakstÄ«t patvaļīgus binÄros noteikumus iptables, izmantojot Å”Ädas vienkÄrÅ”as darbÄ«bas: ielÄdÄjiet 32 āābitus no pakotnes un veiciet aritmÄtisko darbÄ«bu kopu ar tiem. PiemÄram,
IelÄdÄ IP galvenes 32 bitus, sÄkot ar 6. polsterÄjumu, un uzliek tiem masku 0xFF (paÅemiet zemo baitu). Å is lauks protocol IP galveni un salÄ«dzinÄm to ar 1 (ICMP). VienÄ noteikumÄ varat apvienot daudzas pÄrbaudes, kÄ arÄ« izpildÄ«t operatoru @ ā pÄrvietot X baitus pa labi. PiemÄram, noteikums
pÄrbauda, āāvai TCP kÄrtas numurs nav vienÄds 0x29. SÄ«kÄk neiedziļinÄÅ”os, jo jau tagad ir skaidrs, ka Å”Ädus noteikumus rakstÄ«t ar roku nav Ä«paÅ”i Ärti. RakstÄ BPF - aizmirstais baitkods, ir vairÄkas saites ar lietojuma piemÄriem un noteikumu Ä£enerÄÅ”anu xt_u32. Skatiet arÄ« saites Ŕī raksta beigÄs.
KopÅ” 2013. gada modulis moduļa vietÄ xt_u32 varat izmantot BPF balstÄ«tu moduli xt_bpf. Ikvienam, kurÅ” ir lasÄ«jis tik tÄlu, jau vajadzÄtu bÅ«t skaidram par tÄ darbÄ«bas principu: palaist BPF baitu kodu kÄ iptables noteikumus. Varat izveidot jaunu noteikumu, piemÄram, Å”Ädi:
iptables -A INPUT -m bpf --bytecode <Š±Š°Š¹ŃŠŗŠ¾Š“> -j LOG
Å ajÄ piemÄrÄ mÄs filtrÄjam visas UDP paketes. BPF programmas konteksts modulÄ« xt_bpf, protams, norÄda uz pakeÅ”u datiem, iptables gadÄ«jumÄ uz IPv4 galvenes sÄkumu. BPF programmas atgrieÅ”anas vÄrtÄ«ba BÅ«laKur false nozÄ«mÄ, ka pakete nesakrita.
Ir skaidrs, ka modulis xt_bpf atbalsta sarežģītÄkus filtrus nekÄ iepriekÅ” minÄtajÄ piemÄrÄ. ApskatÄ«sim reÄlus piemÄrus no Cloudfare. VÄl nesen viÅi izmantoja moduli xt_bpf lai aizsargÄtu pret DDoS uzbrukumiem. RakstÄ IepazÄ«stinÄm ar BPF rÄ«kiem viÅi paskaidro, kÄ (un kÄpÄc) viÅi Ä£enerÄ BPF filtrus un publicÄ saites uz utilÄ«tu kopu Å”Ädu filtru izveidei. PiemÄram, izmantojot utilÄ«tu bpfgen varat izveidot BPF programmu, kas atbilst vÄrda DNS vaicÄjumam habr.com:
$ ./bpfgen --assembly dns -- habr.com
ldx 4*([0]&0xf)
ld #20
add x
tax
lb_0:
ld [x + 0]
jneq #0x04686162, lb_1
ld [x + 4]
jneq #0x7203636f, lb_1
ldh [x + 8]
jneq #0x6d00, lb_1
ret #65535
lb_1:
ret #0
ProgrammÄ mÄs vispirms ielÄdÄjam reÄ£istrÄ X rindas sÄkuma adrese x04habrx03comx00 UDP datagrammÄ un pÄc tam pÄrbaudiet pieprasÄ«jumu: 0x04686162 <-> "x04hab" uc
Nedaudz vÄlÄk Cloudfare publicÄja p0f -> BPF kompilatora kodu. RakstÄ IepazÄ«stinÄm ar p0f BPF kompilatoru viÅi runÄ par to, kas ir p0f un kÄ pÄrvÄrst p0f parakstus par BPF:
PaÅ”laik vairs neizmanto Cloudfare xt_bpf, jo viÅi pÄrcÄlÄs uz XDP - vienu no iespÄjÄm izmantot jauno BPF versiju, sk. L4Drop: XDP DDoS mazinÄÅ”anas pasÄkumi.
cls_bpf
PÄdÄjais piemÄrs klasiskÄ BPF izmantoÅ”anai kodolÄ ir klasifikators cls_bpf satiksmes vadÄ«bas apakÅ”sistÄmai operÄtÄjsistÄmÄ Linux, kas tika pievienota Linux 2013. gada beigÄs un konceptuÄli aizstÄj seno cls_u32.
TomÄr mÄs tagad neaprakstÄ«sim darbu cls_bpf, jo no zinÄÅ”anu viedokļa par klasisko BPF tas mums neko nedos - mÄs jau esam iepazinuÅ”ies ar visu funkcionalitÄti. TurklÄt turpmÄkajos rakstos, kas runÄ par paplaÅ”inÄto BPF, mÄs vairÄk nekÄ vienu reizi tiksimies ar Å”o klasifikatoru.
VÄl viens iemesls, lai nerunÄtu par klasiskÄ BPF lietoÅ”anu c cls_bpf ProblÄma ir tÄda, ka, salÄ«dzinot ar Extended BPF, pielietojamÄ«bas joma Å”ajÄ gadÄ«jumÄ ir radikÄli saÅ”aurinÄta: klasiskÄs programmas nevar mainÄ«t pakotÅu saturu un nevar saglabÄt stÄvokli starp zvaniem.
TÄpÄc ir pienÄcis laiks atvadÄ«ties no klasiskÄ BPF un skatÄ«ties nÄkotnÄ.
Ardievas klasiskajam BPF
MÄs apskatÄ«jÄm, kÄ deviÅdesmito gadu sÄkumÄ izstrÄdÄtÄ BPF tehnoloÄ£ija veiksmÄ«gi nodzÄ«voja gadsimta ceturksni un lÄ«dz beigÄm atrada jaunus pielietojumus. TomÄr lÄ«dzÄ«gi kÄ pÄreja no steka maŔīnÄm uz RISC, kas kalpoja par stimulu klasiskÄ BPF attÄ«stÄ«bai, 32. gados notika pÄreja no 64 bitu uz XNUMX bitu maŔīnÄm un klasiskais BPF sÄka novecot. TurklÄt klasiskÄ BPF iespÄjas ir ļoti ierobežotas, un papildus novecojuÅ”ajai arhitektÅ«rai - mums nav iespÄjas saglabÄt stÄvokli starp zvaniem uz BPF programmÄm, nav tieÅ”as lietotÄja mijiedarbÄ«bas, nav mijiedarbÄ«bas iespÄjas. ar kodolu, izÅemot ierobežota skaita struktÅ«ras lauku nolasÄ«Å”anu sk_buff un palaižot vienkÄrÅ”ÄkÄs palÄ«gfunkcijas, nevar mainÄ«t pakeÅ”u saturu un tÄs pÄradresÄt.
Faktiski Å”obrÄ«d viss, kas paliek no klasiskÄ BPF operÄtÄjsistÄmÄ Linux, ir API saskarne, un kodola iekÅ”pusÄ visas klasiskÄs programmas, neatkarÄ«gi no tÄ, vai tie bÅ«tu ligzdas filtri vai seccomp filtri, tiek automÄtiski tulkoti jaunÄ formÄtÄ Extended BPF. (Par to, kÄ tieÅ”i tas notiek, mÄs runÄsim nÄkamajÄ rakstÄ.)
PÄreja uz jaunu arhitektÅ«ru sÄkÄs 2013. gadÄ, kad Aleksejs Starovoitovs ierosinÄja BPF atjauninÄÅ”anas shÄmu. 2014. gadÄ atbilstoÅ”os ielÄpus sÄka parÄdÄ«ties kodolÄ. Cik es saprotu, sÄkotnÄjais plÄns bija tikai optimizÄt arhitektÅ«ru un JIT kompilatoru, lai tÄ darbotos efektÄ«vÄk 64 bitu iekÄrtÄs, taÄu tÄ vietÄ Å”Ä«s optimizÄcijas iezÄ«mÄja jaunas nodaļas sÄkumu Linux attÄ«stÄ«bÄ.
TurpmÄkie raksti Å”ajÄ sÄrijÄ aptvers jaunÄs tehnoloÄ£ijas arhitektÅ«ru un lietojumus, kas sÄkotnÄji bija pazÄ«stami kÄ iekÅ”Äjais BPF, pÄc tam paplaÅ”inÄtais BPF un tagad vienkÄrÅ”i BPF.
atsauces
StÄ«vens Makkens un Van Džeikobsons, "BSD pakeÅ”u filtrs: jauna arhitektÅ«ra lietotÄja lÄ«meÅa pakeÅ”u uztverÅ”anai", https://www.tcpdump.org/papers/bpf-usenix93.pdf
StÄ«vens Makkens, "libpcap: arhitektÅ«ra un optimizÄcijas metodika pakeÅ”u uztverÅ”anai", https://sharkfestus.wireshark.org/sharkfest.11/presentations/McCanne-Sharkfest'11_Keynote_Address.pdf