Akụkọ gbasara ngwugwu DNS na-efu site na nkwado teknụzụ Google Cloud

Site na nchịkọta akụkọ blọọgụ Google: Ọ dịtụla mgbe ị na-eche ka ndị injinia Google Cloud Technical Solutions (TSE) si edozi arịrịọ nkwado gị? Ndị injinia na-akwado teknụzụ TSE na-ahụ maka ịchọpụta na mezie isi mmalite nke nsogbu ndị ọrụ kọrọ. Ụfọdụ n'ime nsogbu ndị a dị nnọọ mfe, ma mgbe ụfọdụ ị na-ahụ tiketi nke chọrọ nlebara anya nke ọtụtụ ndị injinia ozugbo. N'isiokwu a, otu n'ime ndị ọrụ TSE ga-agwa anyị banyere otu nsogbu siri ike site na omume ya na nso nso a - ikpe nke ngwugwu DNS efu efu. N'akụkọ a, anyị ga-ahụ ka ndị injinia si mee ka ọnọdụ ahụ kwụsị, yana ihe ọhụrụ ha mụtara mgbe ha na-edozi njehie ahụ. Anyị na-atụ anya na akụkọ a ọ bụghị naanị na-akụziri gị maka ahụhụ dị omimi, kamakwa ọ na-enye gị nghọta na usoro ndị na-abanye n'ime ntinye akwụkwọ nkwado na Google Cloud.

Akụkọ gbasara ngwugwu DNS na-efu site na nkwado teknụzụ Google Cloud

Nchọpụta nsogbu bụ ma sayensị ma nka. Ihe niile na-amalite site n'ịmepụta echiche banyere ihe kpatara omume na-adịghị mma nke usoro ahụ, mgbe nke a gasịrị, a na-anwale ya maka ike. Agbanyeghị, tupu anyị ewepụta echiche, anyị ga-akọwapụta nke ọma wee chepụta nsogbu ahụ nke ọma. Ọ bụrụ na ajụjụ ahụ na-ada ụda nke ukwuu, mgbe ahụ ị ga-enyocha ihe niile nke ọma; Nke a bụ "nkà" nke nchọpụta nsogbu.

N'okpuru Google Cloud, usoro ndị dị otú ahụ na-aghọwanye mgbagwoju anya, ebe Google Cloud na-agbalị ike ya iji kwe nkwa nzuzo nke ndị ọrụ ya. N'ihi nke a, ndị injinia TSE enweghị ohere iji dezie sistemu gị, ma ọ bụ ike ịlele nhazi ka ndị ọrụ na-eme. Ya mere, iji nwalee nke ọ bụla n'ime echiche anyị, anyị (ndị injinia) enweghị ike ịmegharị usoro ngwa ngwa.

Ụfọdụ ndị ọrụ kwenyere na anyị ga-edozi ihe niile dị ka ndị na-arụ ọrụ na ọrụ ụgbọ ala, ma zitere anyị id nke igwe mebere, ebe n'eziokwu, usoro a na-ewere ọnọdụ na usoro mkparịta ụka: ịnakọta ozi, ịmepụta na ịkwado (ma ọ bụ ịgbagha) echiche, na, n'ikpeazụ, nsogbu mkpebi dabere na nkwurịta okwu na onye ahịa.

Nsogbu a na-ajụ

Taa, anyị nwere akụkọ nwere njedebe dị mma. Otu n'ime ihe kpatara mkpebi nke ọma nke ikpe a chọrọ bụ nkọwa zuru oke na nke ziri ezi nke nsogbu ahụ. N'okpuru, ị nwere ike ịhụ nnomi nke tiketi mbụ (deziri iji zoo ozi nzuzo):
Akụkọ gbasara ngwugwu DNS na-efu site na nkwado teknụzụ Google Cloud
Ozi a nwere ọtụtụ ozi bara uru maka anyị:

  • VM akọwapụtara
  • E gosipụtara nsogbu ahụ n'onwe ya - DNS anaghị arụ ọrụ
  • E gosipụtara ya ebe nsogbu ahụ gosipụtara onwe ya - VM na akpa
  • E gosipụtara usoro onye ọrụ mere iji chọpụta nsogbu ahụ.

Edebara aha arịrịọ ahụ dị ka "P1: Mmetụta dị oke egwu - Ọrụ adịghị arụ ọrụ na mmepụta", nke pụtara nlekota oge niile nke ọnọdụ 24/7 dịka atụmatụ "Soro Sun" (ị nwere ike ịgụkwu banyere ya). mkpa nke arịrịọ onye ọrụ), na ịnyefe ya site n'otu ndị otu nkwado teknụzụ gaa na nke ọzọ na mpaghara oge ọ bụla. N'ezie, ka ọ na-erule mgbe nsogbu ahụ ruru ndị otu anyị nọ na Zurich, ọ gbasaala gburugburu ụwa. Ka ọ na-erule oge a, onye ọrụ ahụ ewerela ihe nkwụsịtụ, ma ọ na-atụ egwu ịmegharị ọnọdụ ahụ na mmepụta, ebe ọ bụ na achọpụtabeghị ihe kpatara ya.

Ka ọ na-erule oge tiketi ahụ rutere Zurich, anyị enweelarị ozi ndị a n'aka:

  • Ọdịnaya /etc/hosts
  • Ọdịnaya /etc/resolv.conf
  • nkwubi iptables-save
  • Ndị otu gbakọtara ngrep pcap faịlụ

Site na data a, anyị dị njikere ịmalite "nyocha" na nhazi nsogbu.

Nzọụkwụ mbụ anyị

Nke mbụ, anyị nyochara ndekọ na ọkwa nke ihe nkesa metadata wee hụ na ọ na-arụ ọrụ nke ọma. Ihe nkesa metadata na-aza adreesị IP 169.254.169.254 yana, n'etiti ihe ndị ọzọ, na-ahụ maka ịchịkwa ngalaba aha. Anyị nyochakwara ugboro abụọ na firewall na-arụ ọrụ nke ọma na VM na anaghị egbochi ngwugwu.

Ọ bụ ụdị nsogbu dị iche iche: nlele nmap gọnarịrị echiche anyị bụ isi gbasara mfu nke ngwugwu UDP, yabụ anyị ji echiche wepụta ọtụtụ nhọrọ na ụzọ anyị ga-esi lelee ha:

  • A na-atụpụrụ ngwugwu ahọpụtara? => Lelee iwu iptables
  • Ọ bụghị oke obere? MTU? => Lelee mmepụta ip a show
  • Nsogbu a ọ na-emetụta naanị ngwugwu UDP ma ọ bụ TCP? => Gbapụ dig +tcp
  • A na-eweghachite ngwungwu egwu egwu? => Gbapụ tcpdump
  • libdn na-arụ ọrụ nke ọma? => Gbapụ strace iji lelee nnyefe nke ngwugwu n'akụkụ abụọ ahụ

N'ebe a, anyị na-ekpebi ịkpọ onye ọrụ iji dozie nsogbu ndụ.

N'oge oku a, anyị nwere ike ịlele ọtụtụ ihe:

  • Mgbe ọtụtụ ndenyechara, anyị na-ewepu iwu iptables na ndepụta nke ihe kpatara ya
  • Anyị na-elele ntanetị netwọkụ na tebụl ntụgharị, wee lelee ugboro abụọ na MTU ziri ezi
  • Anyị na-achọpụta nke ahụ dig +tcp google.com (TCP) na-arụ ọrụ dị ka o kwesịrị, ma dig google.com (UDP) anaghị arụ ọrụ
  • N'ịbụ onye chụpụrụ tcpdump ọ ka na-arụ ọrụ dig, anyị na-achọpụta na a na-eweghachi ngwugwu UDP
  • Anyị na-anya ụgbọ ala strace dig google.com na anyị na-ahụ otú igwu n'ụzọ ziri ezi na-akpọ sendmsg() и recvms(), Otú ọ dị, a na-akwụsị nke abụọ site na nkwụsị oge

N'ụzọ dị mwute, njedebe nke ngbanwe ahụ na-abịarute ma a na-amanye anyị ịkwalite nsogbu ahụ na mpaghara oge ọzọ. Arịrịọ ahụ, agbanyeghị, kpalitere mmasị na otu anyị, onye ọrụ ibe na-atụ aro ịmepụta ngwugwu DNS mbụ site na iji modul 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())

Iberibe a na-emepụta ngwugwu DNS wee ziga arịrịọ na sava metadata.

Onye ọrụ na-agba koodu ahụ, nzaghachi DNS laghachi azụ, ngwa ahụ na-enwetakwa ya, na-ekwenye na ọ dịghị nsogbu ọ bụla na netwọk netwọk.

Mgbe "njem gburugburu ụwa" ọzọ gasịrị, arịrịọ ahụ laghachiri n'òtù anyị, m na-ebufekwa ya n'onwe m kpamkpam, na-eche na ọ ga-adabara onye ọrụ ahụ mfe ma ọ bụrụ na arịrịọ ahụ kwụsịrị ịgagharị site n'otu ebe gaa n'ebe ọzọ.

Ka ọ dị ugbu a, onye ọrụ ejiri obiọma kwenye ịnye foto onyonyo sistemụ. Nke a bụ ozi ọma dị mma: ikike ịnwale usoro ahụ n'onwe m na-eme nchọpụta nsogbu ngwa ngwa, n'ihi na agaghịzi m arịọ onye ọrụ ka ọ gbaa iwu, zitere m nsonaazụ ma nyochaa ha, enwere m ike ịme ihe niile n'onwe m!

Ndị ọrụ ibe m na-amalite ime m anyaụfụ. N'ime nri ehihie anyị na-ekwurịta ntughari, ma ọ dịghị onye nwere echiche ọ bụla ihe na-eme. Ọ dabara nke ọma, onye ọrụ n'onwe ya ewerelarị ihe iji belata nsonaazụ ya na ọ dịghị ngwa ngwa, yabụ anyị nwere oge iji gbasaa nsogbu ahụ. Ma ebe anyị nwere ihe oyiyi, anyị nwere ike ịme ule ọ bụla na-amasị anyị. Nnukwu!

Na-ewere nzọụkwụ azụ

Otu n'ime ajụjụ ajụjụ ọnụ kacha ewu ewu maka ọnọdụ injinia sistemu bụ: “Gịnị na-eme mgbe ị na-akụ ping www.google.com? Ajụjụ a dị mma, ebe ọ bụ na onye na-achọ akwụkwọ kwesịrị ịkọwa ihe niile site na shei ruo na ohere onye ọrụ, na kernel usoro na mgbe ahụ na netwọk. M na-amụmụ ọnụ ọchị: mgbe ụfọdụ ajụjụ ajụjụ ọnụ na-apụta bara uru na ndụ n'ezie...

Ekpebiri m itinye ajụjụ HR a na nsogbu dị ugbu a. N'ikwu okwu, mgbe ị na-agbalị ịchọta aha DNS, ihe ndị a na-eme:

  1. Ngwa a na-akpọ ọbá akwụkwọ sistemụ dịka libdns
  2. libdns na-enyocha nhazi sistemụ nke sava DNS ọ kwesịrị ịkpọtụrụ (na eserese a bụ 169.254.169.254, sava metadata)
  3. libdns na-eji oku sistemu mepụta oghere UDP (SOKET_DGRAM) wee ziga ngwugwu UDP nwere ajụjụ DNS n'akụkụ abụọ ahụ.
  4. Site na interface sysctl ị nwere ike hazie nchịkọta UDP na ọkwa kernel
  5. kernel na ngwaike na-emekọrịta ihe iji bufee ngwugwu na netwọkụ site na interface netwọkụ
  6. Hypervisor na-ejide ma bufee ngwugwu ahụ na ihe nkesa metadata mgbe ọ na-akpọtụrụ ya
  7. Ihe nkesa metadata, site na anwansi ya, na-ekpebi aha DNS wee weghachi nzaghachi site na iji otu usoro ahụ

Akụkọ gbasara ngwugwu DNS na-efu site na nkwado teknụzụ Google Cloud
Ka m chetara gị echiche echiche ndị anyị tụlerela:

Echiche: Ụlọ akwụkwọ ndị gbajiri agbaji

  • Nnwale 1: na-agba ọsọ strace na sistemụ, lelee na igwu oku na-akpọ usoro ziri ezi
  • Nsonaazụ: A na-akpọ oku sistemu ziri ezi
  • Nnwale 2: iji srapy lelee ma anyị nwere ike ikpebi aha gafere ọba akwụkwọ sistemụ
  • Nsonaazụ: anyị nwere ike
  • Nnwale 3: na-agba ọsọ rpm –V na ngwugwu libdns yana faịlụ ọba akwụkwọ md5sum
  • Nsonaazụ: koodu ọbá akwụkwọ bụ kpam kpam na koodu dị na sistemụ arụ ọrụ
  • Nnwale 4: bulie onyonyo sistemụ mgbọrọgwụ nke onye ọrụ na VM na-enweghị omume a, gbaa chroot, hụ ma DNS na-arụ ọrụ
  • Nsonaazụ: DNS na-arụ ọrụ nke ọma

Mmechi dabere na ule: nsogbu adịghị n'ụlọ akwụkwọ

Echiche: Enwere mperi na ntọala DNS

  • Nnwale 1: lelee tcpdump wee hụ ma ọ bụrụ na ezipụ ngwugwu DNS wee weghachite nke ọma mgbe ị gbasasịrị igwu
  • Nsonaazụ: A na-ebufe ngwugwu nke ọma
  • Nnwale 2: nlele abụọ na ihe nkesa /etc/nsswitch.conf и /etc/resolv.conf
  • Nsonaazụ: ihe niile ziri ezi

Mmechi dabere na ule: nsogbu abụghị na nhazi DNS

Echiche: isi mebiri emebi

  • Nnwale: wụnye kernel ọhụrụ, lelee mbinye aka, malitegharịa
  • Nsonaazụ: omume yiri ya

Mmechi dabere na ule: kernel adịghị emebi emebi

Hypothesis: omume na-ezighi ezi nke netwọk onye ọrụ (ma ọ bụ interface netwọk hypervisor)

  • Nnwale 1: Lelee ntọala firewall gị
  • Nsonaazụ: firewall na-agafe ngwugwu DNS na ma onye ọbịa na GCP
  • Nnwale 2: gbochie okporo ụzọ ma nyochaa izi ezi nke nnyefe na nloghachi nke arịrịọ DNS
  • Nsonaazụ: tcpdump na-akwado na onye ọbịa ahụ enwetala ngwugwu nloghachi

Mmechi dabere na ule: nsogbu adịghị na netwọk

Echiche: ihe nkesa metadata anaghị arụ ọrụ

  • Nnwale 1: lelee ndekọ ihe nkesa metadata maka anomalies
  • Nsonaazụ: ọ dịghị anomalies na ndekọ
  • Nnwale 2: Wepụ ihe nkesa metadata site na dig @8.8.8.8
  • Nsonaazụ: Agbajiri mkpebi ya ọbụlagodi na iji sava metadata

Mmechi dabere na ule: nsogbu abụghị na ihe nkesa metadata

Ekwu bụ: anyị nwalere niile subsystem ma e wezụga mwube ojiri oge!

Ịba n'ime kernel Runtime Settings

Iji hazie ebe mkpochapụ kernel, ị nwere ike iji nhọrọ ahịrị iwu (grub) ma ọ bụ interface sysctl. M lere anya /etc/sysctl.conf ma chee naanị, achọpụtara m ọtụtụ ntọala omenala. N'ịche dị ka a ga-asị na m jidere ihe, atụfuru m ntọala niile na-abụghị netwọk ma ọ bụ ndị na-abụghị tcp, na-anọgide na ntọala ugwu. net.core. Mgbe ahụ, agara m ebe ikike ndị ọbịa dị na VM wee malite itinye ntọala n'otu n'otu, otu na-esote, na VM gbajiri agbaji, ruo mgbe m hụrụ onye mere mpụ:

net.core.rmem_default = 2147483647

Nke a bụ, nhazi nke na-emebi DNS! Achọtara m ngwa agha igbu mmadụ. Ma gịnị mere nke a ji eme? M ka chọrọ ebumnobi.

A na-ahazi nha ngwungwu DNS bụ isi site na net.core.rmem_default. Uru a na-ahụkarị bụ ebe gburugburu 200KiB, mana ọ bụrụ na ihe nkesa gị na-enweta ọtụtụ ngwugwu DNS, ị nwere ike ịbawanye nha nchekwa. Ọ bụrụ na nchekwa ahụ jupụtara mgbe ngwugwu ọhụrụ rutere, dịka ọmụmaatụ n'ihi na ngwa anaghị edozi ya ngwa ngwa, mgbe ahụ ị ga-amalite ịla n'iyi. Onye ahịa anyị na-abawanye nha ihe nchekwa nke ọma n'ihi na ọ na-atụ egwu mfu data, ebe ọ na-eji ngwa maka ịnakọta metrik site na ngwugwu DNS. Uru o debere bụ nke kachasị ike: 231-1 (ọ bụrụ na edobere ya na 231, kernel ga-eweghachite "AKWỤKWỌ Ụjọ Ụgha").

Na mberede achọpụtara m ihe kpatara nmap na scapy ji arụ ọrụ nke ọma: ha na-eji sọket raw! Oghere raw dị iche na sọks mgbe niile: ha na-agafe iptables, ha anaghị echekwa ya!

Mana gịnị kpatara "ihe nchekwa nke ukwuu" ji ebute nsogbu? O doro anya na ọ naghị arụ ọrụ dịka echere.

N'oge a, enwere m ike imepụtaghachi nsogbu ahụ na ọtụtụ kernels na ọtụtụ nkesa. Nsogbu a apụtalarị na kernel 3.x ma ugbu a ọ pụtakwara na kernel 5.x.

N'ezie, mgbe mmalite

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

DNS kwụsịrị ịrụ ọrụ.

Amalitere m ịchọ ụkpụrụ ọrụ site na nchọta ọnụọgụ abụọ dị mfe wee chọpụta na sistemụ ahụ na-arụ ọrụ na 2147481343, mana ọnụọgụ a bụ m nọmba na-enweghị isi. M tụrụ aro ka onye ahịa ahụ nwalee nọmba a, ọ zara na sistemụ ahụ na-arụ ọrụ na google.com, mana ka na-enye njehie na ngalaba ndị ọzọ, yabụ m gara n'ihu nyocha m.

etinyere m nche elekere, ngwá ọrụ ekwesịrị iji mee ihe na mbụ: ọ na-egosi kpọmkwem ebe kernel otu ngwugwu kwụsịrị. Onye mere mpụ bụ ọrụ ahụ udp_queue_rcv_skb. M budata isi mmalite kernel wee tinye ole na ole ọrụ printk iji soro ebe kpọmkwem ngwugwu ahụ kwụsịrị. Achọpụtara m ọnọdụ dị mma ngwa ngwa if, na nanị legidere ya anya ruo oge ụfọdụ, n'ihi na ọ bụ mgbe ahụ ka ihe niile mechara gbakọta n'ime foto dum: 231-1, ọnụ ọgụgụ na-enweghị isi, ngalaba na-adịghị arụ ọrụ ... Ọ bụ mpempe koodu na __udp_enqueue_schedule_skb:

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

Biko mara:

  • rmem bụ ụdị int
  • size bụ nke ụdị u16 (anaghị edebanye aha na iri na isii-bit int) ma na-echekwa nha nke ngwugwu ahụ
  • sk->sk_rcybuf bụ ụdị int ma na-echekwa nha ihe nchekwa nke, site na nkọwa ya, hà nhata uru dị na ya net.core.rmem_default

Mgbe sk_rcvbuf na-eru nso 231, na-achịkọta nha nke ngwugwu nwere ike ịkpata integer njupụta. Ma ebe ọ bụ int, uru ya na-aghọ ihe na-adịghị mma, ya mere ọnọdụ ahụ na-aghọ eziokwu mgbe ọ ga-abụ ụgha (ị nwere ike ịgụkwu banyere nke a na njikọ).

Enwere ike idozi njehie ahụ n'ụzọ dị obere: site na nkedo unsigned int. Etinyere m ihe ndozi ahụ wee malitegharịa sistemụ na DNS rụkwara ọrụ ọzọ.

Ụtọ nke mmeri

E zigara m onye ahịa ihe nchoputa m wee ziga ya LKML kernel patch. Enwere m obi ụtọ: akụkụ ọ bụla nke mgbagwoju anya na-ejikọta ọnụ, enwere m ike ịkọwa kpọmkwem ihe mere anyị ji hụ ihe anyị hụrụ, na nke kachasị mkpa, anyị nwere ike ịchọta ngwọta maka nsogbu ahụ n'ihi ọrụ otu anyị!

Ọ bara uru ịmara na ikpe ahụ tụgharịrị bụrụ nke a na-adịghị ahụkebe, na ọ dabara nke ọma, anyị anaghị enweta arịrịọ mgbagwoju anya site n'aka ndị ọrụ.

Akụkọ gbasara ngwugwu DNS na-efu site na nkwado teknụzụ Google Cloud


isi: www.habr.com

Tinye a comment