Sgeulachd mu phasgan DNS a tha a dhìth bho thaic theicnigeach Google Cloud

Bho neach-deasachaidh blog Google: Na smaoinich thu a-riamh ciamar a làimhsicheas innleadairean Google Cloud Technical Solutions (TSE) na h-iarrtasan taic agad? Tha uallach air Einnseanairean Taic Teicnigeach TSE airson stòran dhuilgheadasan a chaidh aithris le luchd-cleachdaidh a chomharrachadh agus a cheartachadh. Tha cuid de na duilgheadasan sin gu math sìmplidh, ach uaireannan thig thu tarsainn air tiogaid a dh’ fheumas aire grunn innleadairean aig an aon àm. San artaigil seo, innsidh aon de luchd-obrach TSE dhuinn mu aon dhuilgheadas gu math duilich bhon chleachdadh aige o chionn ghoirid - cùis pacaidean DNS a dhìth. Anns an sgeulachd seo, chì sinn mar a chaidh aig na h-innleadairean air an t-suidheachadh fhuasgladh, agus dè na rudan ùra a dh’ ionnsaich iad fhad ‘s a bha iad a’ ceartachadh na mearachd. Tha sinn an dòchas nach e a-mhàin gu bheil an sgeulachd seo gad oideachadh mu bhiast domhainn, ach cuideachd a ’toirt sealladh dhut air na pròiseasan a tha an lùib a bhith a’ faidhleadh tiogaid taic le Google Cloud.

Sgeulachd mu phasgan DNS a tha a dhìth bho thaic theicnigeach Google Cloud

Tha fuasgladh dhuilgheadasan an dà chuid saidheans agus ealain. Tha e uile a 'tòiseachadh le bhith a' togail beachd-bharail mun adhbhar airson giùlan neo-àbhaisteach an t-siostaim, agus an dèidh sin tha e air a dhearbhadh airson neart. Ach, mus cruthaich sinn beachd-bharail, feumaidh sinn an duilgheadas a mhìneachadh gu soilleir agus a dhealbhadh gu mionaideach. Ma tha a 'cheist a' faireachdainn ro neo-shoilleir, feumaidh tu a h-uile dad a sgrùdadh gu faiceallach; Is e seo an “ealain” de fhuasgladh dhuilgheadasan.

Fo Google Cloud, bidh pròiseasan mar seo a’ fàs nas iom-fhillte, leis gu bheil Google Cloud a’ feuchainn a dhìcheall gus prìobhaideachd an luchd-cleachdaidh a ghealltainn. Air sgàth seo, chan eil cothrom aig innleadairean TSE na siostaman agad a dheasachadh, no an comas rèiteachaidhean fhaicinn cho farsaing ’s a tha aig luchd-cleachdaidh. Mar sin, gus deuchainn a dhèanamh air gin de na beachd-bharail againn, chan urrainn dhuinn (innleadairean) an siostam atharrachadh gu sgiobalta.

Tha cuid de luchd-cleachdaidh den bheachd gun socraich sinn a h-uile càil mar meacanaig ann an seirbheis càr, agus dìreach cuir thugainn id inneal brìgheil, ach ann an da-rìribh bidh am pròiseas a’ tachairt ann an cruth còmhraidh: a’ cruinneachadh fiosrachaidh, a’ cruthachadh agus a’ dearbhadh (no a’ diùltadh) barailean, agus, aig a 'cheann thall, tha duilgheadasan co-dhùnadh stèidhichte air conaltradh leis an neach-dèiligidh.

Trioblaid ann an ceist

An-diugh tha sgeulachd againn le deagh chrìoch. Is e aon de na h-adhbharan airson fuasgladh soirbheachail na cùise a chaidh a mholadh tuairisgeul fìor mhionaideach agus ceart air an duilgheadas. Gu h-ìosal chì thu leth-bhreac den chiad tiogaid (deasaichte gus fiosrachadh dìomhair fhalach):
Sgeulachd mu phasgan DNS a tha a dhìth bho thaic theicnigeach Google Cloud
Tha tòrr fiosrachaidh feumail san teachdaireachd seo dhuinn:

  • VM sònraichte air a shònrachadh
  • Tha an duilgheadas fhèin air a chomharrachadh - chan eil DNS ag obair
  • Tha e air a chomharrachadh far a bheil an duilgheadas ga nochdadh fhèin - VM agus container
  • Tha na ceumannan a ghabh an neach-cleachdaidh gus an duilgheadas aithneachadh.

Chaidh an t-iarrtas a chlàradh mar “P1: Buaidh Critigeach - Seirbheis nach gabh a chleachdadh ann an cinneasachadh”, a tha a’ ciallachadh sgrùdadh cunbhalach air an t-suidheachadh 24/7 a rèir sgeama “Follow the Sun” (faodaidh tu barrachd a leughadh mu dheidhinn prìomhachasan iarrtasan luchd-cleachdaidh), le a ghluasad bho aon sgioba taic theicnigeach gu sgioba eile le gach gluasad sòn ùine. Gu dearbh, mus do ràinig an duilgheadas an sgioba againn ann an Zurich, bha e mu thràth air cuairteachadh na cruinne. Ron àm seo, bha an neach-cleachdaidh air ceumannan lasachaidh a ghabhail, ach bha eagal air ath-aithris air an t-suidheachadh ann an cinneasachadh, leis nach deach am bun-adhbhar a lorg fhathast.

Mun àm a ràinig an tiogaid Zurich, bha am fiosrachadh a leanas againn mu thràth:

  • Susbaint /etc/hosts
  • Susbaint /etc/resolv.conf
  • co-dhùnadh iptables-save
  • Air a chruinneachadh leis an sgioba ngrep faidhle pcap

Leis an dàta seo, bha sinn deiseil airson tòiseachadh air an ìre “sgrùdadh” agus fuasgladh cheistean.

Na ciad cheumannan againn

An toiseach, rinn sinn sgrùdadh air logaichean agus inbhe an fhrithealaiche meata-dàta agus rinn sinn cinnteach gu robh e ag obair ceart. Bidh am frithealaiche meata-dàta a 'freagairt an t-seòlaidh IP 169.254.169.254 agus, am measg rudan eile, tha e an urra ri smachd a chumail air ainmean fearainn. Rinn sinn sgrùdadh dùbailte cuideachd gu bheil am balla-teine ​​​​ag obair gu ceart leis an VM agus nach eil e a’ cur bacadh air pacaidean.

B’ e seòrsa de dhuilgheadas neònach a bh’ ann: chaidh an t-seic nmap an aghaidh ar prìomh bharail mu chall pacaidean UDP, agus mar sin thàinig sinn gu inntinn le grunn roghainnean eile agus dòighean air an sgrùdadh:

  • A bheil pacaidean air an leigeil sìos gu roghnach? => Thoir sùil air riaghailtean iptables
  • Nach eil e ro bheag? DUINE? => Thoir sùil air toradh ip a show
  • A bheil an duilgheadas a’ toirt buaidh air dìreach pacaidean UDP no TCP cuideachd? => Siubhail air falbh dig +tcp
  • A bheil pacaidean air an cruthachadh le cladhach air an tilleadh? => Siubhail air falbh tcpdump
  • A bheil libdns ag obair ceart? => Siubhail air falbh strace gus sgrùdadh a dhèanamh air tar-chuir pacaidean an dà thaobh

An seo tha sinn a’ co-dhùnadh fios a chuir chun neach-cleachdaidh gus duilgheadasan fhuasgladh beò.

Rè a’ ghairm is urrainn dhuinn grunn rudan a sgrùdadh:

  • Às deidh grunn sgrùdaidhean bidh sinn a’ dùnadh riaghailtean iptables bhon liosta adhbharan
  • Bidh sinn a’ sgrùdadh eadar-aghaidh lìonra agus clàran slighe, agus a’ dèanamh cinnteach gu bheil an MTU ceart
  • Tha sinn a 'faighinn a-mach sin dig +tcp google.com (TCP) ag obair mar bu chòir, ach dig google.com (UDP) nach eil ag obair
  • Air a chuir air falbh tcpdump tha e fhathast ag obair dig, lorg sinn gu bheil pacaidean UDP gan tilleadh
  • Bidh sinn a 'draibheadh ​​​​air falbh strace dig google.com agus tha sinn a 'faicinn mar a chladhach gu ceart gairmean sendmsg() и recvms(), ach tha an dàrna fear air a bhriseadh le ùine-ama

Gu mì-fhortanach, thig deireadh a’ ghluasaid agus feumaidh sinn an duilgheadas a ghluasad chun ath raon ùine. Ach, thog an t-iarrtas ùidh anns an sgioba againn, agus tha co-obraiche a’ moladh a’ chiad phasgan DNS a chruthachadh a’ cleachdadh a’ mhodal 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())

Bidh a’ chriomag seo a’ cruthachadh pacaid DNS agus a’ cur an iarrtas chun an fhrithealaiche meata-dàta.

Bidh an neach-cleachdaidh a 'ruith a' chòd, tha an fhreagairt DNS air a thilleadh, agus gheibh an aplacaid e, a 'dearbhadh nach eil duilgheadas sam bith aig ìre an lìonraidh.

Às deidh “turas eile air feadh an t-saoghail,” bidh an t-iarrtas a’ tilleadh chun sgioba againn, agus bidh mi gu tur ga ghluasad thugam fhìn, a’ smaoineachadh gum bi e nas goireasaiche don neach-cleachdaidh ma stadas an t-iarrtas a ’cuairteachadh bho àite gu àite.

Anns an eadar-ama, tha an neach-cleachdaidh gu coibhneil ag aontachadh dealbh den t-siostam a thoirt seachad. Is e deagh naidheachd a tha seo: tha an comas deuchainn a dhèanamh air an t-siostam mi-fhìn a’ dèanamh fuasgladh cheistean fada nas luaithe, oir chan fheum mi tuilleadh iarraidh air an neach-cleachdaidh òrdughan a ruith, na toraidhean a chuir thugam agus an sgrùdadh, is urrainn dhomh a h-uile càil a dhèanamh mi-fhìn!

Tha mo cho-obraichean a’ tòiseachadh a’ cur beagan farmad orm. Aig àm lòn bidh sinn a 'bruidhinn mun tionndadh, ach chan eil fios aig duine dè a tha a' dol. Gu fortanach, tha an neach-cleachdaidh fhèin air ceumannan a ghabhail mu thràth gus na builean a lughdachadh agus chan eil e ann an cabhag sam bith, agus mar sin tha ùine againn an duilgheadas a sgaradh. Agus leis gu bheil ìomhaigh againn, is urrainn dhuinn deuchainnean sam bith a ruith anns a bheil ùidh againn. Sgoinneil!

A' gabhail ceum air ais

Is e aon de na ceistean agallaimh as mòr-chòrdte airson dreuchdan innleadair siostaman: “Dè thachras nuair a bhios tu a’ ping www.google.com? Tha a’ cheist fìor mhath, oir feumaidh an tagraiche cunntas a thoirt air a h-uile càil bhon t-slige gu àite luchd-cleachdaidh, gu kernel an t-siostaim agus an uairsin chun lìonra. Bidh mi a’ gàireachdainn: uaireannan bidh ceistean agallaimh feumail ann am fìor bheatha...

Tha mi a’ co-dhùnadh a’ cheist HR seo a chuir an sàs ann an duilgheadas làithreach. San fharsaingeachd, nuair a dh'fheuchas tu ri ainm DNS a dhearbhadh, bidh na leanas a 'tachairt:

  1. Bidh an aplacaid a’ gairm leabharlann siostam leithid libdns
  2. bidh libdns a’ sgrùdadh rèiteachadh an t-siostaim ris am bu chòir don fhrithealaiche DNS fios a chuir (san dealbh seo 169.254.169.254, frithealaiche meata-dàta)
  3. bidh libdns a’ cleachdadh fiosan siostaim gus socaid UDP (SOKET_DGRAM) a chruthachadh agus pacaidean UDP a chuir le ceist DNS an dà thaobh
  4. Tron eadar-aghaidh sysctl faodaidh tu an stac UDP a rèiteachadh aig an ìre kernel
  5. Bidh an kernel ag eadar-obrachadh leis a’ bhathar-cruaidh gus pacaidean a chuir thairis air an lìonra tro eadar-aghaidh an lìonraidh
  6. Bidh an hypervisor a’ glacadh agus a’ sgaoileadh a’ phacaid chun t-seirbheisiche meata-dàta nuair a chuireas iad fios thuige
  7. Bidh am frithealaiche meata-dàta, leis a dhraoidheachd, a’ dearbhadh an ainm DNS agus a’ tilleadh freagairt a’ cleachdadh an aon dòigh

Sgeulachd mu phasgan DNS a tha a dhìth bho thaic theicnigeach Google Cloud
Leig leam do chuimhneachadh dè na barailean a tha sinn air beachdachadh mar-thà:

Beachd-bheachd: Leabharlannan briste

  • Deuchainn 1: ruith strace san t-siostam, dèan cinnteach gu bheil cladhach a’ gairm na gairmean siostam ceart
  • Toradh: Canar fiosan siostam ceart
  • Deuchainn 2: a’ cleachdadh srapaidh gus faighinn a-mach an urrainn dhuinn ainmean a dhearbhadh a’ dol seachad air leabharlannan siostam
  • Toradh: faodaidh sinn
  • Deuchainn 3: ruith rpm –V air a’ phacaid libdns agus faidhlichean leabharlainn md5sum
  • Toradh: tha còd an leabharlainn gu tur co-ionann ris a’ chòd san t-siostam obrachaidh obrachaidh
  • Deuchainn 4: cuir suas ìomhaigh siostam freumh an neach-cleachdaidh air VM às aonais an giùlan seo, ruith chroot, faic a bheil DNS ag obair
  • Toradh: Tha DNS ag obair gu ceart

Co-dhùnadh stèidhichte air deuchainnean: chan eil an duilgheadas anns na leabharlannan

Beachd-bheachd: Tha mearachd ann an roghainnean DNS

  • Deuchainn 1: thoir sùil air tcpdump agus faic a bheil pacaidean DNS air an cur agus air an tilleadh gu ceart às deidh dhaibh cladhach a ruith
  • Toradh: tha pacaidean air an gluasad gu ceart
  • Deuchainn 2: sgrùdadh dùbailte air an fhrithealaiche /etc/nsswitch.conf и /etc/resolv.conf
  • Toradh: tha a h-uile dad ceart

Co-dhùnadh stèidhichte air deuchainnean: chan eil an duilgheadas leis an rèiteachadh DNS

Beachd-bharail: cridhe air a mhilleadh

  • Deuchainn: stàlaich kernel ùr, thoir sùil air ainm-sgrìobhte, ath-thòiseachadh
  • Toradh: giùlan coltach ris

Co-dhùnadh stèidhichte air deuchainnean: chan eil an kernel air a mhilleadh

Beachd-bharail: giùlan ceàrr an lìonra luchd-cleachdaidh (no eadar-aghaidh lìonra hypervisor)

  • Deuchainn 1: Thoir sùil air na roghainnean balla-teine ​​​​agad
  • Toradh: bidh am balla-teine ​​​​a 'dol seachad air pacaidean DNS air an òstair agus an GCP
  • Deuchainn 2: cuir stad air trafaic agus cùm sùil air ceartachd tar-chuir agus tilleadh iarrtasan DNS
  • Toradh: tha tcpdump a’ dearbhadh gu bheil an aoigh air pacaidean tilleadh fhaighinn

Co-dhùnadh stèidhichte air deuchainnean: chan eil an duilgheadas anns an lìonra

Beachd-bharail: chan eil am frithealaiche meata-dàta ag obair

  • Deuchainn 1: thoir sùil air logaichean an fhrithealaiche meata-dàta airson neo-riaghailteachdan
  • Toradh: chan eil neo-riaghailteachdan anns na logaichean
  • Deuchainn 2: Seachad air an fhrithealaiche meata-dàta tro dig @8.8.8.8
  • Toradh: Tha rùn briste eadhon gun a bhith a’ cleachdadh frithealaiche meata-dàta

Co-dhùnadh stèidhichte air deuchainnean: chan eil an duilgheadas leis an fhrithealaiche meata-dàta

Loidhne-ìosal: rinn sinn deuchainn air a h-uile fo-shiostam ach a-mhàin roghainnean runtime!

Dàibheadh ​​​​a-steach do roghainnean Kernel Runtime

Gus an àrainneachd cur an gnìomh kernel a rèiteachadh, faodaidh tu roghainnean loidhne-àithne (grub) no an eadar-aghaidh sysctl a chleachdadh. Thug mi sùil a-steach /etc/sysctl.conf agus dìreach smaoinich, lorg mi grunn shuidheachaidhean àbhaisteach. A 'faireachdainn mar gum biodh mi air grèim fhaighinn air rudeigin, chuir mi air falbh a h-uile suidheachadh neo-lìonra no neo-tcp, a' fuireach le suidheachadh na beinne net.core. An uairsin chaidh mi gu far an robh na ceadan aoigheachd anns an VM agus thòisich mi a ’cur an sàs na roghainnean aon às deidh a chèile, aon às deidh a chèile, leis an VM briste, gus an lorg mi an neach a bha ciontach:

net.core.rmem_default = 2147483647

Seo e, rèiteachadh briseadh DNS! Lorg mi an armachd murt. Ach carson a tha seo a’ tachairt? Bha feum agam air adhbhar fhathast.

Tha meud bufair pacaid bunaiteach DNS air a rèiteachadh tro net.core.rmem_default. Tha luach àbhaisteach an àiteigin timcheall air 200KiB, ach ma gheibh an frithealaiche agad tòrr phasgan DNS, is dòcha gum bi thu airson meud bufair àrdachadh. Ma tha am bufair làn nuair a ruigeas pacaid ùr, mar eisimpleir leis nach eil an tagradh ga ghiullachd luath gu leòr, tòisichidh tu a’ call pacaidean. Mheudaich an neach-dèiligidh againn meud bufair gu ceart leis gu robh eagal air call dàta, leis gu robh e a’ cleachdadh tagradh airson metrics a chruinneachadh tro phasgan DNS. B’ e an luach a shuidhich e an ìre as àirde a bha comasach: 231-1 (ma chaidh a shuidheachadh gu 231, tillidh an kernel “ARGUMENT INVALID”).

Gu h-obann thuig mi carson a bha nmap agus scapy ag obair gu ceart: bha iad a’ cleachdadh socaidean amh! Tha socaidean amh eadar-dhealaichte bho socaidean àbhaisteach: bidh iad a ’dol seachad air iptables, agus chan eil iad air am bufair!

Ach carson a tha "bufair ro mhòr" ag adhbhrachadh dhuilgheadasan? Tha e soilleir nach obraich e mar a bha dùil.

Aig an ìre seo b’ urrainn dhomh an duilgheadas ath-riochdachadh air ioma kernels agus ioma-sgaoilidhean. Nochd an duilgheadas mu thràth air an kernel 3.x agus a-nis nochd e cuideachd air an kernel 5.x.

Gu dearbh, nuair a thòisicheas tu

sysctl -w net.core.rmem_default=$((2**31-1))

Sguir DNS ag obair.

Thòisich mi a 'coimhead airson luachan obrach tro algorithm sgrùdaidh binary sìmplidh agus lorg mi gu robh an siostam ag obair le 2147481343, ach bha an àireamh seo na sheata àireamhan gun bhrìgh dhomh. Mhol mi don neach-dèiligidh an àireamh seo fheuchainn, agus fhreagair e gu robh an siostam ag obair le google.com, ach fhathast thug e mearachd le raointean eile, agus mar sin lean mi air adhart leis an sgrùdadh agam.

Tha mi air a stàladh uaireadair, inneal a bu chòir a bhith air a chleachdadh na bu thràithe: tha e a’ sealltainn gu dìreach far a bheil pacaid anns an kernel a’ tighinn gu crìch. B’ e an neach a bha ciontach an gnìomh udp_queue_rcv_skb. Luchdaich sìos mi na stòran kernel agus chuir mi beagan ris gnìomhan printk gus faighinn a-mach càite dìreach a thig am pasgan gu crìch. Lorg mi gu sgiobalta an suidheachadh ceart if, agus dìreach a’ coimhead air airson ùine, oir b’ ann an uairsin a thàinig a h-uile càil còmhla mu dheireadh ann an dealbh slàn: 231-1, àireamh gun bhrìgh, raon neo-obrachail... B’ e pìos còd a bh’ ann an __udp_enqueue_schedule_skb:

if (rmem > (size + sk->sk_rcvbuf))
		goto uncharge_drop;

Thoiribh fa-near:

  • rmem tha de sheòrsa int
  • size tha e de sheòrsa u16 (int sia-deug gun ainm) agus a’ stòradh meud a’ phacaid
  • sk->sk_rcybuf tha e de sheòrsa int agus a’ stòradh meud bufair a tha, a rèir mìneachadh, co-ionann ris an luach ann an net.core.rmem_default

Cuin sk_rcvbuf a’ tighinn gu 231, le bhith a’ toirt geàrr-chunntas air meud a’ phacaid dh’ fhaodadh sin leantainn gu thar-shruth iomlan. Agus leis gur e int a th’ ann, bidh a luach a’ fàs àicheil, agus mar sin bidh an suidheachadh fìor nuair a bu chòir dha a bhith meallta (faodaidh tu barrachd a leughadh mu dheidhinn seo aig cheangal).

Faodar a’ mhearachd a cheartachadh ann an dòigh bheag: le bhith a’ tilgeadh unsigned int. Chuir mi am fuasgladh an sàs agus ath-thòisich mi an siostam agus dh’ obraich DNS a-rithist.

Blas na buaidh

Chuir mi na co-dhùnaidhean agam air adhart chun neach-dèiligidh agus chuir mi LKML paiste kernel. Tha mi toilichte: tha a h-uile pìos tòimhseachan a’ freagairt ri chèile, is urrainn dhomh mìneachadh carson a chunnaic sinn na chunnaic sinn, agus nas cudromaiche, bha e comasach dhuinn fuasgladh fhaighinn air an duilgheadas le taing don obair-sgioba againn!

'S fhiach a bhith mothachail gu bheil a' chùis a thionndaidh a mach a bhith tearc, agus gu fortanach tha sinn a 'faighinn a leithid iom-fhillte iarrtasan bho luchd-cleachdaidh.

Sgeulachd mu phasgan DNS a tha a dhìth bho thaic theicnigeach Google Cloud


Source: www.habr.com

Cuir beachd ann