BPF mo nga tamariki iti, wahi kore: BPF matarohia

Ko Berkeley Packet Filters (BPF) he hangarau kernel Linux kua noho ki nga wharangi o mua o nga whakaputanga hangarau reo Ingarihi mo etahi tau inaianei. Kua whakakiia nga huihuinga ki nga ripoata mo te whakamahinga me te whanaketanga o te BPF. Ko David Miller, te kaiwhakahaere o te punaha whatunga Linux, ka karanga i tana korero i te Linux Plumbers 2018 "Ehara tenei korero mo te XDP" (Ko XDP tetahi take whakamahi mo te BPF). Ka hoatu e Brendan Gregg nga korero e tika ana Linux BPF Superpowers. Toke Høiland-Jørgensen katakatako te kernel he microkernel inaianei. Ko Thomas Graf te whakatairanga i te whakaaro e Ko te BPF he javascript mo te kernel.

Kaore ano he whakaahuatanga nahanaha mo te BPF i runga i a Habré, na reira i roto i te raupapa o nga tuhinga ka ngana ahau ki te korero mo te hitori o te hangarau, te whakaahua i te hoahoanga me nga taputapu whanaketanga, me te whakaatu i nga waahanga o te tono me te mahi mo te whakamahi i te BPF. Ko tenei tuhinga, kore, i roto i te raupapa, e korero ana i te hitori me te hoahoanga o te BPF matarohia, me te whakaatu ano i nga mea ngaro o ana tikanga whakahaere. tcpdump, seccomp, strace, me te maha atu.

Ko te whakawhanaketanga o te BPF kei te whakahaeretia e te hapori whatunga Linux, ko nga tono matua o te BPF e pa ana ki nga whatunga na reira, me te whakaaetanga. @eukariota, I karangahia e ahau te raupapa "BPF mo nga tamariki iti", hei whakanui i te raupapa nui "Nga whatunga mo nga tamariki iti".

He akoranga poto mo te hitori o te BPF(c)

Ko te hangarau BPF o naianei he putanga pai ake me te whakawhanui o te hangarau tawhito me te ingoa kotahi, e kiia nei ko te BPF matarohia hei karo i te rangirua. I hangaia he taputapu rongonui i runga i te BPF matarohia tcpdump, tikanga seccomp, me nga waahanga iti e mohiotia ana xt_bpf ki iptables me te whakarōpū cls_bpf. I roto i te Linux hou, ka whakamaoritia aunoa nga kaupapa BPF matarohia ki te ahua hou, heoi, mai i te tirohanga a te kaiwhakamahi, kei te noho tonu te API me nga whakamahinga hou mo te BPF matarohia, ka kitea i tenei tuhinga, kei te kitea tonu. Mo tenei take, me te whai i te hitori o te whanaketanga o te BPF puāwaitanga i Linux, ka marama ake te pehea me te take i puta ai ki tona ahua hou, ka whakatau ahau ki te tiimata me tetahi tuhinga mo te BPF puāwaitanga.

I te mutunga o te waru tekau o te rautau kua hipa, ka aro atu nga miihini mai i te taiwhanga rongonui o Lawrence Berkeley Laboratory ki te patai me pehea te tātari tika i nga paatete whatunga i runga i nga taputapu hou i te mutunga o te waru tekau o te rautau kua hipa. Ko te whakaaro taketake o te tātari, i whakatinanahia i te hangarau CSPF (CMU/Stanford Packet Filter), ko te tarai i nga paatete kore i te wa e taea ai, ara. i roto i te mokowā kernel, na te mea ka karo tenei i te kape i nga raraunga kore ki te waahi kaiwhakamahi. Hei whakarato i te haumarutanga wa whakahaere mo te whakahaere i te waehere kaiwhakamahi ki te mokowā kernel, i whakamahia he miihini mariko pouaka kirikiri.

Heoi, ko nga miihini mariko mo nga whiriwhiringa o naianei i hangaia kia rere i runga i nga miihini-a-papa, a, kaore i tino pai te rere ki runga i nga miihini RISC hou ake. Ko te mutunga, na roto i nga mahi a nga miihini mai i Berkeley Labs, i hangaia he hangarau BPF (Berkeley Packet Filters) hou, ko te hoahoanga miihini mariko i hangaia i runga i te miihini Motorola 6502 - te mahi o nga hua rongonui penei. Apple II ranei NES. Ko te miihini mariko hou i piki ake te mahi tātari tekau nga wa ka whakaritea ki nga otinga o naianei.

Hangahanga miihini BPF

Ka waia tatou ki te hoahoanga i runga i te mahi, te tātari tauira. Heoi, hei timata, me kii e rua nga rehita 32-bit te miihini e uru ana ki te kaiwhakamahi, he kaikoi A me te rehita tohu X, 64 paita o te mahara (16 kupu), e waatea ana mo te tuhi me te panui ka whai ake, me tetahi punaha whakahau iti mo te mahi me enei taonga. Ko nga tohutohu peke mo te whakatinana i nga kupu herenga i waatea ano i roto i nga kaupapa, engari hei whakapumau i te otinga o te hotaka, ka taea anake te peke whakamua, ara, ina koa, karekau te hanga koropiko.

Ko te kaupapa whanui mo te tiimata i te miihini e whai ake nei. Ka hangaia e te kaiwhakamahi he kaupapa mo te hoahoanga BPF me te whakamahi etahi Ko te tikanga o te kernel (penei i te waea punaha), ka utaina, ka honoa te hotaka ki ki etahi ki te kaihanga takahanga i roto i te pata (hei tauira, ko te huihuinga ko te taenga mai o te paatete e whai ake nei i runga i te kaari whatunga). Ka puta he takahanga, ka whakahaerehia e te kernel te papatono (hei tauira, i te kaiwhakamaori), ka rite te mahara miihini ki te ki etahi rohe mahara kernel (hei tauira, nga raraunga o te kete taumai).

Ko nga mea i runga ake nei ka ranea hei timata ki te titiro ki nga tauira: ka mohio tatou ki te punaha me te whakatakotoranga whakahau ina tika. Mena kei te hiahia koe ki te ako tonu i te punaha whakahau o te miihini mariko me te ako mo ona kaha katoa, ka taea e koe te panui i te tuhinga taketake Ko te BSD Packet Filter me/rānei te haurua tuatahi o te kōnae Tuhinga/whatunga/filter.txt mai i te tuhinga kernel. I tua atu, ka taea e koe te ako i te whakaaturanga libpcap: He Tikanga Hangahanga me te Arotautanga mo te Hopu Pakete, i korero a McCanne, tetahi o nga kaituhi o te BPF, mo te hitori o te hanganga libpcap.

Ka haere tonu taatau ki te whai whakaaro ki nga tauira whakahirahira katoa mo te whakamahi BPF matarohia i runga i te Linux: tcpdump (libpcap), kopae, xt_bpf, cls_bpf.

tcpdump

Ko te whakawhanaketanga o te BPF i mahia i roto i te whakarara me te whanaketanga o te pito o mua mo te tātari paatete - he taputapu rongonui. tcpdump. Na, i te mea koinei te tauira tawhito me te tino rongonui mo te whakamahi i te BPF matarohia, e waatea ana i runga i nga punaha whakahaere maha, ka timata taatau ki te ako mo te hangarau.

(I rere ahau i nga tauira katoa o tenei tuhinga mo Linux 5.6.0-rc6. Ko te putanga o etahi whakahau kua whakatikahia kia pai ake te panui.)

Tauira: te mataki i nga paakete IPv6

Whakaarohia e hiahia ana tatou ki te titiro ki nga paatete IPv6 katoa i runga i tetahi atanga eth0. Ki te mahi i tenei ka taea e taatau te whakahaere i te kaupapa tcpdump me te tātari ngawari ip6:

$ sudo tcpdump -i eth0 ip6

Ko te kupu tcpdump ka whakahiato i te tātari ip6 ki te bytecode hoahoanga BPF ka tukuna ki te kernel (tirohia nga taipitopito i te waahanga Tcpdump: utaina). Ka whakahaeretia te tātari kua utaina mo ia paatete e haere ana i te atanga eth0. Mena ka whakahokia e te tātari he uara kore-kore n, ka tae ki te n ka kapehia nga paita o te paatete ki te waahi kaiwhakamahi ka kite tatou i te putanga tcpdump.

BPF mo nga tamariki iti, wahi kore: BPF matarohia

Te ahua nei ka taea e tatou te mohio he aha te bytecode i tukuna ki te kernel tcpdump me te awhina o te tcpdump, ki te rere tatou i te reira ki te kōwhiringa -d:

$ sudo tcpdump -i eth0 -d ip6
(000) ldh      [12]
(001) jeq      #0x86dd          jt 2    jf 3
(002) ret      #262144
(003) ret      #0

I te raina kore ka whakahaerehia e matou te whakahau ldh [12], e tu ana mo te “utaina ki te rehita A he haurua kupu (16 moka) kei te wahi noho 12” ko te patai anake he aha te ahua o te mahara e korero ana tatou? Ko te whakautu kei x timata (x+1)th paita o te kete whatunga kua tātarihia. Ka panuihia e matou nga paatete mai i te atanga Ethernet eth0me tenei te tikangahe penei te ahua o te paatete (mo te ngawari, ka whakaaro matou kaore he tohu VLAN kei ​​roto i te paatete):

       6              6          2
|Destination MAC|Source MAC|Ether Type|...|

Na i muri i te mahi i te whakahau ldh [12] i roto i te rehita A ka tu he mara Ether Type — te momo kete ka tukuna ki tenei anga Ethernet. I te rarangi 1 ka whakatairitehia nga korero o te rehita A (momo kete) c 0x86ddme tenei a tera ano Ko te momo e hiahia ana matou ko IPv6. I te rarangi 1, i tua atu i te whakahau whakataurite, e rua ano nga pou - jt 2 и jf 3 — nga tohu me haere koe mena ka angitu te whakataurite (A == 0x86dd) me te kore i angitu. Na, i roto i te keehi angitu (IPv6) ka haere matou ki te raina 2, a, i roto i te keehi kaore i angitu - ki te raina 3. I te rarangi 3 ka mutu te papatono me te waehere 0 (kaua e kape i te putea), i te rarangi 2 ka mutu te papatono me te waehere 262144 (tāruahia ahau he mōrahi 256 kiropaita mōkihi).

He tauira uaua ake: ka titiro matou ki nga paatete TCP ma te tauranga tauranga

Kia kite tatou he aha te ahua o te tātari e kape ana i nga paakete TCP katoa me te tauranga taunga 666. Ka whai whakaaro tatou ki te keehi IPv4, i te mea he maamaa ake te keehi IPv6. Whai muri i te ako i tenei tauira, ka taea e koe te tirotiro i te tātari IPv6 koe hei mahi whakakorikori (ip6 and tcp dst port 666) me te tātari mo te take whanui (tcp dst port 666). Na, ko te tātari e hiahia ana matou ki te penei:

$ 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

Kua mohio tatou he aha nga rarangi 0 me te 1 mahi. I te rarangi 2 kua tirohia e matou he paakete IPv4 tenei (Momo Ether = 0x800) ka utaina ki te rehita A Paita 24 o te paatete. Ko te ahua o ta maatau kete

       14            8      1     1
|ethernet header|ip fields|ttl|protocol|...|

ko te tikanga ka utaina e matou ki te rehita A te mara Kawa o te pane IP, he arorau, na te mea e hiahia ana matou ki te kape i nga paatete TCP anake. Ka whakatauritea e matou te Kawa ki 0x6 (IPPROTO_TCP) kei te rarangi 3.

I nga rarangi 4 me te 5 ka utaina e matou nga haurua kupu kei te wahitau 20 ka whakamahi i te whakahau jset tirohia mena kua whakaritea tetahi o nga mea e toru haki - mau i te kanohi i tukuna jset kua whakawāteatia ngā moka tino hira e toru. E rua o nga moka e toru e whakaatu mai ana he wahanga o te kete IP kua pakaruhia, a ki te pera, ko te waahanga whakamutunga ranei. Ko te moka tuatoru kua rahuitia, me noho kore. Kare matou e hiahia ki te tirotiro i nga paatete kaore i oti, i pakaru ranei, na reira ka tirohia e matou nga moka e toru.

Ko te Raina 6 te mea tino pai ki tenei rarangi ingoa. Whakaaturanga ldxb 4*([14]&0xf) te tikanga ka utaina e matou ki te rehita X ko nga moka iti rawa e wha o te tekau ma rima paita o te paita kua whakareatia ki te 4. Ko nga moka iti e wha o te paita tekau ma rima ko te mara Roa Pane Ipurangi Ko te pane IPv4, e pupuri ana i te roa o te pane ki roto i nga kupu, na me whakareatia e koe ki te 4. He mea whakamiharo, ko te kupu 4*([14]&0xf) he tohu mo tetahi kaupapa korero motuhake ka taea anake te whakamahi i tenei puka me te rehita anake X, i.e. e kore hoki e taea e matou te korero ldb 4*([14]&0xf) kore ldxb 5*([14]&0xf) (ka taea anake e matou te whakapūtā i tētahi atu wāhikē, hei tauira, ldxb 4*([16]&0xf)). E marama ana kua taapirihia tenei kaupapa whakatika ki te BPF kia whiwhi ai X (rēhita taupū) IPv4 te roa pane.

Na i te rarangi 7 ka ngana ki te uta i te haurua kupu i (X+16). Maharahara e 14 nga paita e nohoia ana e te pane Itarangi, a X kei roto te roa o te pane IPv4, kei te mohio matou kei roto A Kua utaina te tauranga ūnga TCP:

       14           X           2             2
|ethernet header|ip header|source port|destination port|

Ka mutu, ki te rarangi 8 ka whakatauritea te tauranga tauranga me te uara e hiahiatia ana, a ki nga rarangi 9, 10 ranei ka whakahokia mai te hua - mena ka kapehia te paatete, kaore ranei.

Tcpdump: utaina

I nga tauira o mua, kaore matou i tino korero mo te pehea e utaina ai e matou te BPF bytecode ki roto i te kernel mo te tātari paatete. Ko te tikanga, tcpdump tauranga ki nga punaha maha me te mahi me nga whiriwhiringa tcpdump ka whakamahi i te whare pukapuka libpcap. He poto, ki te tuu i te tātari ki runga i tetahi atanga ma te whakamahi libpcap, me mahi e koe enei:

Kia kite pehea te mahi pcap_setfilter ka whakatinanahia i Linux, ka whakamahia e matou strace (kua tangohia etahi rarangi):

$ sudo strace -f -e trace=%network tcpdump -p -i eth0 ip
socket(AF_PACKET, SOCK_RAW, 768)        = 3
bind(3, {sa_family=AF_PACKET, sll_protocol=htons(ETH_P_ALL), sll_ifindex=if_nametoindex("eth0"), sll_hatype=ARPHRD_NETROM, sll_pkttype=PACKET_HOST, sll_halen=0}, 20) = 0
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, {len=4, filter=0xb00bb00bb00b}, 16) = 0
...

I nga rarangi tuatahi e rua o te putanga ka hangaia e matou turanga mata ki te panui i nga papa Ethernet katoa ka herea ki te atanga eth0. Tuhinga o mua to tatou tauira tuatahi e mohio ana matou ko te tātari ip e wha nga tohutohu BPF, a i te rarangi tuatoru ka kite tatou me pehea te whakamahi i te whiringa SO_ATTACH_FILTER waea pūnaha setsockopt ka utaina, ka honoa he tātari o te roa 4. Ko ta matou tātari tenei.

He mea pai kia mohiohia i roto i te BPF matarohia, ko te uta me te hono i te tātari ka puta tonu he mahi ngota, a, i roto i te putanga hou o te BPF, ko te utaina o te kaupapa me te herea ki te kaihanga huihuinga ka wehea i te waa.

Pono Huna

Ko te ahua o te ahua o te putanga tino pai ake:

$ sudo strace -f -e trace=%network tcpdump -p -i eth0 ip
socket(AF_PACKET, SOCK_RAW, 768)        = 3
bind(3, {sa_family=AF_PACKET, sll_protocol=htons(ETH_P_ALL), sll_ifindex=if_nametoindex("eth0"), sll_hatype=ARPHRD_NETROM, sll_pkttype=PACKET_HOST, sll_halen=0}, 20) = 0
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, {len=1, filter=0xbeefbeefbeef}, 16) = 0
recvfrom(3, 0x7ffcad394257, 1, MSG_TRUNC, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, {len=4, filter=0xb00bb00bb00b}, 16) = 0
...

Ka rite ki te korero i runga ake nei, ka utaina, ka whakapirihia e matou ta matou tātari ki te turanga i te rarangi 5, engari ka aha ki nga rarangi 3 me te 4? Ka puta ko tenei libpcap e tiaki ana i a maatau - kia kore ai e uru ki roto i te putanga o ta maatau tātari nga paakete kaore e makona, te whare pukapuka hono tātari hangarua ret #0 (whakatakahia nga paatete katoa), ka huri i te turanga ki te aratau aukati-kore ka ngana ki te tango i nga paatete katoa ka noho tonu mai i nga whiriwhiringa o mua.

I roto i te katoa, ki te tātari pōkai i runga i Linux mā te whakamahi i BPF matarohia, me whai koe i te tātari i roto i te ahua o te hanganga rite struct sock_fprog me te turanga tuwhera, muri iho ka taea te whakapiri i te tātari ki te turanga ma te waea punaha setsockopt.

He mea whakamiharo, ka taea te taapiri i te tātari ki tetahi turanga, ehara i te mata noa. I konei tauira he papatono ka tapahi i nga paita katoa engari ko nga paita tuatahi e rua mai i nga whakaahua raraunga UDP taumai katoa. (I tapiritia e ahau nga korero i roto i te waehere kia kore ai e pakaru te tuhinga.)

Nga korero mo te whakamahi setsockopt mo te hono i nga whiriwhiringa, tirohia turanga(7), engari mo te tuhi i o ake whiriwhiringa penei struct sock_fprog kahore he awhina tcpdump ka korero tatou i te waahanga Papatonotanga BPF ki o tatou ringa ake.

BPF tauhira me te rautau XNUMX

I whakauruhia a BPF ki Linux i te tau 1997, a kua noho tonu hei mahi mo te wa roa libpcap kaore he huringa motuhake (he huringa motuhake-Linux, o te akoranga, ko, engari kaore i whakarereketia te pikitia o te ao). Ko nga tohu nui tuatahi ka whanake te BPF i tae mai i te tau 2011, i te wa i tono a Eric Dumazet paepae, e taapiri ana i te Just In Time Compiler ki te pata - he kaiwhakamaori mo te huri i te BPF bytecode ki te Maori x86_64 te waehere.

Ko te Kaihanga JIT te tuatahi i roto i te mekameka o nga huringa: i te tau 2012 puta mai te kaha ki te tuhi whiriwhiringa mo muna, ma te whakamahi i te BPF, i te Hanuere 2013 i reira kua taapirihia kōwae xt_bpf, ka taea e koe te tuhi ture mo iptables me te awhina a te BPF, a i Oketopa 2013 ko kua taapirihia he kōwae hoki cls_bpf, e taea ai e koe te tuhi i nga roopu waka ma te whakamahi i te BPF.

Ka ata tirohia enei tauira katoa, engari i te tuatahi ka whai hua tatou ki te ako me pehea te tuhi me te whakahiato i nga kaupapa hanga noa mo te BPF, na te mea ko nga kaha e whakaratohia ana e te whare pukapuka. libpcap iti (tauira ngawari: tātari i hangaia libpcap Ka taea te whakahoki mai i nga uara e rua anake - 0, 0x40000 ranei) i te nuinga o te waa, penei i te keehi o te seccomp, kaore e tika.

Papatonotanga BPF ki o tatou ringa ake

Kia mohio tatou ki te whakatakotoranga takirua o nga tohutohu BPF, he tino ngawari:

   16    8    8     32
| code | jt | jf |  k  |

E 64 nga moka mo ia tohutohu, kei roto ko nga moka 16 tuatahi te waehere tohutohu, katahi ka rua nga nuku moka-waru, jt и jf, me te 32 moka mo te tautohetohe K, he rereke te kaupapa mai i te whakahau ki te whakahau. Hei tauira, ko te whakahau ret, ka mutu te kaupapa kei a ia te waehere 6, ka tangohia te uara whakahoki mai i te taumau K. I roto i te C, ka whakaatuhia he tohutohu BPF kotahi hei hanganga

struct sock_filter {
        __u16   code;
        __u8    jt;
        __u8    jf;
        __u32   k;
}

ā, he hanganga te kaupapa katoa

struct sock_fprog {
        unsigned short len;
        struct sock_filter *filter;
}

Na, ka taea e taatau te tuhi i nga kaupapa (hei tauira, e mohio ana matou ki nga tohu tohutohu mai i [1]). Koinei te ahua o te tātari ip6 Tuhinga ka whai mai to tatou tauira tuatahi:

struct sock_filter code[] = {
        { 0x28, 0, 0, 0x0000000c },
        { 0x15, 0, 1, 0x000086dd },
        { 0x06, 0, 0, 0x00040000 },
        { 0x06, 0, 0, 0x00000000 },
};
struct sock_fprog prog = {
        .len = ARRAY_SIZE(code),
        .filter = code,
};

hōtaka prog ka taea e matou te whakamahi i runga i te ture i roto i te waea

setsockopt(sk, SOL_SOCKET, SO_ATTACH_FILTER, &prog, sizeof(prog))

Ko te tuhi i nga kaupapa i roto i te ahua o nga tohu miihini kaore i te tino watea, engari i etahi wa ka tika (hei tauira, mo te patuiro, te hanga whakamatautau wae, te tuhi tuhinga mo Habré, me etahi atu). Mo te waatea, i roto i te konae <linux/filter.h> kua tautuhia nga tonotono kaiawhina - ko te tauira o runga ake nei ka taea te tuhi ano

struct sock_filter code[] = {
        BPF_STMT(BPF_LD|BPF_H|BPF_ABS, 12),
        BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, ETH_P_IPV6, 0, 1),
        BPF_STMT(BPF_RET|BPF_K, 0x00040000),
        BPF_STMT(BPF_RET|BPF_K, 0),
}

Engari, kaore i te tino watea tenei whiringa. Koinei te korero a nga kaiwhakatakoto kaupapa Linux kernel, na reira i roto i te raarangi tools/bpf kakano ka kitea e koe he kaikohikohi me te patuiro mo te mahi me te BPF matarohia.

He tino rite te reo hui ki te whakaputanga patuiro tcpdump, engari hei taapiri ka taea e taatau te tohu tapanga tohu. Hei tauira, he kaupapa tenei ka whakaheke i nga paakete katoa engari ko TCP/IPv4:

$ cat /tmp/tcp-over-ipv4.bpf
ldh [12]
jne #0x800, drop
ldb [23]
jneq #6, drop
ret #-1
drop: ret #0

Ma te taunoa, ka mahia e te kaaputu te waehere ki te whakatakotoranga <количество инструкций>,<code1> <jt1> <jf1> <k1>,..., mo ta maatau tauira me TCP ka waiho

$ tools/bpf/bpf_asm /tmp/tcp-over-ipv4.bpf
6,40 0 0 12,21 0 3 2048,48 0 0 23,21 0 1 6,6 0 0 4294967295,6 0 0 0,

Mo te pai o nga kaihōtaka C, ka taea te whakamahi i tetahi whakatakotoranga putanga rereke:

$ tools/bpf/bpf_asm -c /tmp/tcp-over-ipv4.bpf
{ 0x28,  0,  0, 0x0000000c },
{ 0x15,  0,  3, 0x00000800 },
{ 0x30,  0,  0, 0x00000017 },
{ 0x15,  0,  1, 0x00000006 },
{ 0x06,  0,  0, 0xffffffff },
{ 0x06,  0,  0, 0000000000 },

Ka taea te kape i tenei kuputuhi ki te momo whakamaramatanga hanganga struct sock_filter, pera i ta matou i mahi i te timatanga o tenei wahanga.

Linux me nga toronga netsniff-ng

I tua atu ki te BPF paerewa, Linux me tools/bpf/bpf_asm tautoko me huinga kore-paerewa. Ko te tikanga, ka whakamahia nga tohutohu hei uru atu ki nga mara o te hanganga struct sk_buff, e whakaahua ana i te kete whatunga kei roto i te kernel. Heoi ano, tera ano etahi atu momo tohutohu kaiawhina, hei tauira ldw cpu ka utaina ki te rehita A hua o te whakahaere i te mahi kernel raw_smp_processor_id(). (I roto i te putanga hou o te BPF, kua whakaroahia enei toronga kore-paerewa ki te whakarato i nga hotaka me nga huinga kaiawhina kernel mo te uru ki te mahara, nga hanganga, me te whakaputa kaupapa.) Anei tetahi tauira pai o te tātari ka kape noa tatou i te pane pane ki te waahi kaiwhakamahi ma te whakamahi i te toronga poff, utu utunga utu:

ld poff
ret a

Kaore e taea te whakamahi i nga toronga BPF tcpdump, engari he take pai tenei ki te mohio ki te kete taputapu netsniff-ng, kei roto i era atu mea, he kaupapa matatau netsniff-ng, i tua atu i te tātari ma te whakamahi i te BPF, kei roto hoki he kaiwhakatikatika waka whai hua, me te matatau atu tools/bpf/bpf_asm, he BPF assembler i karangahia bpfc. Kei roto i te kete nga tuhinga tino taipitopito, tirohia nga hononga kei te mutunga o te tuhinga.

muna

Na, kua mohio matou ki te tuhi i nga kaupapa BPF o te uaua noa, kua rite ki te titiro ki nga tauira hou, ko te mea tuatahi ko te hangarau seccomp, e taea ai, ma te whakamahi i nga whiriwhiringa BPF, ki te whakahaere i te huinga me te huinga o nga tautohetohe waea punaha e waatea ana ki he tukanga kua hoatu me ona uri.

Ko te putanga tuatahi o te seccomp i honoa ki te kernel i te tau 2005, a, kaore i tino rongonui, na te mea he mea kotahi anake te whiringa - hei whakawhāiti i te huinga waea waea e waatea ana ki tetahi tukanga ki enei e whai ake nei: read, write, exit и sigreturn, me te tukanga i takahi i nga ture i patua ma te whakamahi SIGKILL. Heoi, i te tau 2012, i taapiri atu a seccomp i te kaha ki te whakamahi i nga whiriwhiringa BPF, ka taea e koe te tautuhi i te huinga waea kua whakaaetia me te tirotiro i o raatau tautohetohe. (He mea whakamiharo, ko Chrome tetahi o nga kaiwhakamahi tuatahi o tenei mahi, a kei te whakawhanake te iwi Chrome i tenei wa i tetahi tikanga KRSI i runga i te putanga hou o te BPF me te tuku i nga whakaritenga o nga Tauira Haumarutanga Linux.) Ka kitea nga hononga ki nga tuhinga taapiri i te mutunga. o te tuhinga.

Kia mahara kua puta kee nga tuhinga mo te tari mo te whakamahi i te seccom, tera pea ka hiahia tetahi ki te panui i mua (kaore ranei) te panui i nga waahanga e whai ake nei. I roto i te tuhinga Nga ipu me te haumarutanga: seccom he tauira mo te whakamahi i te seccomp, te putanga 2007 me te putanga e whakamahi ana i te BPF (ka hangaia nga tātari ma te whakamahi i te libseccomp), e korero ana mo te hononga o te seccomp ki a Docker, me te maha o nga hononga whai hua. I roto i te tuhinga Te wehe i nga daemons me te systemd ranei "kaore koe e hiahia ki a Docker mo tenei!" Ka hipokina, ina koa, me pehea te taapiri i nga rarangi pango me nga rarangi ma o nga waea punaha mo nga daemons e whakahaere ana systemd.

I muri mai ka kite tatou me pehea te tuhi me te uta i nga whiriwhiringa mo seccomp i te C me te whakamahi i te whare pukapuka libseccomp a he aha te pai me te kino o ia whiringa, ka mutu, kia kite tatou me pehea te whakamahi a seccomp e te kaupapa strace.

Te tuhi me te uta i nga whiriwhiringa mo te seccomp

Kua mohio tatou ki te tuhi i nga kaupapa BPF, no reira me titiro tuatahi ki te atanga hotaka seccom. Ka taea e koe te whakarite tātari ki te taumata o te tukanga, a ka riro i nga tukanga tamariki katoa nga here. Ka mahia tenei ma te waea punaha seccomp(2):

seccomp(SECCOMP_SET_MODE_FILTER, flags, &filter)

te wahi &filter - he tohu tenei ki tetahi hanganga kua mohio tatou struct sock_fprog, i.e. hōtaka BPF.

He pehea te rereke o nga kaupapa mo te seccomp i nga kaupapa mo nga turanga? Te horopaki tuku. Mo nga turanga, i whakawhiwhia mai he waahi mahara kei roto i te paatete, a, i te keehi o te seccomp ka tukuna he hanganga penei

struct seccomp_data {
    int   nr;
    __u32 arch;
    __u64 instruction_pointer;
    __u64 args[6];
};

ko te reira nr ko te nama o te waea punaha ka whakarewahia, arch - hoahoanga o naianei (he nui ake mo tenei kei raro nei), args - kia ono nga tohenga waea punaha, me te instruction_pointer he atatohu ki te tohutohu mokowā kaiwhakamahi i waea ai te punaha. Na, hei tauira, ki te utaina te nama waea punaha ki te rehita A me korero tatou

ldw [0]

Arā ano etahi atu ahuatanga mo nga papatono seccomp, hei tauira, ka taea anake te uru ki te horopaki ma te tirohanga 32-bit ka kore e taea e koe te uta i te haurua kupu, i te paita ranei - ina ngana ana ki te uta i te tātari. ldh [0] waea pūnaha seccomp ka hoki mai EINVAL. Ka tirohia e te mahi nga whiriwhiringa kua utaina seccomp_check_filter() kākano. (Ko te mea rorirori, i roto i te kaupapa tuatahi i taapiri i te mahi seccomp, i wareware ratou ki te taapiri whakaaetanga ki te whakamahi i nga tohutohu ki tenei mahi. mod (wehenga wehenga) karekau i te waatea mo nga kaupapa BPF tuarua, mai i tana taapiri ka pakaru ABI.)

Ko te tikanga, kua mohio tatou ki nga mea katoa ki te tuhi me te panui i nga kaupapa seccom. I te nuinga o te wa ka whakaritea te kaupapa arorau hei rarangi ma, pango ranei o nga waea punaha, hei tauira ko te kaupapa

ld [0]
jeq #304, bad
jeq #176, bad
jeq #239, bad
jeq #279, bad
good: ret #0x7fff0000 /* SECCOMP_RET_ALLOW */
bad: ret #0

ka tirohia he rarangi pango o nga waea punaha e wha ko te nama 304, 176, 239, 279. He aha enei waea punaha? Kare e taea e matou te tino kii, na te mea kaore matou i te mohio he aha te hoahoanga i tuhia ai te kaupapa. Na reira, ko nga kaituhi o seccom tuku Tīmatahia nga kaupapa katoa me te tirotiro hoahoanga (kua tohuhia te hoahoanga o naianei ki te horopaki hei mara arch te hanganga struct seccomp_data). Ki te tirotirohia te hoahoanga, ka penei te ahua o te timatanga o te tauira:

ld [4]
jne #0xc000003e, bad_arch ; SCMP_ARCH_X86_64

katahi ka whiwhi tatou nama waea punaha etahi uara.

Ka tuhia, ka utaina e matou nga whiriwhiringa mo te whakamahi i te seccom libseccomp

Ma te tuhi i nga whiriwhiringa i roto i te waehere taketake, i te huihuinga BPF ranei ka taea e koe te mana katoa ki runga i te hua, engari i te wa ano, he pai ake i etahi wa ki te whai waehere kawe me/ranei te panui. Ma te whare pukapuka tatou e awhina ki tenei libseccomp, e whakarato ana i te atanga paerewa mo te tuhi i nga whiriwhiringa pango, ma ranei.

Hei tauira, tuhia he papatono e whakahaere ana i te konae takirua i whiriwhiria e te kaiwhakamahi, kua whakauruhia he rarangi pango o nga waea waea mai i mua. te tuhinga o runga ake nei (kua whakangwarihia te kaupapa kia pai ake te panui, ka kitea te katoa o te putanga konei):

#include <seccomp.h>
#include <unistd.h>
#include <err.h>

static int sys_numbers[] = {
        __NR_mount,
        __NR_umount2,
       // ... еще 40 системных вызовов ...
        __NR_vmsplice,
        __NR_perf_event_open,
};

int main(int argc, char **argv)
{
        scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_ALLOW);

        for (size_t i = 0; i < sizeof(sys_numbers)/sizeof(sys_numbers[0]); i++)
                seccomp_rule_add(ctx, SCMP_ACT_TRAP, sys_numbers[i], 0);

        seccomp_load(ctx);

        execvp(argv[1], &argv[1]);
        err(1, "execlp: %s", argv[1]);
}

Tuatahi ka tautuhia he huinga sys_numbers o 40+ tau waea pūnaha ki te aukati. Na, arawhiti te horopaki ctx me korero ki te whare pukapuka nga mea e hiahia ana matou ki te whakaae (SCMP_ACT_ALLOW) nga waea punaha katoa ma te taunoa (he maamaa ake te hanga rarangi pango). Na, takitahi, ka taapirihia nga waea punaha katoa mai i te raarangi pango. Hei whakautu ki tetahi waea punaha mai i te raarangi, ka tono matou SCMP_ACT_TRAP, i tenei keehi ka tukuna e te seccomp he tohu ki te mahi SIGSYS me te whakaahuatanga mo te waea punaha i takahi i nga ture. Ka mutu, ka utaina e matou te papatono ki te kernel ma te whakamahi seccomp_load, ka whakahiato i te hotaka me te hono atu ki te mahi ma te whakamahi waea punaha seccomp(2).

Mo te whakahiato angitu, me hono te hotaka ki te whare pukapuka libseccomp, hei tauira:

cc -std=c17 -Wall -Wextra -c -o seccomp_lib.o seccomp_lib.c
cc -o seccomp_lib seccomp_lib.o -lseccomp

He tauira o te whakarewanga angitu:

$ ./seccomp_lib echo ok
ok

He tauira o te waea punaha kua araia:

$ sudo ./seccomp_lib mount -t bpf bpf /tmp
Bad system call

Ka whakamahia e matou stracemo nga taipitopito:

$ 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

me pehea e mohio ai kua whakamutua te hotaka na te whakamahi i tetahi waea punaha ture mount(2).

Na, i tuhia e matou he tātari ma te whakamahi i te whare pukapuka libseccomp, te whakauru i te waehere kore-iti ki nga rarangi e wha. I roto i te tauira i runga ake nei, mena he maha nga waea a te punaha, ka taea te whakaiti i te waa mahi, na te mea he rarangi whakataurite noa te haki. Mo te arotautanga, libseccomp i tata nei papaki whakaurua, he taapiri tautoko mo te huanga tātari SCMP_FLTATR_CTL_OPTIMIZE. Ma te tautuhi i tenei huanga ki te 2 ka huri te tātari ki te kaupapa rapu rua.

Mena kei te hiahia koe ki te kite me pehea te mahi a nga whiriwhiringa rapu rua, tirohia tuhi ngawari, e whakaputa ana i nga kaupapa penei i roto i te BPF assembler ma te waea i nga tau waea punaha, hei tauira:

$ 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

Kaore e taea te tuhi i tetahi mea tino tere ake, na te mea kaore e taea e nga kaupapa BPF te mahi peke nuku (kaore e taea e taatau, hei tauira, jmp A ranei jmp [label+X]) na reira he pateko nga whakawhitinga katoa.

hekopa me te strace

E mohio ana te katoa ki te whaipainga strace he taputapu tino nui mo te ako i te whanonga o nga tukanga i runga i te Linux. Heoi ano, he tokomaha kua rongo take mahi i te wa e whakamahi ana i tenei taputapu. Ko te meka ko tera strace whakatinana mā te whakamahi ptrace(2), a, i roto i tenei tikanga kaore e taea e matou te whakaatu he aha te huinga o nga waea punaha me aukati i te mahi, ara, hei tauira, nga whakahau

$ 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

Ka tukatukahia i roto i te wa ano, ahakoa i te keehi tuarua e hiahia ana matou ki te whai i tetahi waea punaha anake.

Kōwhiringa hōu --seccomp-bpf, tāpirihia ki strace putanga 5.3, ka taea e koe te tere ake i te mahi i nga wa maha me te wa whakaoho i raro i te tohu o tetahi waea punaha kua rite ki te wa o te whakaohotanga auau:

$ 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

(I konei, o te akoranga, he iti noa te tinihanga i te mea kaore tatou e whai ana i te waea punaha matua o tenei whakahau. Mena kei te whai tatou, hei tauira, newfsstat, ka strace ka pakaru rite tonu ki te kore --seccomp-bpf.)

Me pehea te mahi o tenei whiringa? Te kore ia strace ka hono ki te tukanga ka timata ki te whakamahi PTRACE_SYSCALL. Ina tukuna e te tukanga whakahaere he waea (tetahi) punaha, ka whakawhitia te mana whakahaere ki strace, e titiro ana ki nga tohenga o te waea punaha me te whakahaere ma te whakamahi PTRACE_SYSCALL. I muri i etahi wa, ka whakaoti te tukanga i te waea a te punaha, ka puta atu, ka whakawhiti ano te mana strace, e titiro ana ki nga uara hokinga ka timata te mahi ma te whakamahi PTRACE_SYSCALL, me etahi atu.

BPF mo nga tamariki iti, wahi kore: BPF matarohia

Ma te seccomp, heoi, ka taea te whakapai ake i tenei tukanga kia rite ki ta matou e pai ai. Ara, ki te hiahia tatou ki te titiro anake ki te waea punaha X, katahi ka tuhia he tātari BPF mo tera X ka whakahokia he uara SECCOMP_RET_TRACE, mo nga waea kaore e pai ki a matou - SECCOMP_RET_ALLOW:

ld [0]
jneq #X, ignore
trace: ret #0x7ff00000
ignore: ret #0x7fff0000

I tenei take strace ka timata te mahi i te tuatahi PTRACE_CONT, ka tukatukahia to taatau tātari mo ia waea punaha, mena kaore te waea punaha X, ka haere tonu te tukanga, engari ki te penei X, katahi ka whakawhiti te seccom i te mana whakahaere straceka titiro ki nga tohenga ka timata te mahi penei PTRACE_SYSCALL (i te mea karekau he mana a seccomp ki te whakahaere i tetahi papatono i te putanga mai i te waea punaha). Ka hoki mai te waea punaha, strace ka timata ano te tukanga ma te whakamahi PTRACE_CONT ka tatari mo nga karere hou mai i te seccom.

BPF mo nga tamariki iti, wahi kore: BPF matarohia

A, no te whakamahi i te kōwhiringa --seccomp-bpf e rua nga here. Tuatahi, e kore e taea te uru atu ki tetahi tukanga o mua (kowhiringa -p hōtaka strace), i te mea kaore tenei e tautokohia e te seccom. Tuarua, karekau he waahi e kore titiro ki nga tukanga tamariki, na te mea he mea tuku iho nga whiriwhiringa seccomp e nga tukanga tamariki katoa me te kore e taea te whakakore i tenei.

He iti ake nga korero mo te pehea strace mahi tahi me seccomp ka kitea mai i purongo tata nei. Mo matou, ko te mea tino pai ko te BPF matarohia e tohuhia ana e te seccomp kei te whakamahia tonu i enei ra.

xt_bpf

Inaianei kia hoki ano tatou ki te ao whatunga.

Papamuri: no mua noa atu, i te tau 2007, ko te kaupapa matua kua taapirihia kōwae xt_u32 mo te tātari net. I tuhia ma te whakataurite me te whakarōpū waka tawhito noa atu cls_u32 me te tuku i a koe ki te tuhi i nga ture a-rua mo nga iptables ma te whakamahi i nga mahi ngawari e whai ake nei: utaina nga moka 32 mai i tetahi kete ka mahia he huinga mahi tatau ki runga. Hei tauira,

sudo iptables -A INPUT -m u32 --u32 "6&0xFF=1" -j LOG --log-prefix "seen-by-xt_u32"

Ka utaina nga moka 32 o te pane IP, timata mai i te hoe 6, ka hoatu he kanohi ki a ratou 0xFF (tangohia te paita iti). Tenei mara protocol pane IP ka whakatauritea e matou ki te 1 (ICMP). Ka taea e koe te whakakotahi i nga haki maha ki te ture kotahi, ka taea hoki e koe te whakahaere i te kaiwhakahaere @ — neke X paita ki te taha matau. Hei tauira, ko te ture

iptables -m u32 --u32 "6&0xFF=0x6 && 0>>22&0x3C@4=0x29"

ka tirohia mena kaore i te rite te Tau Raupapa TCP 0x29. E kore au e korero atu mo etahi atu korero, na te mea kua tino marama ko te tuhi i aua ture ma te ringaringa kaore i te tino watea. I roto i te tuhinga BPF - te waehere paita kua warewarehia, he maha nga hononga me nga tauira o te whakamahinga me te hanga ture mo xt_u32. Tirohia hoki nga hononga kei te mutunga o tenei tuhinga.

Mai i te 2013 kōwae hei utu mo te kōwae xt_u32 Ka taea e koe te whakamahi i tetahi waahanga BPF xt_bpf. Ko nga tangata kua panui i tenei tawhiti me tino marama ki te kaupapa o tana mahi: whakahaere BPF bytecode hei ture iptables. Ka taea e koe te hanga ture hou, hei tauira, penei:

iptables -A INPUT -m bpf --bytecode <байткод> -j LOG

konei <байткод> - koinei te waehere kei roto i te whakatakotoranga putanga assembler bpf_asm taunoa, hei tauira,

$ cat /tmp/test.bpf
ldb [9]
jneq #17, ignore
ret #1
ignore: ret #0

$ bpf_asm /tmp/test.bpf
4,48 0 0 9,21 0 1 17,6 0 0 1,6 0 0 0,

# iptables -A INPUT -m bpf --bytecode "$(bpf_asm /tmp/test.bpf)" -j LOG

I tenei tauira kei te taraihia e matou nga paanui UDP katoa. Horopaki mo te hotaka BPF i roto i tetahi kōwae xt_bpf, o te akoranga, tohu ki nga raraunga paatete, i roto i te take o iptables, ki te timatanga o te pane IPv4. Whakahoki uara mai i te kaupapa BPF booleante wahi false te tikanga kaore i taurite te paakete.

Ko te marama e te kōwae xt_bpf e tautoko ana i nga whiriwhiringa uaua ake i te tauira i runga ake nei. Kia titiro tatou ki nga tauira pono mai i Cloudfare. No na tata nei i whakamahia e ratou te waahanga xt_bpf hei tiaki i nga whakaeke DDoS. I roto i te tuhinga Te whakauru i nga Utauta BPF ka whakamarama ratou me pehea (me te aha) ka whakaputa i nga whiriwhiringa BPF me te whakaputa hononga ki te huinga taputapu mo te hanga i aua whiriwhiringa. Hei tauira, te whakamahi i te whaipainga bpfgen ka taea e koe te hanga i tetahi kaupapa BPF e taurite ana ki te patai DNS mo tetahi ingoa 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

I roto i te kaupapa ka utaina tuatahi ki te rehita X timatanga o te wahitau raina x04habrx03comx00 i roto i te mahere raraunga UDP ka tirohia te tono: 0x04686162 <-> "x04hab" me te pera.

He iti nei i muri mai, ka whakaputaina e Cloudfare te p0f -> BPF compiler code. I roto i te tuhinga Te whakauru i te p0f BPF compiler ka korero ratou he aha te p0f me pehea te huri i nga hainatanga p0f ki te BPF:

$ ./bpfgen p0f -- 4:64:0:0:*,0::ack+:0
39,0 0 0 0,48 0 0 8,37 35 0 64,37 0 34 29,48 0 0 0,
84 0 0 15,21 0 31 5,48 0 0 9,21 0 29 6,40 0 0 6,
...

I tenei wa kua kore e whakamahi Cloudfare xt_bpf, mai i to ratou neke ki XDP - tetahi o nga whiringa mo te whakamahi i te putanga hou o BPF, tirohia. L4Drop: XDP DDoS Whakaiti.

cls_bpf

Ko te tauira whakamutunga o te whakamahi i te BPF matarohia i roto i te pata ko te whakarōpū cls_bpf mo te punaha whakahaere waka i Linux, i taapiri atu ki te Linux i te mutunga o te tau 2013 me te whakakapi i nga tikanga o mua. cls_u32.

Heoi, e kore matou e korero inaianei mo te mahi cls_bpf, mai i te tirohanga o te matauranga mo te BPF matarohia e kore tenei e hoatu ki a matou - kua mohio matou ki nga mahi katoa. I tua atu, i roto i nga tuhinga e whai ake nei e korero ana mo te BPF Whakanuia, ka tutaki tatou ki tenei whakarōpūtanga neke atu i te kotahi.

Ko tetahi atu take kia kaua e korero mo te whakamahi BPF matarohia c cls_bpf Ko te raru, ka whakatauritea ki te BPF Whakanuia, he tino whakawhäitihia te whänuitanga o te whakamahi i roto i tenei keehi: kaore e taea e nga kaupapa puāwai te whakarereke i nga ihirangi o nga kete me te kore e taea te tiaki i te ahua i waenga i nga waea.

No reira kua tae ki te wa ki te poroporoaki ki te BPF matarohia me te titiro whakamua.

Poroporoaki ki te BPF matarohia

I titiro matou ki te pehea o te hangarau BPF, i whakawhanakehia i te timatanga o nga tau iwa tekau, i noho angitu mo te hauwha o te rau tau, tae noa ki te mutunga ka kitea nga tono hou. Heoi ano, he rite ki te whakawhiti mai i nga miihini puranga ki te RISC, i mahi hei whakaohooho mo te whanaketanga o te BPF matarohia, i nga tau 32 he whakawhiti mai i nga miihini 64-bit ki nga miihini XNUMX-bit ka timata te BPF matarohia ki te ngaro. I tua atu, he iti rawa nga kaha o te BPF matarohia, me te taapiri atu ki te hoahoanga tawhito - kaore matou i te kaha ki te whakaora i te kawanatanga i waenga i nga piiraa ki nga kaupapa BPF, kaore he waahi o te taunekeneke a te kaiwhakamahi, kaore he waahi o te taunekeneke. me te pata, engari mo te panui i te iti o nga waahanga hanganga sk_buff me te whakarewa i nga mahi kaiawhina ngawari rawa atu, kaore e taea e koe te whakarereke i nga ihirangi o nga paatete ka tukuna ano.

Inaianei, ko nga mea katoa e toe ana o te BPF matarohia i Linux ko te atanga API, kei roto i te kernel nga kaupapa matarohia katoa, ahakoa he whiriwhiringa turanga, he whiriwhiringa seccomp ranei, he mea whakamaori aunoa ki te whakatakotoranga hou, BPF Whakaroa. (Ka korero tatou mo te ahuatanga o tenei i roto i te tuhinga ka whai ake.)

I timata te whakawhiti ki te hoahoanga hou i te tau 2013, i te wa i whakaarohia e Alexey Starovoitov he kaupapa whakahou BPF. I te tau 2014 nga papa e rite ana ka timata te puta i roto i te matua. Ki taku mohio, ko te mahere tuatahi ko te arotau anake i te hoahoanga me te kaitoha JIT kia pai ake te whakahaere i runga i nga miihini 64-bit, engari ko enei arotautanga i tohu te timatanga o te upoko hou mo te whanaketanga Linux.

Ko etahi atu tuhinga o tenei raupapa ka kapi i te hoahoanga me nga whakamahinga o te hangarau hou, i mohiotia i te tuatahi ko te BPF o roto, katahi ko te BPF whakaroa, inaianei ko te BPF noa.

tohutoro

  1. Steven McCanne raua ko Van Jacobson, "Te BSD Packet Filter: A New Architecture for User-level Packet Capture", https://www.tcpdump.org/papers/bpf-usenix93.pdf
  2. Steven McCanne, "libpcap: He Hangahanga me te Tikanga Arotau mo te Hopu Pakete", https://sharkfestus.wireshark.org/sharkfest.11/presentations/McCanne-Sharkfest'11_Keynote_Address.pdf
  3. tcpdump, libpcap: https://www.tcpdump.org/
  4. IPtable U32 Match Tutorial.
  5. BPF - te waehere paita kua warewarehia: https://blog.cloudflare.com/bpf-the-forgotten-bytecode/
  6. Te whakauru i te Utauta BPF: https://blog.cloudflare.com/introducing-the-bpf-tools/
  7. bpf_cls: http://man7.org/linux/man-pages/man8/tc-bpf.8.html
  8. He tirohanga poto: https://lwn.net/Articles/656307/
  9. https://github.com/torvalds/linux/blob/master/Documentation/userspace-api/seccomp_filter.rst
  10. habr: Ipu me te haumarutanga: seccomp
  11. habr: Te wehe i nga daemon me te systemd ranei "kaore koe e hiahia ki a Docker mo tenei!"
  12. Paul Chaignon, "strace --seccomp-bpf: he titiro i raro i te hood", https://fosdem.org/2020/schedule/event/debugging_strace_bpf/
  13. netsniff-ng: http://netsniff-ng.org/

Source: will.com

Tāpiri i te kōrero