Ny teknolojia eXpress Data Path (XDP) dia mamela ny fanodinana ny fifamoivoizana kisendrasendra atao amin'ny interface Linux alohan'ny hidiran'ny fonosana ao amin'ny tamba-jotra kernel. Fampiharana XDP - fiarovana amin'ny fanafihana DDoS (CloudFlare), sivana sarotra, fanangonana antontan'isa (Netflix). Ny programa XDP dia tanterahin'ny milina virtoaly eBPF, noho izany dia misy famerana ny kaody sy ny fiasan'ny kernel misy arakaraka ny karazana sivana.
Ny lahatsoratra dia natao hamenoana ny tsy fahampian'ny fitaovana maro ao amin'ny XDP. Voalohany, manome kaody efa vonona izy ireo izay mandingana avy hatrany ny endri-javatra XDP: voaomana amin'ny fanamarinana na tsotra loatra ka miteraka olana. Rehefa manandrana manoratra ny kaodinao avy amin'ny scratch ianao, dia tsy fantatrao izay tokony hatao amin'ny fahadisoana mahazatra. Faharoa, ny fomba fitiliana XDP eo an-toerana tsy misy VM sy fitaovana dia tsy voarakotra, na dia manana ny fandrika manokana aza izy ireo. Ny lahatsoratra dia natao ho an'ny mpandrindra zatra amin'ny tambajotra sy Linux izay liana amin'ny XDP sy eBPF.
Amin'ity ampahany ity dia ho azontsika amin'ny antsipiriany ny fomba fanangonana ny sivana XDP sy ny fomba fitsapana azy, avy eo dia hanoratra dikan-teny tsotra amin'ny mekanika cookies SYN malaza amin'ny ambaratonga fanodinana fonosana. Mbola tsy hamorona βlisitra fotsyβ izahay
mpanjifa voamarina, mitazona kaontera ary mitantana ny sivana - diary ampy.
Hanoratra amin'ny C izahay - tsy lamaody izany, fa azo ampiharina. Ny kaody rehetra dia hita ao amin'ny GitHub amin'ny alΓ lan'ny rohy amin'ny farany ary mizara ho commits araka ny dingana voalaza ao amin'ny lahatsoratra.
Disclaimer. Mandritra ity lahatsoratra ity dia hamorona vahaolana kely aho mba hialana amin'ny fanafihana DDoS, satria asa tena misy ho an'ny XDP sy ny faritra misy ahy izany. Na izany aza, ny tena tanjona dia ny hahatakatra ny teknolojia; Ny kaody fampianarana dia tsy namboarina ary tsy misy nuances sasany.
XDP topimaso fohy
Ny hevi-dehibe ihany no hosoratako mba tsy handikana antontan-taratasy sy lahatsoratra efa misy.
Noho izany, ampidirina ao anaty kernel ny code sivana. Ampitaina amin'ny sivana ny fonosana miditra. Vokatr'izany dia tsy maintsy mandray fanapahan-kevitra ny sivana: ampidiro ao anaty kernel ny fonosana (XDP_PASS), mitete fonosana (XDP_DROP) na avereno (XDP_TX). Ny sivana dia afaka manova ny fonosana, tena marina izany XDP_TX. Azonao atao koa ny manafoana ny programa (XDP_ABORTED) ary avereno indray ny fonosana, fa mitovy izany assert(0) - ho an'ny debugging.
Ny milina virtoaly eBPF (Extended Berkley Packet Filter) dia natao ho tsotra mba hahafahan'ny kernel manamarina fa tsy mihodina ilay kaody ary tsy manimba ny fitadidian'ny olon-kafa. Fameperana sy fisavana mitambatra:
Voarara ny famoriana (mihemotra).
Misy stack ho an'ny angon-drakitra, fa tsy misy fiasa (ny fiasa C rehetra dia tsy maintsy ampidirina).
Voarara ny fidirana amin'ny fitadidiana ivelan'ny stack sy ny packet buffer.
Ny haben'ny kaody dia voafetra, saingy amin'ny fampiharana dia tsy dia misy dikany loatra izany.
Antso amin'ny asa kernel manokana (mpanampy eBPF) ihany no azo atao.
Toy izao ny famolavolana sy fametrahana sivana:
Source code (oh kernel.c) dia natambatra ho zavatra (kernel.o) ho an'ny rafitra milina virtoaly eBPF. Hatramin'ny Oktobra 2019, tohanan'i Clang ny fanangonana amin'ny eBPF ary nampanantenaina ao amin'ny GCC 10.1.
Raha toa ka misy antso amin'ny rafitra kernel (ohatra, tabilao sy kaontera) ity kaody zavatra ity, dia soloina aotra ny kaody misy azy, izay midika fa tsy azo tanterahina ny kaody toy izany. Alohan'ny hampidiranao ao amin'ny kernel dia mila soloinao ireo aotra ireo amin'ny ID ny zavatra manokana noforonina tamin'ny alΓ lan'ny antso kernel (rohy ny code). Azonao atao izany amin'ny fitaovana ivelany, na azonao atao ny manoratra programa izay hampifandray sy hampiditra sivana manokana.
Ny kernel dia manamarina ny programa feno. Ny tsy fisian'ny tsingerina sy ny tsy fahombiazana mihoatra ny fetran'ny fonosana sy ny stack dia voamarina. Raha tsy afaka manaporofo ny fanamarinana fa marina ny kaody, dia nolavina ny programa - mila afaka mampifaly azy ianao.
Aorian'ny fanamarinana mahomby, ny kernel dia manangona ny kaody object architecture eBPF ho lasa code machine ho an'ny architecture system (just-in-time).
Ny programa dia miraikitra amin'ny interface ary manomboka manodina fonosana.
Satria ny XDP dia mandeha ao amin'ny kernel, ny debugging dia atao amin'ny alΓ lan'ny trace logs ary, raha ny marina, ny fonosana izay sivana na ateraky ny programa. Na izany aza, ny eBPF dia miantoka fa ny kaody alaina dia azo antoka ho an'ny rafitra, mba hahafahanao manandrana XDP mivantana amin'ny Linux eo an-toerana.
Fanomanana ny tontolo iainana
fiangonana
Clang dia tsy afaka mamokatra mivantana kaody ho an'ny maritrano eBPF, noho izany dia misy dingana roa ny dingana:
Manangona kaody C amin'ny LLVM bytecode (clang -emit-llvm).
Ampifamadiho ny bytecode ho kaody zavatra eBPF (llc -march=bpf -filetype=obj).
Rehefa manoratra sivana dia ilaina ny rakitra roa miaraka amin'ny fiasa fanampiny sy macro avy amin'ny fitsapana kernel. Zava-dehibe ny mifanandrify amin'ny version kernel (KVER). Download azy ireo amin'ny helpers/:
CFLAGS mampifandray lahatahiry misy lohapejy fanampiny ary lahatahiry maromaro misy lohapejy kernel. marika famantarana __KERNEL__ midika fa ny lohatenin'ny UAPI (userspace API) dia voafaritra ho an'ny kaody kernel, satria ny sivana dia tanterahina ao amin'ny kernel.
Ny fiarovana amin'ny stack dia mety ho kilemaina (-fno-stack-protector), satria ny mpanamarina kaody eBPF dia mbola manara-maso ny fanitsakitsahana tsy misy fetra. Mendrika ny hamadika ny fanatsarana avy hatrany, satria voafetra ny haben'ny bytecode eBPF.
Andeha isika hanomboka amin'ny sivana izay mandalo ny fonosana rehetra ary tsy manao na inona na inona:
ekipa make manangona xdp_filter.o. Aiza no hanandrana azy izao?
Fijoroana fitsapana
Ny fijoroana dia tsy maintsy misy fifandraisana roa: izay hisy sivana ary avy aiza no handefasana fonosana. Ireo dia tsy maintsy fitaovana Linux feno miaraka amin'ny IP-ny manokana mba hanamarinana ny fomba fiasan'ny fampiharana mahazatra amin'ny sivana.
Ireo fitaovana amin'ny karazana veth (Ethernet virtoaly) dia mety ho antsika: ireo dia fifandraisana virtoaly roa "mifandray" mivantana amin'ny tsirairay. Azonao atao ny mamorona azy ireo toy izao (amin'ity fizarana ity ny baiko rehetra ip dia tanterahina avy root):
ip link add xdp-remote type veth peer name xdp-local
izany xdp-remote ΠΈ xdp-local - anaran'ny fitaovana. On xdp-local (192.0.2.1/24) hasiana sivana, miaraka amin'ny xdp-remote (192.0.2.2/24) ny fifamoivoizana miditra dia halefa. Na izany aza, misy ny olana: ny interface dia eo amin'ny milina iray ihany, ary ny Linux dia tsy handefa fifamoivoizana amin'ny iray amin'izy ireo amin'ny iray hafa. Azonao atao ny mamaha izany amin'ny fitsipika sarotra iptables, fa tsy maintsy manova fonosana izy ireo, izay tsy mety amin'ny debugging. Tsara kokoa ny mampiasa ny anaran'ny tambajotra (netns).
Ny espace anaran-tambajotra dia misy andiana interface tsara, tabilao zotra ary fitsipika NetFilter izay mitokana amin'ny zavatra mitovy amin'ny netns hafa. Ny dingana tsirairay dia mandeha amin'ny toerana misy anarana ary tsy misy afa-tsy ireo zavatra ao amin'io netns io. Amin'ny alΓ lan'ny default, ny rafitra dia manana sehatra anaran-tambajotra tokana ho an'ny zavatra rehetra, ka afaka miasa amin'ny Linux ianao ary tsy mahafantatra momba ny netns.
Andao hamorona sehatra anarana vaovao xdp-test ary afindrao any xdp-remote.
ip netns add xdp-test
ip link set dev xdp-remote netns xdp-test
Avy eo dia mandeha ny dingana xdp-test, tsy "hahita" xdp-local (hijanona ao amin'ny netns izany raha default) ary rehefa mandefa fonosana amin'ny 192.0.2.1 dia handalo izany xdp-remotesatria io no hany interface tsara amin'ny 192.0.2.0/24 azo idirana amin'ity dingana ity. Izany koa dia miasa amin'ny lalana mifanohitra.
Rehefa mifindra eo anelanelan'ny netns dia midina ny interface ary very ny adiresiny. Mba hanitsiana ny interface amin'ny netns dia mila mihazakazaka ianao ip ... ao amin'ity namespace baiko ity ip netns exec:
ip netns exec xdp-test
ip address add 192.0.2.2/24 dev xdp-remote
ip netns exec xdp-test
ip link set xdp-remote up
Araka ny hitanao dia tsy misy hafa amin'ny toe-javatra izany xdp-local ao amin'ny toeran'ny anarana default:
ip address add 192.0.2.1/24 dev xdp-local
ip link set xdp-local up
Raha mihazakazaka ianao tcpdump -tnevi xdp-local, hitanao fa ny fonosana nalefa avy amin'ny xdp-test, dia alefa amin'ity interface ity:
ip netns exec xdp-test ping 192.0.2.1
Mety tsara ny mampiditra akorandriaka xdp-test. Ny tahiry dia manana script izay mandeha ho azy amin'ny fijoroana ohatra, azonao atao ny manamboatra ny fijoroana miaraka amin'ny baiko sudo ./stand up ary vonoy izany sudo ./stand down.
hay fantarina
Ny sivana dia mifandray amin'ny fitaovana toy izao:
ip -force link set dev xdp-local xdp object xdp_filter.o verbose
manan-danja -force mila mampifandray programa vaovao raha toa ka efa mifandray ny iray hafa. "Tsy misy vaovao dia vaovao tsara" dia tsy momba an'io baiko io, ny fehin-kevitra dia be dia be amin'ny tranga rehetra. manondro verbose azo atao, fa miaraka amin'izany dia misy tatitra momba ny asan'ny mpanamarina kaody miaraka amin'ny lisitry ny fivoriambe:
Verifier analysis:
0: (b7) r0 = 2
1: (95) exit
Esory ny programa amin'ny interface:
ip link set dev xdp-local xdp off
Ao amin'ny script ireo dia baiko sudo ./stand attach ΠΈ sudo ./stand detach.
Amin'ny fametahana sivana dia azonao antoka izany ping mitohy mandeha, fa miasa ve ny programa? Andeha isika hanampy lozisialy. asa bpf_trace_printk() mitovy amin'ny printf(), fa tsy manohana afa-tsy tohan-kevitra telo ankoatry ny lamina, ary lisitra voafetra amin'ny famaritana. Makro bpf_printk() manamora ny antso.
Ny zava-misy dia ny programa eBPF dia tsy manana fizarana angon-drakitra, ka ny hany fomba hametahana tady format dia ny tohan-kevitra avy hatrany amin'ny baiko VM:
Noho izany antony izany, ny famoahana debug dia manenika ny kaody aterany.
Mandefa fonosana XDP
Andao hanova ny sivana: avelao izy hamerina ny fonosana rehetra miditra. Tsy mety izany amin'ny fomba fijerin'ny tambajotra, satria ilaina ny manova ny adiresy ao amin'ny lohapejy, fa ankehitriny ny asa amin'ny foto-kevitra dia zava-dehibe.
fandefasana tcpdump amin'ny xdp-remote. Tokony hampiseho ICMP Echo Request mitovy ny mivoaka sy miditra ary ajanony ny fanehoana ICMP Echo Reply. Saingy tsy miseho izany. Hita fa noho ny asa XDP_TX ao amin'ny programa amin'ny xdp-localilainamankany amin'ny interface tsara xdp-remote nisy fandaharana koa nomena, na dia foana aza, ary izy no notezaina.
Ahoana no nahafantarako izany?
Araho ny lalan'ny fonosana iray ao anaty kernel Ny mekanika hetsika perf dia mamela, raha ny marina, mampiasa milina virtoaly mitovy, izany hoe, ny eBPF dia ampiasaina amin'ny famongorana miaraka amin'ny eBPF.
Tsy maintsy manao ny tsara amin'ny ratsy ianao, satria tsy misy zavatra hafa hivoahan'izany.
Raha ny ARP ihany no aseho, dia mila esorinao ny sivana (izany no sudo ./stand detach), Afoizo ping, dia mametraha sivana ary andramo indray. Ny olana dia ny sivana XDP_TX manankery na amin'ny ARP na raha ny stack
anaran-tsehatra xdp-test nahavita "manadino" ny adiresy MAC 192.0.2.1, tsy ho afaka hamaha ity IP ity.
Fanambarana olana
Andao hiroso amin'ilay asa voalaza: manorata mekanika cookies SYN amin'ny XDP.
Ny tondra-drano SYN dia mijanona ho fanafihana DDoS malaza, ary toy izao manaraka izao ny votoatiny. Rehefa vita ny fifandraisana (TCP handshake), dia mahazo SYN ny mpizara, manome loharano ho an'ny fifandraisana ho avy, mamaly amin'ny fonosana SYNACK ary miandry ACK. Mandefa fonosana SYN an'arivony isan-tsegondra fotsiny ny mpanafika avy amin'ny adiresy sandoka avy amin'ny mpampiantrano tsirairay ao anaty botnet an'arivony mahery. Ny mpizara dia voatery manome loharano avy hatrany rehefa tonga ny fonosana, fa mamoaka azy ireo aorian'ny fe-potoana lehibe, noho izany dia lany ny fahatsiarovana na ny fetra, tsy ekena ny fifandraisana vaovao, ary tsy misy ny serivisy;
Raha tsy manome loharano mifototra amin'ny fonosana SYN ianao, fa mamaly amin'ny fonosana SYNACK fotsiny, ahoana no ahafahan'ny mpizara hahatakatra fa ny fonosana ACK izay tonga taty aoriana dia manondro fonosana SYN izay tsy voavonjy? Rehefa dinihina tokoa, ny mpanafika dia afaka mamorona ACK sandoka ihany koa. Ny tanjona amin'ny cookie SYN dia ny fametahana azy seqnum fifandraisana masontsivana ho toy ny hash ny adiresy, seranan-tsambo sy ny fanovana sira. Raha nahavita tonga ny ACK talohan'ny niova ny sira, dia azonao atao ny manao kajy indray ny hash ary mampitaha azy acknum. Forge acknum ny mpanafika dia tsy afaka, satria ny sira dia ahitana ny tsiambaratelo, ary tsy hanam-potoana handaminana izany noho ny fantsona voafetra.
Efa hatry ny ela no nampiharina tao amin'ny kernel Linux ny cookie SYN ary azo alefa ho azy mihitsy aza raha tonga haingana sy be dia be ny SYN.
Fandaharana fanabeazana momba ny fifampikasohana TCP
Ny TCP dia manome fifindran'ny angona ho toy ny onjam-bytes, ohatra, ny fangatahana HTTP dia alefa amin'ny TCP. Ampitaina amin'ny ampahany amin'ny fonosana ny renirano. Ny fonosana TCP rehetra dia manana saina lojika sy laharana 32-bit:
Ny fitambaran'ny saina no mamaritra ny andraikitry ny fonosana iray manokana. Ny saina SYN dia manondro fa ity no fonosan'ny mpandefa voalohany amin'ny fifandraisana. Ny saina ACK dia midika fa ny mpandefa dia nahazo ny angon-drakitra fifandraisana rehetra hatramin'ny byte acknum. Ny fonosana dia afaka manana saina maromaro ary antsoina amin'ny fitambarany, ohatra, fonosana SYNACK.
Ny laharan'ny filaharana (seqnum) dia mamaritra ny offset ao amin'ny stream data ho an'ny byte voalohany ampitaina amin'ity fonosana ity. Ohatra, raha ao amin'ny fonosana voalohany misy angona X bytes io isa io dia N, amin'ny fonosana manaraka misy angona vaovao dia N+X izany. Eo am-piandohan'ny fifandraisana dia mifidy an'io isa io ny andaniny tsirairay.
Laharana fankasitrahana (acknum) - mitovy ny offset amin'ny seqnum, saingy tsy mamaritra ny isan'ny byte alefa, fa ny isan'ny byte voalohany avy amin'ny mpandray, izay tsy hitan'ny mpandefa.
Amin'ny fiandohan'ny fifandraisana dia tsy maintsy manaiky ny andaniny seqnum ΠΈ acknum. Ny mpanjifa dia mandefa fonosana SYN miaraka amin'ny seqnum = X. Mamaly amin'ny fonosana SYNACK ny mpizara, izay mirakitra ny azy seqnum = Y ary mampiharihary acknum = X + 1. Ny mpanjifa dia mamaly ny SYNACK amin'ny fonosana ACK, izay seqnum = X + 1, acknum = Y + 1. Aorian'izany dia manomboka ny famindrana angon-drakitra tena izy.
Raha tsy manaiky ny fandraisany ny fonosana ny mpiara-mianatra, dia alefan'ny TCP izany rehefa tapitra ny fotoana.
Nahoana no tsy ampiasaina foana ny cookies SYN?
Voalohany, raha very ny SYNACK na ACK dia tsy maintsy miandry ny fandefasana azy indray ianao - hihena ny fametrahana ny fifandraisana. Faharoa, ao amin'ny fonosana SYN - ary ao anatiny ihany! - safidy maromaro no ampitaina izay misy fiantraikany amin'ny fampandehanana bebe kokoa ny fifandraisana. Raha tsy tsaroana ny fonosana SYN ho avy, dia tsy miraharaha ireo safidy ireo ny mpizara; Ny TCP dia afaka miasa amin'ity tranga ity, fa farafaharatsiny amin'ny dingana voalohany dia hihena ny kalitaon'ny fifandraisana.
Avy amin'ny fomba fijery fonosana, ny programa XDP dia tsy maintsy manao izao manaraka izao:
mamaly SYN miaraka amin'ny SYNACK miaraka amin'ny cookie;
One (*) Ny teboka izay ilainao hitantana ny toetry ny rafitra dia voamarika - amin'ny dingana voalohany azonao atao tsy misy azy ireo amin'ny fampiharana tsotra TCP tΓ nana miaraka amin'ny famokarana cookie SYN ho seqnum.
Eo an-toerana (**), na dia tsy manana latabatra aza isika dia handalo ny fonosana.
Fampiharana TCP handshake
Famaritana ny fonosana ary manamarina ny code
Mila rafitra lohatenin'ny tambajotra izahay: Ethernet (uapi/linux/if_ether.h), IPv4 (uapi/linux/ip.h) sy TCP (uapi/linux/tcp.h). Tsy afaka nampifandray ity farany aho noho ny fahadisoana mifandraika amin'ny atomic64_t, Tsy maintsy nandika ny famaritana ilaina tao amin'ny kaody aho.
Ny fiasa rehetra asongadina ao amin'ny C ho mora vakina dia tsy maintsy ampidirina amin'ny toerana iantsoana, satria ny verifier eBPF ao amin'ny kernel dia mandrara ny fiverenana, izany hoe, raha ny marina, ny antso an-tariby sy ny asa.
Macro LOG() manakana ny fanontana amin'ny fananganana famoahana.
Ny programa dia conveyor ny asa. Ny tsirairay dia mahazo fonosana iray ahitana ny lohatenin'ny ambaratonga mifanaraka amin'izany, ohatra, process_ether() manantena ny ho feno ether. Miorina amin'ny valin'ny famakafakana an-tsaha, ny fiasa dia afaka mampita ny fonosana mankany amin'ny ambaratonga ambony. Ny vokatry ny asa dia ny hetsika XDP. Amin'izao fotoana izao, ny mpandrindra SYN sy ACK dia mandalo ny fonosana rehetra.
Misarika ny sainao amin'ny seky misy marika A sy B aho. Raha maneho hevitra A ianao dia hiorina ny programa, saingy hisy hadisoana fanamarinana rehefa mampiditra:
izay milaza mazava fa ny olana ether. Ho toy izao foana izany.
Valio ny SYN
Ny tanjona amin'ity dingana ity dia ny hamorona fonosana SYNACK marina miaraka amin'ny raikitra seqnum, izay hosoloina cookie SYN amin'ny ho avy. Miseho ao amin'ny process_tcp_syn() sy ny manodidina.
Fanamarinana fonosana
Hafahafa ihany, ity ny andalana miavaka indrindra, na ny marimarina kokoa, ny fanehoan-kevitra momba azy:
Rehefa nanoratra ny dikan-teny voalohany amin'ny kaody dia nampiasaina ny kernel 5.1, ho an'ny fanamarinana izay misy fahasamihafana eo amin'ny data_end ΠΈ (const void*)ctx->data_end. Tamin'ny fotoana nanoratana dia tsy nanana io olana io ny kernel 5.3.1. Mety ho tsy mitovy amin'ny saha ny fidirana amin'ny variable eo an-toerana ny compiler. Ny fitsipi-pitondran-tena: rehefa lehibe ny akany, dia afaka manampy ny fanatsorana ny kaody.
Manaraka izany dia ny fisavana ny halavany mahazatra ho an'ny voninahitry ny mpanamarina; O MAX_CSUM_BYTES eto ambany.
Ampifamadiho ny seranan-tsambo TCP, adiresy IP ary adiresy MAC. Ny tranomboky mahazatra dia tsy azo idirana amin'ny programa XDP, noho izany memcpy() - macro izay manafina ny intrinsics Clang.
Ny fanamarinana IPv4 sy TCP dia mitaky ny fampidirana ny teny 16-bit rehetra ao amin'ny lohapejy, ary ny haben'ny lohapejy dia voasoratra ao anatiny, izany hoe, tsy fantatra amin'ny fotoana fanangonana. Olana ity satria tsy hitsipaka ny tadivavarana mahazatra mankany amin'ny fari-piadidiana ny mpanamarina. Saingy voafetra ny haben'ny lohapejy: hatramin'ny 64 bytes ny tsirairay. Azonao atao ny manao tadivavarana miaraka amin'ny famerimberenana maromaro, izay mety hifarana aloha.
Marihiko fa misy RFC 1624 momba ny fomba famerenana amin'ny ampahany ny checksum raha ny teny raikitra amin'ny fonosana ihany no ovaina. Na izany aza, ny fomba dia tsy manerana izao rehetra izao, ary ny fampiharana dia ho sarotra kokoa ny mihazona.
Asa kajy checksum:
#define MAX_CSUM_WORDS 32
#define MAX_CSUM_BYTES (MAX_CSUM_WORDS * 2)
INTERNAL u32
sum16(const void* data, u32 size, const void* data_end) {
u32 s = 0;
#pragma unroll
for (u32 i = 0; i < MAX_CSUM_WORDS; i++) {
if (2*i >= size) {
return s; /* normal exit */
}
if (data + 2*i + 1 + 1 > data_end) {
return 0; /* should be unreachable */
}
s += ((const u16*)data)[i];
}
return s;
}
NA size voamarina amin'ny alΓ lan'ny kaody fiantsoana, ilaina ny fepetra fivoahana faharoa mba ahafahan'ny mpanamarina manaporofo ny fahavitan'ny loop.
Ho an'ny teny 32-bit, misy dikan-teny tsotra kokoa:
INTERNAL u32
sum16_32(u32 v) {
return (v >> 16) + (v & 0xffff);
}
Raha ny marina dia mamerina ny checksum ary mamerina ny fonosana:
Amin'ny fomba fijery XDP, ny fanamarinana dia tsy misy dikany. Ny algorithm amin'ny kajy dia voalohany ary azo inoana fa mora voan'ny mpanafika be pitsiny. Ny kernel Linux, ohatra, dia mampiasa ny kriptografika SipHash, fa ny fampiharana azy ho an'ny XDP dia mazava ho azy fa mihoatra ny faritr'ity lahatsoratra ity.
Nampidirina ho an'ny TODO vaovao mifandraika amin'ny fifandraisana ivelany:
Ny programa XDP dia tsy afaka mitahiry cookie_seed (ny ampahany miafina amin'ny sira) amin'ny fari-piainana manerantany, mila fitehirizana ao amin'ny kernel ianao, izay havaozina tsindraindray avy amin'ny mpamokatra azo itokisana.
Raha mifanaraka amin'ny fonosana ACK ny cookie SYN dia tsy mila manonta hafatra ianao, fa tadidio ny IP an'ny mpanjifa voamarina mba hanohizana ny fandefasana fonosana avy aminy.
Na dia tsy misy lisitry ny IP voamarina aza, dia tsy hisy fiarovana amin'ny tondra-drano SYN mihitsy, fa ity ny fanehoan-kevitra momba ny tondra-drano ACK natomboka tamin'ity baiko manaraka ity:
sudo ip netns exec xdp-test hping3 --flood -A -s 1111 -p 2222 192.0.2.1
Indraindray ny eBPF amin'ny ankapobeny sy ny XDP manokana dia aseho bebe kokoa amin'ny maha-fitaovan'ny mpitantana mandroso fa tsy amin'ny sehatra fampandrosoana. Raha ny marina, ny XDP dia fitaovana hanakanana ny fanodinana ny fonosana amin'ny alΓ lan'ny kernel, fa tsy safidy ho an'ny stack kernel, toy ny DPDK sy ny safidy bypass kernel hafa. Amin'ny lafiny iray, ny XDP dia mamela anao hampihatra lojika saro-takarina, izay, ankoatra izany, dia mora havaozina tsy misy fanelingelenana amin'ny fanodinana ny fifamoivoizana. Ny mpanamarina dia tsy miteraka olana lehibe ho an'ny tena manokana, tsy mandΓ izany aho amin'ny ampahany amin'ny codespace mpampiasa.
Ao amin'ny tapany faharoa, raha mahaliana ny lohahevitra, dia hamita ny latabatry ny mpanjifa voamarina sy ny fahatapahan-jiro izahay, hampihatra ny kaontera ary hanoratra fampiasa amin'ny sehatry ny mpampiasa hitantana ny sivana.