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.

Yon istwa sou pakè DNS ki manke nan sipò teknik 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):
Yon istwa sou pakè DNS ki manke nan sipò teknik Google Cloud
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:

  1. Aplikasyon an rele yon bibliyotèk sistèm tankou libdns
  2. 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)
  3. libdns itilize apèl sistèm pou kreye yon priz UDP (SOKET_DGRAM) epi voye pake UDP ak yon demann DNS nan toude direksyon.
  4. Atravè koòdone sysctl ou ka configured pile UDP nan nivo nwayo a
  5. Kernel la reyaji ak pyès ki nan konpitè pou transmèt pakè sou rezo a atravè koòdone rezo a
  6. Hypervisor la kenbe epi transmèt pake a nan sèvè metadata a lè w kontakte li
  7. 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

Yon istwa sou pakè DNS ki manke nan sipò teknik Google Cloud
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: nwayo domaje

  • Tès: enstale nouvo nwayo, tcheke siyati, rekòmanse
  • Rezilta: konpòtman menm jan an

Konklizyon ki baze sou tès yo: nwayo a pa domaje

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 fonksyon printk 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

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.

Yon istwa sou pakè DNS ki manke nan sipò teknik Google Cloud


Sous: www.habr.com

Add nouvo kòmantè