Yon istwa sou pakè DNS ki manke nan sipò teknik Google Cloud
Soti nan Google Blog Editè: Èske w te janm mande ki jan enjenyè Google Cloud Technical Solutions (TSE) jere demann sipò w yo? Enjenyè Sipò Teknik TSE yo responsab pou idantifye ak korije sous pwoblèm itilizatè yo rapòte. Gen kèk nan pwoblèm sa yo byen senp, men pafwa ou tonbe sou yon tikè ki mande atansyon plizyè enjenyè alafwa. Nan atik sa a, youn nan anplwaye TSE yo pral di nou sou yon pwoblèm trè difisil nan pratik li te resan an - ka pakè DNS ki manke. Nan istwa sa a, nou pral wè ki jan enjenyè yo te jere yo rezoud sitiyasyon an, ak ki nouvo bagay yo te aprann pandan y ap repare erè a. Nou espere istwa sa a non sèlman edike w sou yon ensèk ki byen chita, men tou ba w yon insight sou pwosesis ki antre nan ranpli yon tikè sipò ak Google Cloud.
Depanaj se tou de yon syans ak yon atizay. Li tout kòmanse ak bati yon ipotèz sou rezon ki fè konpòtman ki pa estanda nan sistèm nan, apre sa li teste pou fòs. Sepandan, anvan nou fòmile yon ipotèz, nou dwe klèman defini ak jisteman fòmile pwoblèm nan. Si kesyon an son twò vag, Lè sa a, ou pral gen analize tout bagay ak anpil atansyon; Sa a se "atizay la" nan depanaj.
Anba Google Cloud, pwosesis sa yo vin eksponansyèlman pi konplèks, paske Google Cloud fè tout sa l kapab pou garanti vi prive itilizatè li yo. Poutèt sa, enjenyè TSE yo pa gen aksè pou modifye sistèm ou yo, ni kapasite pou wè konfigirasyon yo menm jan ak itilizatè yo. Se poutèt sa, pou teste nenpòt nan ipotèz nou yo, nou (enjenyè) pa ka byen vit modifye sistèm nan.
Gen kèk itilizatè kwè ke nou pral ranje tout bagay tankou mekanik nan yon sèvis machin, epi tou senpleman voye nou id la nan yon machin vityèl, tandiske an reyalite pwosesis la pran plas nan yon fòma konvèsasyon: kolekte enfòmasyon, fòme ak konfime (oswa refite) ipotèz, epi, nan fen a, yon pwoblèm desizyon yo baze sou kominikasyon ak kliyan an.
Pwoblèm nan kesyon an
Jodi a nou gen yon istwa ak yon bon fini. Youn nan rezon pou rezolisyon siksè ka pwopoze a se yon deskripsyon trè detaye ak egzat sou pwoblèm nan. Anba a ou ka wè yon kopi premye tikè a (edite pou kache enfòmasyon konfidansyèl):
Mesaj sa a gen anpil enfòmasyon itil pou nou:
Espesifik VM espesifye
Pwoblèm nan tèt li endike - DNS pa travay
Li endike kote pwoblèm nan manifeste poukont li - VM ak veso
Yo endike etap itilizatè a te pran pou idantifye pwoblèm nan.
Rekèt la te anrejistre kòm "P1: Enpak kritik - Sèvis ki pa ka itilize nan pwodiksyon", ki vle di siveyans konstan sitiyasyon an 24/7 selon konplo "Swiv Solèy la" (ou ka li plis sou priyorite demann itilizatè yo), ak transfè li soti nan yon ekip sipò teknik nan yon lòt ak chak chanjman zòn lè. An reyalite, lè pwoblèm nan rive nan ekip nou an nan Zurich, li te deja fè wonn glòb la. Nan tan sa a, itilizatè a te pran mezi alèjman, men li te pè pou yon repete sitiyasyon an nan pwodiksyon, depi kòz la rasin pa t 'ankò te dekouvri.
Lè tikè a te rive nan Zurich, nou te deja gen enfòmasyon sa yo nan men:
Kontni /etc/hosts
Kontni /etc/resolv.conf
Sòti iptables-save
Rasanble pa ekip la ngrep pcap dosye
Avèk done sa yo, nou te pare pou kòmanse "ankèt" ak faz depanaj la.
Premye etap nou yo
Premye a tout, nou tcheke mòso bwa yo ak estati sèvè a metadata ak asire w ke li te travay kòrèkteman. Sèvè metadata a reponn adrès IP 169.254.169.254 epi, pami lòt bagay, responsab pou kontwole non domèn. Nou tou double-tcheke ke firewall la travay kòrèkteman ak VM a epi li pa bloke pake.
Se te yon kalite pwoblèm etranj: chèk nmap la demanti ipotèz prensipal nou an sou pèt pake UDP, kidonk nou mantalman te vini ak plizyè opsyon ak fason yo tcheke yo:
Èske pake yo tonbe selektivman? => Tcheke règ iptables yo
Èske li pa twò piti? Mtu? => Tcheke pwodiksyon an ip a show
Èske pwoblèm nan afekte sèlman pake UDP oswa TCP tou? => Kondwi ale dig +tcp
Èske pake fouye yo retounen? => Kondwi ale tcpdump
Èske libdns ap travay kòrèkteman? => Kondwi ale strace pou tcheke transmisyon pakè yo nan toude direksyon yo
Isit la nou deside rele itilizatè a pou rezoud pwoblèm ap viv.
Pandan apèl la nou kapab tcheke plizyè bagay:
Apre plizyè chèk nou eskli règ iptables nan lis rezon ki fè yo
Nou tcheke koòdone rezo yo ak tab routage, ak doub tcheke si MTU a kòrèk
Nou dekouvri sa dig +tcp google.com (TCP) travay jan li ta dwe, men dig google.com (UDP) pa travay
Èske w te kondwi ale tcpdump li toujou ap travay dig, nou jwenn ke pake UDP yo te retounen
Nou kondwi ale strace dig google.com epi nou wè ki jan fouye kòrèkteman apèl sendmsg() и recvms(), sepandan dezyèm lan entèwonp pa yon timeout
Malerezman, fen shift la rive epi nou oblije ogmante pwoblèm nan nan pwochen zòn lè a. Demann lan, sepandan, te eksite enterè nan ekip nou an, ak yon kòlèg sijere kreye premye pake DNS la lè l sèvi avèk modil la scrapy Python.
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())
Fragman sa a kreye yon pake DNS epi voye demann lan nan sèvè metadata a.
Itilizatè a kouri kòd la, repons DNS la retounen, epi aplikasyon an resevwa li, konfime ke pa gen okenn pwoblèm nan nivo rezo a.
Apre yon lòt "vwayaj nan mond lan," demann lan retounen nan ekip nou an, epi mwen konplètman transfere li nan tèt mwen, panse ke li pral pi bon pou itilizatè a si demann lan sispann fè wonn soti nan yon kote nan yon kote.
Nan entre-temps la, itilizatè a dous dakò bay yon snapshot nan imaj sistèm nan. Sa a se yon trè bon nouvèl: kapasite pou teste sistèm nan tèt mwen fè depanaj yo pi vit, paske mwen pa oblije mande itilizatè a kouri kòmandman, voye rezilta yo ak analize yo, mwen ka fè tout bagay tèt mwen!
Kolèg mwen yo ap kòmanse jalouzi mwen yon ti kras. Pandan manje midi nou diskite sou konvèsyon an, men pèsonn pa gen okenn lide sou sa k ap pase. Erezman, itilizatè a li menm te deja pran mezi pou bese konsekans yo epi li pa prese, kidonk nou gen tan diseke pwoblèm nan. Epi depi nou gen yon imaj, nou ka kouri nenpòt tès ki enterese nou. Gwo!
Pran yon etap tounen
Youn nan kesyon entèvyou ki pi popilè pou pozisyon enjenyè sistèm se: "Kisa k ap pase lè w ping www.google.com? Kesyon an se gwo, depi kandida a bezwen dekri tout bagay soti nan koki a espas itilizatè, nan nwayo a sistèm ak Lè sa a, nan rezo a. Mwen souri: pafwa kesyon entèvyou yo vin itil nan lavi reyèl...
Mwen deside aplike kesyon HR sa a nan yon pwoblèm aktyèl. Apeprè pale, lè ou eseye detèmine yon non DNS, bagay sa yo rive:
Aplikasyon an rele yon bibliyotèk sistèm tankou libdns
libdns tcheke konfigirasyon sistèm lan ak ki sèvè DNS li ta dwe kontakte (nan dyagram sa a se 169.254.169.254, sèvè metadata)
libdns itilize apèl sistèm pou kreye yon priz UDP (SOKET_DGRAM) epi voye pake UDP ak yon demann DNS nan toude direksyon.
Atravè koòdone sysctl ou ka configured pile UDP nan nivo nwayo a
Kernel la reyaji ak pyès ki nan konpitè pou transmèt pakè sou rezo a atravè koòdone rezo a
Hypervisor la kenbe epi transmèt pake a nan sèvè metadata a lè w kontakte li
Sèvè metadata a, pa maji li yo, detèmine non DNS la epi retounen yon repons lè l sèvi avèk menm metòd la
Kite m raple w ki ipotèz nou te deja konsidere:
Ipotèz: Bibliyotèk kraze
Egzamen 1: kouri strace nan sistèm nan, tcheke ke fouye apèl apèl yo kòrèk sistèm
Rezilta: apèl sistèm kòrèk yo rele
Egzamen 2: lè l sèvi avèk srapy pou tcheke si nou ka detèmine non contournement bibliyotèk sistèm yo
Rezilta: nou kapab
Tès 3: kouri rpm –V sou pake libdns ak dosye bibliyotèk md5sum yo
Rezilta: kòd bibliyotèk la konplètman idantik ak kòd la nan sistèm operasyon an k ap travay
Tès 4: monte imaj sistèm rasin itilizatè a sou yon VM san konpòtman sa a, kouri chroot, wè si DNS ap travay.
Rezilta: DNS travay kòrèkteman
Konklizyon ki baze sou tès yo: pwoblèm nan se pa nan bibliyotèk yo
Ipotèz: Gen yon erè nan paramèt DNS yo
Tès 1: tcheke tcpdump epi wè si pake DNS yo voye epi retounen kòrèkteman apre yo fin kouri fouye.
Rezilta: pake yo transmèt kòrèkteman
Tès 2: tcheke doub sou sèvè a /etc/nsswitch.conf и /etc/resolv.conf
Rezilta: tout bagay kòrèk
Konklizyon ki baze sou tès yo: pwoblèm nan se pa ak konfigirasyon dns la
Ipotèz: move konpòtman rezo itilizatè a (oswa koòdone rezo hypervisor)
Tès 1: Tcheke paramèt pare-feu ou yo
Rezilta: firewall la pase pake DNS sou tou de lame a ak GCP
Tès 2: entèsepte trafik epi kontwole kòrèkteman transmisyon an ak retounen nan demann DNS
Rezilta: tcpdump konfime ke lame a te resevwa pake retounen
Konklizyon ki baze sou tès yo: pwoblèm nan pa nan rezo a
Ipotèz: sèvè metadata a pa travay
Tès 1: tcheke mòso bwa sèvè metadata yo pou anomali
Rezilta: pa gen okenn anomali nan mòso bwa yo
Tès 2: Bypass sèvè metadata via dig @8.8.8.8
Rezilta: Rezolisyon kase menm san yo pa itilize yon sèvè metadata
Konklizyon ki baze sou tès yo: pwoblèm nan se pa ak sèvè a metadata
Anba liy lan: nou teste tout subsistèm eksepte anviwònman ègzekutabl!
Plonje nan Anviwònman Runtime Kernel
Pou konfigirasyon anviwònman ekzekisyon nwayo a, ou ka itilize opsyon liy kòmand (grub) oswa koòdone sysctl la. Mwen gade nan /etc/sysctl.conf epi jis panse, mwen dekouvri plizyè anviwònman koutim. Santi kòmsi mwen te pwan sou yon bagay, mwen jete tout anviwònman ki pa rezo oswa ki pa tcp, rete ak anviwònman mòn yo. net.core. Lè sa a, mwen te ale nan kote otorizasyon lame yo te nan VM a epi yo te kòmanse aplike anviwònman yo youn pa youn, youn apre lòt, ak VM la kase, jiskaske mwen jwenn koupab la:
net.core.rmem_default = 2147483647
Isit la li se, yon konfigirasyon DNS-kraze! Mwen jwenn zam asasina a. Men poukisa sa rive? Mwen toujou bezwen yon motif.
Gwosè tanpon pake DNS debaz la configuré via net.core.rmem_default. Yon valè tipik se yon kote alantou 200KiB, men si sèvè ou a resevwa yon anpil nan pake DNS, ou ka vle ogmante gwosè tanpon an. Si tanpon an plen lè yon nouvo pake rive, pou egzanp paske aplikasyon an pa trete li ase vit, Lè sa a, ou pral kòmanse pèdi pake. Kliyan nou an kòrèkteman ogmante gwosè tanpon an paske li te pè pèt done, depi li te itilize yon aplikasyon pou kolekte mezi atravè pake DNS. Valè li te fikse a se te maksimòm posib: 231-1 (si yo mete sou 231, nwayo a ap retounen "AGIGMAN ENVALID").
Toudenkou mwen reyalize poukisa nmap ak scapy te travay kòrèkteman: yo te itilize priz anvan tout koreksyon! Sockets kri yo diferan de priz regilye: yo kontoune iptables, epi yo pa tampon!
Men, poukisa "tanpon twò gwo" lakòz pwoblèm? Li klèman pa travay jan yo gen entansyon.
Nan pwen sa a mwen te kapab repwodui pwoblèm nan sou plizyè nwayo ak distribisyon miltip. Pwoblèm nan te deja parèt sou nwayo a 3.x e kounye a li parèt tou sou nwayo a 5.x.
Vreman vre, sou demaraj
sysctl -w net.core.rmem_default=$((2**31-1))
DNS sispann travay.
Mwen te kòmanse chèche valè k ap travay atravè yon algorithm rechèch binè senp epi mwen te jwenn ke sistèm nan te travay ak 2147481343, men nimewo sa a te yon seri nimewo san sans pou mwen. Mwen sijere kliyan an eseye nimewo sa a, epi li reponn ke sistèm nan te travay ak google.com, men li toujou bay yon erè ak lòt domèn, kidonk mwen kontinye envestigasyon mwen an.
Mwen te enstale dropwatch, yon zouti ki ta dwe itilize pi bonè: li montre egzakteman ki kote nan nwayo a yon pake fini. Koupab la te fonksyon an udp_queue_rcv_skb. Mwen telechaje sous nwayo yo epi mwen ajoute kèk fonksyonprintk pou swiv kote egzakteman pake a fini. Mwen byen vit jwenn bon kondisyon an if, ak tou senpleman fikse sou li pou kèk tan, paske se lè sa a ke tout bagay finalman te reyini ansanm nan yon foto antye: 231-1, yon nimewo san sans, yon domèn ki pa travay... Se te yon moso kòd nan __udp_enqueue_schedule_skb:
if (rmem > (size + sk->sk_rcvbuf))
goto uncharge_drop;
Tanpri sonje:
rmem se nan kalite int
size se nan kalite u16 (unsigned sèz-bit int) ak magazen gwosè a pake
sk->sk_rcybuf se nan kalite int epi li estoke gwosè tanpon ki, pa definisyon, ki egal a valè nan net.core.rmem_default
Lè sk_rcvbuf apwoche 231, adisyone gwosè pake a ka lakòz debòde nonb antye relatif. Epi kòm li se yon int, valè li vin negatif, kidonk kondisyon an vin vre lè li ta dwe fo (ou ka li plis sou sa a nan lyen).
Erè a ka korije nan yon fason trivial: pa depoze unsigned int. Mwen aplike ranje a epi rekòmanse sistèm nan ak DNS te travay ankò.
Gou nan viktwa
Mwen voye rezilta mwen bay kliyan an epi mwen voye LKML patch nwayo. Mwen kontan: chak moso nan devinèt la anfòm ansanm, mwen ka eksplike egzakteman poukisa nou obsève sa nou obsève, e sa ki pi enpòtan, nou te kapab jwenn yon solisyon a pwoblèm nan gras a travay ann ekip nou an!
Li se vo rekonèt ke ka a te tounen soti yo dwe ra, e erezman nou raman resevwa demann konplèks sa yo nan men itilizatè yo.