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.

Storja dwar pakketti DNS nieqsa mill-appoġġ tekniku tal-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):
Storja dwar pakketti DNS nieqsa mill-appoġġ tekniku tal-Google Cloud
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:

  1. L-applikazzjoni ssejjaħ librerija tas-sistema bħal libdns
  2. 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)
  3. 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
  4. Permezz tal-interface sysctl tista 'tikkonfigura l-munzell UDP fil-livell tal-kernel
  5. Il-qalba jinteraġixxi mal-ħardwer biex jittrasmetti pakketti fuq in-netwerk permezz tal-interface tan-netwerk
  6. L-hypervisor jaqbad u jittrasmetti l-pakkett lis-server tal-metadata malli jikkuntattjah
  7. Is-server tal-metadejta, bil-maġija tiegħu, jiddetermina l-isem tad-DNS u jirritorna tweġiba bl-użu tal-istess metodu

Storja dwar pakketti DNS nieqsa mill-appoġġ tekniku tal-Google Cloud
Ħ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 funzjonijiet printk 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.

Storja dwar pakketti DNS nieqsa mill-appoġġ tekniku tal-Google Cloud


Sors: www.habr.com

Żid kumment