Storja dwar pakketti DNS nieqsa mill-appoġġ tekniku tal-Google Cloud
Minn Google Blog Editor: Qatt ħsibt kif l-inġiniera ta’ Google Cloud Technical Solutions (TSE) jittrattaw it-talbiet ta’ appoġġ tiegħek? L-inġiniera ta' appoġġ tekniku tat-TSE huma responsabbli biex jidentifikaw u jikkoreġu sorsi ta' problemi rrappurtati mill-utent. Xi wħud minn dawn il-problemi huma pjuttost sempliċi, iżda xi drabi tiltaqa 'ma' biljett li jeħtieġ l-attenzjoni ta 'diversi inġiniera f'daqqa. F'dan l-artikolu, wieħed mill-impjegati tat-TSE se jgħidilna dwar problema waħda delikata ħafna mill-prattika reċenti tiegħu - każ ta' pakketti DNS nieqsa. F'din l-istorja, se naraw kif l-inġiniera rnexxielhom isolvu s-sitwazzjoni, u x'affarijiet ġodda tgħallmu waqt li rranġaw l-iżball. Nittamaw li din l-istorja mhux biss tedukek dwar bug fil-fond, iżda wkoll tagħtik ħarsa lejn il-proċessi li jidħlu fil-preżentata ta 'biljett ta' appoġġ ma 'Google Cloud.
Is-soluzzjoni tal-problemi hija kemm xjenza kif ukoll arti. Kollox jibda bil-bini ta 'ipoteżi dwar ir-raġuni għall-imġieba mhux standard tas-sistema, u wara tiġi ttestjata għas-saħħa. Madankollu, qabel ma nifformulaw ipoteżi, irridu niddefinixxu b'mod ċar u nifformulaw il-problema b'mod preċiż. Jekk il-mistoqsija tinstema' vaga wisq, allura jkollok tanalizza kollox bir-reqqa; Din hija l-"arti" tas-soluzzjoni tal-problemi.
Taħt Google Cloud, proċessi bħal dawn isiru b'mod esponenzjali aktar kumplessi, peress li Google Cloud jagħmel minn kollox biex jiggarantixxi l-privatezza tal-utenti tiegħu. Minħabba dan, l-inġiniera tat-TSE m'għandhomx aċċess biex jeditjaw is-sistemi tiegħek, u lanqas il-kapaċità li jaraw il-konfigurazzjonijiet b'mod wiesa' daqs kemm jagħmlu l-utenti. Għalhekk, biex nittestjaw kwalunkwe waħda mill-ipoteżi tagħna, aħna (inġiniera) ma nistgħux nimmodifikaw is-sistema malajr.
Xi utenti jemmnu li aħna se nirranġaw kollox bħal mekkaniks f'servizz tal-karozzi, u sempliċiment nibagħtulna l-id ta 'magna virtwali, filwaqt li fir-realtà l-proċess iseħħ f'format ta' konversazzjoni: ġbir ta 'informazzjoni, formazzjoni u konferma (jew tiċħad) ipoteżijiet, u, fl-aħħar, deċiżjoni problemi huma bbażati fuq il-komunikazzjoni mal-klijent.
Problema in kwistjoni
Illum għandna storja bi tmiem tajjeb. Waħda mir-raġunijiet għar-riżoluzzjoni b'suċċess tal-każ propost hija deskrizzjoni dettaljata u preċiża ħafna tal-problema. Hawn taħt tista' tara kopja tal-ewwel biljett (editjat biex taħbi informazzjoni kunfidenzjali):
Dan il-messaġġ fih ħafna informazzjoni utli għalina:
VM speċifiku speċifikat
Il-problema nnifisha hija indikata - DNS ma jaħdimx
Huwa indikat fejn il-problema timmanifesta ruħha - VM u kontenitur
Il-passi li l-utent ħa biex jidentifika l-problema huma indikati.
It-talba ġiet irreġistrata bħala "P1: Impatt Kritiku - Servizz mhux użat fil-produzzjoni", li jfisser monitoraġġ kostanti tas-sitwazzjoni 24/7 skont l-iskema "Segwi x-Xemx" (tista 'taqra aktar dwar prijoritajiet tat-talbiet tal-utenti), bit-trasferiment tiegħu minn tim ta' appoġġ tekniku għal ieħor ma' kull bidla fiż-żona tal-ħin. Fil-fatt, meta l-problema laħqet it-tim tagħna fi Zurich, hija kienet diġà dawwar id-dinja. Sa dan iż-żmien, l-utent kien ħa miżuri ta 'mitigazzjoni, iżda kien jibża' ta 'repetizzjoni tas-sitwazzjoni fil-produzzjoni, peress li l-kawża ewlenija kienet għadha ma ġietx skoperta.
Sakemm il-biljett wasal Zurich, diġà kellna l-informazzjoni li ġejja:
Kontenut /etc/hosts
Kontenut /etc/resolv.conf
Output iptables-save
Immontat mit-tim ngrep fajl pcap
B'din id-dejta, konna lesti li nibdew il-fażi ta '"investigazzjoni" u soluzzjoni tal-problemi.
L-ewwel passi tagħna
L-ewwelnett, aħna ċċekkjaw ir-reġistri u l-istatus tas-server tal-metadejta u għamilna ċert li kien qed jaħdem b'mod korrett. Is-server tal-metadata jirrispondi għall-indirizz IP 169.254.169.254 u, fost affarijiet oħra, huwa responsabbli għall-kontroll tal-ismijiet tad-dominju. Ivverifikajna wkoll li l-firewall jaħdem sew mal-VM u ma jimblokkax il-pakketti.
Kienet xi tip ta 'problema stramba: il-kontroll nmap ċaħdet l-ipoteżi ewlenija tagħna dwar it-telf ta' pakketti UDP, għalhekk mentalment ħriġna b'diversi għażliet u modi oħra biex niċċekkjawhom:
Il-pakketti jintefgħu b'mod selettiv? => Iċċekkja r-regoli tal-iptables
Mhux żgħir wisq? MTU? => Iċċekkja l-output ip a show
Il-problema taffettwa biss pakketti UDP jew TCP ukoll? => Issuq 'il bogħod dig +tcp
Il-pakketti ġġenerati minn dig jintbagħtu lura? => Issuq 'il bogħod tcpdump
Il-libdns qed jaħdem sew? => Issuq 'il bogħod strace biex tiċċekkja t-trażmissjoni tal-pakketti fiż-żewġ direzzjonijiet
Hawnhekk aħna niddeċiedu li nsejħu lill-utent biex issolvi l-problemi ħajjin.
Waqt is-sejħa nistgħu niċċekkjaw diversi affarijiet:
Wara diversi kontrolli neskludu r-regoli tal-iptables mil-lista tar-raġunijiet
Aħna niċċekkjaw l-interfaces tan-netwerk u t-tabelli tar-routing, u niċċekkjaw darbtejn li l-MTU huwa korrett
Niskopru dan dig +tcp google.com (TCP) jaħdem kif suppost, iżda dig google.com (UDP) ma taħdimx
Wara li saq tcpdump għadu jaħdem dig, insibu li l-pakketti UDP qed jintbagħtu lura
Aħna nsuqu strace dig google.com u naraw kif ħaffer b'mod korrett sejħiet sendmsg() и recvms(), madankollu t-tieni waħda hija interrotta minn timeout
Sfortunatament, it-tmiem tax-xift jasal u aħna mġiegħla neskala l-problema għaż-żona tal-ħin li jmiss. It-talba, madankollu, qajmet interess fit-tim tagħna, u kollega jissuġġerixxi li jinħoloq il-pakkett DNS inizjali bl-użu tal-modulu Python scrapy.
from scapy.all import *
answer = sr1(IP(dst="169.254.169.254")/UDP(dport=53)/DNS(rd=1,qd=DNSQR(qname="google.com")),verbose=0)
print ("169.254.169.254", answer[DNS].summary())
Dan il-framment joħloq pakkett DNS u jibgħat it-talba lis-server tal-metadata.
L-utent imexxi l-kodiċi, ir-rispons tad-DNS jintbagħat lura, u l-applikazzjoni tirċeviha, u tikkonferma li m'hemm l-ebda problema fil-livell tan-netwerk.
Wara "vjaġġ madwar id-dinja" ieħor, it-talba terġa 'lura lit-tim tagħna, u nittrasferiha kompletament lili nnifsi, naħseb li se jkun aktar konvenjenti għall-utent jekk it-talba tieqaf iddur minn post għall-ieħor.
Sadanittant, l-utent ġentilment jaqbel li jipprovdi stampa tal-immaġni tas-sistema. Din hija aħbar tajba ħafna: il-kapaċità li nittestja s-sistema jien stess tagħmel is-soluzzjoni tal-problemi ħafna aktar mgħaġġla, għax m'għadniex għalfejn nitlob lill-utent biex imexxi kmandi, ibgħatli r-riżultati u janalizzahom, nista' nagħmel kollox jien!
Il-kollegi tiegħi qed jibdew għirani ftit. Waqt l-ikla niddiskutu l-konverżjoni, imma ħadd ma għandu idea ta’ x’inhu għaddej. Fortunatament, l-utent innifsu diġà ħa miżuri biex itaffu l-konsegwenzi u m'għandu l-ebda għaġla, għalhekk għandna ħin biex nissekkjaw il-problema. U peress li għandna immaġini, nistgħu nwettqu kwalunkwe test li jinteressana. Kbir!
Jieħdu pass lura
Waħda mill-mistoqsijiet tal-intervisti l-aktar popolari għall-pożizzjonijiet ta 'inġinier tas-sistemi hija: "X'jiġri meta tagħmel ping www.google.com? Il-mistoqsija hija kbira, peress li l-kandidat jeħtieġ li jiddeskrivi kollox mill-qoxra sal-ispazju tal-utent, sal-kernel tas-sistema u mbagħad għan-netwerk. Nitbissem: kultant il-mistoqsijiet tal-intervisti jirriżultaw utli fil-ħajja reali...
Niddeċiedi li napplika din il-mistoqsija HR għal problema attwali. Bejn wieħed u ieħor, meta tipprova tiddetermina isem DNS, jiġri dan li ġej:
L-applikazzjoni ssejjaħ librerija tas-sistema bħal libdns
libdns jiċċekkja l-konfigurazzjoni tas-sistema lil liema server DNS għandu jikkuntattja (fid-dijagramma dan huwa 169.254.169.254, server tal-metadejta)
libdns juża sejħiet tas-sistema biex joħloq socket UDP (SOKET_DGRAM) u jibgħat pakketti UDP b'mistoqsija DNS fiż-żewġ direzzjonijiet
Permezz tal-interface sysctl tista 'tikkonfigura l-munzell UDP fil-livell tal-kernel
Il-qalba jinteraġixxi mal-ħardwer biex jittrasmetti pakketti fuq in-netwerk permezz tal-interface tan-netwerk
L-hypervisor jaqbad u jittrasmetti l-pakkett lis-server tal-metadata malli jikkuntattjah
Is-server tal-metadejta, bil-maġija tiegħu, jiddetermina l-isem tad-DNS u jirritorna tweġiba bl-użu tal-istess metodu
Ħa nfakkarkom liema ipoteżijiet diġà kkunsidrajna:
Ipotesi: Libreriji miksura
Test 1: run strace fis-sistema, iċċekkja li dig sejħiet is-sejħiet tas-sistema korretta
Riżultat: Sejħiet ta' sistema korretti jissejħu
Test 2: bl-użu ta 'srapy biex tivverifika jekk nistgħux niddeterminaw l-ismijiet li jaqbżu l-libreriji tas-sistema
Riżultat: nistgħu
Test 3: ħaddem rpm –V fuq il-pakkett libdns u l-fajls tal-librerija md5sum
Riżultat: il-kodiċi tal-librerija huwa kompletament identiku għall-kodiċi fis-sistema operattiva tax-xogħol
Test 4: mmunta l-immaġni tas-sistema tal-għeruq tal-utent fuq VM mingħajr din l-imġieba, mexxi chroot, ara jekk id-DNS jaħdem
Riżultat: DNS jaħdem b'mod korrett
Konklużjoni bbażata fuq testijiet: il-problema mhix fil-libreriji
Ipoteżi: Hemm żball fis-settings tad-DNS
Test 1: iċċekkja tcpdump u ara jekk il-pakketti DNS jintbagħtux u jintbagħtux lura b'mod korrett wara li tmexxi dig
Riżultat: il-pakketti huma trażmessi b'mod korrett
Test 2: verifika doppja fuq is-server /etc/nsswitch.conf и /etc/resolv.conf
Riżultat: kollox huwa korrett
Konklużjoni bbażata fuq testijiet: il-problema mhix bil-konfigurazzjoni tad-DNS
Ipotesi: qalba bil-ħsara
Test: installa kernel ġdid, iċċekkja l-firma, ibda mill-ġdid
Riżultat: imġieba simili
Konklużjoni bbażata fuq testijiet: il-qalba ma ssirx ħsara
Ipotesi: imġieba mhux korretta tan-netwerk tal-utent (jew interface tan-netwerk tal-hypervisor)
Test 1: Iċċekkja s-settings tal-firewall tiegħek
Riżultat: il-firewall jgħaddi pakketti DNS kemm fuq il-host kif ukoll fuq GCP
Test 2: interċetta t-traffiku u timmonitorja l-korrettezza tat-trażmissjoni u r-ritorn tat-talbiet tad-DNS
Riżultat: tcpdump jikkonferma li l-host irċieva pakketti ta' ritorn
Konklużjoni bbażata fuq testijiet: il-problema mhix fin-netwerk
Ipoteżi: is-server tal-metadata mhux qed jaħdem
Test 1: iċċekkja r-reġistri tas-server tal-metadejta għal anomaliji
Riżultat: m'hemm l-ebda anomalija fir-zkuk
Test 2: Bypass is-server tal-metadata permezz dig @8.8.8.8
Riżultat: Ir-riżoluzzjoni tinkiser anke mingħajr l-użu ta' server tal-metadata
Konklużjoni bbażata fuq testijiet: il-problema mhix mas-server tal-metadata
Il-linja tal-qiegħ: ittestjajna s-sottosistemi kollha ħlief settings tar-runtime!
Għaddas fis-Settings tar-Runtime Kernel
Biex tikkonfigura l-ambjent tal-eżekuzzjoni tal-kernel, tista 'tuża għażliet tal-linja tal-kmand (grub) jew l-interface sysctl. Fittixt /etc/sysctl.conf u ahseb biss, skoprejt diversi settings tad-dwana. Inħossni daqslikieku qbadt xi ħaġa, warrabt is-settings kollha mhux tan-netwerk jew mhux tcp, u bqajt mas-settings tal-muntanji net.core. Imbagħad mort fejn il-permessi tal-host kienu fil-VM u bdejt napplika s-settings wieħed wieħed, wieħed wara l-ieħor, bil-VM miksura, sakemm sibt il-ħati:
net.core.rmem_default = 2147483647
Hawn hu, konfigurazzjoni li tkisser id-DNS! Sibt l-arma tal-qtil. Imma dan għaliex qed jiġri? Għadni bżonn motiv.
Id-daqs bażiku tal-buffer tal-pakkett DNS huwa kkonfigurat permezz net.core.rmem_default. Valur tipiku huwa x'imkien madwar 200KiB, imma jekk is-server tiegħek jirċievi ħafna pakketti DNS, tista' tkun trid iżżid id-daqs tal-buffer. Jekk il-buffer ikun mimli meta jasal pakkett ġdid, pereżempju minħabba li l-applikazzjoni mhix qed tipproċessah malajr biżżejjed, allura tibda titlef il-pakketti. Il-klijent tagħna żied b'mod korrett id-daqs tal-buffer minħabba li kien jibża' mit-telf tad-dejta, peress li kien qed juża applikazzjoni għall-ġbir ta' metriċi permezz ta' pakketti DNS. Il-valur li waqqaf kien il-massimu possibbli: 231-1 (jekk issettjat għal 231, il-qalba se terġa 'lura "ARGUMENT INVALID").
F'daqqa waħda indunajt għaliex nmap u scapy ħadmu b'mod korrett: kienu qed jużaw sockets mhux maħduma! Is-sokits mhux ipproċessati huma differenti minn sokits regolari: jaqbżu l-iptables, u mhumiex buffered!
Imma għaliex "buffer kbir wisq" jikkawża problemi? Jidher ċar li ma jaħdimx kif maħsub.
F'dan il-punt nista' nirriproduċi l-problema fuq qlub multipli u distribuzzjonijiet multipli. Il-problema diġà dehret fuq il-kernel 3.x u issa dehret ukoll fuq il-kernel 5.x.
Tabilħaqq, mal-istartjar
sysctl -w net.core.rmem_default=$((2**31-1))
DNS waqaf jaħdem.
Bdejt infittex valuri ta 'ħidma permezz ta' algoritmu ta 'tfittxija binarja sempliċi u sibt li s-sistema ħadmet b'2147481343, iżda dan in-numru kien sett ta' numri bla sens għalija. Issuġġeriejt lill-klijent jipprova dan in-numru, u hu wieġeb li s-sistema ħadmet ma 'google.com, iżda xorta ta żball ma' oqsma oħra, għalhekk komplejt l-investigazzjoni tiegħi.
I installajt dropwatch, għodda li kellha tintuża qabel: turi eżattament fejn fil-kernel jispiċċa pakkett. Il-ħati kienet il-funzjoni udp_queue_rcv_skb. Niżżilt is-sorsi tal-qalba u żidt ftit funzjonijietprintk biex issegwi fejn eżattament il-pakkett jispiċċa. Malajr sibt il-kundizzjoni t-tajba if, u sempliċement ħares lejha għal xi żmien, għax kien dak iż-żmien li fl-aħħar kollox ingħaqad fi stampa sħiħa: 231-1, numru bla sens, dominju li ma jaħdimx... Kienet biċċa kodiċi fi __udp_enqueue_schedule_skb:
if (rmem > (size + sk->sk_rcvbuf))
goto uncharge_drop;
Jekk jogħġbok innota:
rmem huwa tat-tip int
size huwa tat-tip u16 (unsigned sittax-il bit int) u jaħżen id-daqs tal-pakkett
sk->sk_rcybuf huwa tat-tip int u jaħżen id-daqs tal-buffer li, b'definizzjoni, huwa ugwali għall-valur in net.core.rmem_default
Meta sk_rcvbuf joqrob lejn 231, it-total tad-daqs tal-pakkett jista' jirriżulta fi overflow integer. U peress li huwa int, il-valur tiegħu jsir negattiv, għalhekk il-kundizzjoni ssir vera meta għandha tkun falza (tista' taqra aktar dwar dan fuq rabta).
L-iżball jista 'jiġi kkoreġut b'mod trivjali: bl-ikkastjar unsigned int. Applikajt it-tiswija u bdejt mill-ġdid is-sistema u d-DNS reġa' ħadem.
Togħma tar-rebħa
Bgħatt is-sejbiet tiegħi lill-klijent u bgħatt LKML garża tal-qalba. Ninsab kuntent: kull biċċa tal-puzzle toqgħod flimkien, nista 'nispjega eżattament għaliex osservajna dak li osservajna, u l-aktar importanti, stajna nsibu soluzzjoni għall-problema grazzi għall-ħidma f'tim tagħna!
Ta 'min jagħraf li l-każ irriżulta li kien rari, u fortunatament rari nirċievu talbiet kumplessi bħal dawn mill-utenti.