Ҳикоя дар бораи гум шудани бастаҳои DNS аз дастгирии техникии Google Cloud

Аз Муҳаррири Блоги Google: Оё шумо ягон бор фикр кардаед, ки муҳандисони Google Cloud Technical Solutions (TSE) дархостҳои дастгирии шуморо чӣ гуна ҳал мекунанд? Муҳандисони дастгирии техникии TSE барои муайян кардан ва ислоҳ кардани манбаъҳои аз ҷониби корбар гузоришшудаи мушкилот масъуланд. Баъзе аз ин мушкилот хеле соддаанд, аммо баъзан шумо ба чипта дучор мешавед, ки якбора диққати якчанд муҳандисро талаб мекунад. Дар ин мақола, яке аз кормандони TSE ба мо дар бораи як мушкилоти хеле душвор аз таҷрибаи охирини худ нақл мекунад - ҳолати гум шудани бастаҳои DNS. Дар ин ҳикоя, мо мебинем, ки муҳандисон чӣ гуна вазъро ҳал карда тавонистанд ва ҳангоми ислоҳи хато онҳо чӣ чизҳои навро омӯхтанд. Умедворем, ки ин ҳикоя на танҳо ба шумо дар бораи хатогиҳои амиқ маълумот медиҳад, балки инчунин ба шумо дар бораи равандҳое, ки ҳангоми пешниҳоди чиптаи дастгирӣ бо Google Cloud меравад, маълумот медиҳад.

Ҳикоя дар бораи гум шудани бастаҳои DNS аз дастгирии техникии Google Cloud

Бартараф кардани мушкилот ҳам илм ва ҳам санъат аст. Ҳамааш аз сохтани гипотеза дар бораи сабаби рафтори ғайристандартии система оғоз мешавад, ки пас аз он барои қувват санҷида мешавад. Бо вуҷуди ин, пеш аз таҳияи гипотеза, мо бояд масъаларо дақиқ муайян ва дақиқ таҳия кунем. Агар савол хеле норавшан садо диҳад, пас шумо бояд ҳама чизро бодиққат таҳлил кунед; Ин "санъати" ҳалли мушкилот аст.

Дар доираи Google Cloud, чунин равандҳо ба таври экспоненсиалӣ мураккабтар мешаванд, зеро Google Cloud кӯшиш мекунад, ки махфияти корбарони худро кафолат диҳад. Аз ин сабаб, муҳандисони TSE барои таҳрир кардани системаҳои шумо дастрасӣ надоранд ва қобилияти дидани конфигуратсияҳоро ба таври васеъ ба мисли корбарон надоранд. Аз ин рӯ, барои санҷидани ягон фарзияи мо, мо (муҳандисон) наметавонем системаро зуд тағир диҳем.

Баъзе корбарон боварӣ доранд, ки мо ҳама чизро ба мисли механикаи хидматрасонии мошин ислоҳ мекунем ва танҳо идентификатори мошини виртуалиро ба мо мефиристем, дар ҳоле ки дар асл ин раванд дар формати гуфтугӯ сурат мегирад: ҷамъоварии маълумот, ташаккул ва тасдиқи (ё рад кардани) фарзияҳо, ва, дар ниҳоят, мушкилоти тасмим ба муошират бо муштарӣ асос ёфтааст.

Мушкилоти мавриди назар

Имрӯз мо як ҳикояе дорем, ки охири хуб дорад. Яке аз са-бабхои бомуваффакият хал шудани кори пешниходшуда хеле муфас-сал ва дуруст тавсифи проблема мебошад. Дар зер шумо метавонед нусхаи чиптаи аввалро бинед (бо мақсади пинҳон кардани маълумоти махфӣ таҳрир карда шудааст):
Ҳикоя дар бораи гум шудани бастаҳои DNS аз дастгирии техникии Google Cloud
Ин паём барои мо бисёр маълумоти муфид дорад:

  • VM мушаххас муайян карда шудааст
  • Худи мушкилот нишон дода шудааст - DNS кор намекунад
  • Он нишон дода мешавад, ки мушкилот дар куҷо зоҳир мешавад - VM ва контейнер
  • Қадамҳои корбар барои муайян кардани мушкилот нишон дода шудаанд.

Дархост ҳамчун "P1: Таъсири муҳим - Хизматрасонӣ дар истеҳсолот корношоям" ба қайд гирифта шудааст, ки маънои мониторинги доимии вазъро дар 24/7 мувофиқи нақшаи "Пайгирии Офтоб" дорад (шумо метавонед бештар дар бораи афзалиятҳои дархостҳои корбарон), бо интиқоли он аз як дастаи дастгирии техникӣ ба дигар бо ҳар як смена минтақаи вақт. Дарвоқеъ, вақте ки мушкилот ба дастаи мо дар Цюрих расида буд, он аллакай тамоми ҷаҳонро давр зада буд. То ин дам, истифодабаранда чораҳои сабуккунанда андешид, аммо аз такрор шудани вазъ дар истеҳсолот метарсид, зеро сабаби аслӣ ҳанӯз ошкор нашудааст.

Вақте ки чипта ба Цюрих расид, мо аллакай маълумоти зеринро дар даст доштем:

  • Мундариҷа /etc/hosts
  • Мундариҷа /etc/resolv.conf
  • хулоса iptables-save
  • Аз ҷониби даста ҷамъ оварда шудааст ngrep файли pcap

Бо ин маълумот мо омода будем, ки марҳилаи "тафтишот" ва ҳалли мушкилотро оғоз кунем.

Қадамҳои аввалини мо

Пеш аз ҳама, мо гузоришҳо ва ҳолати сервери метамаълумотро тафтиш кардем ва боварӣ ҳосил кардем, ки он дуруст кор мекунад. Сервери метамаълумот ба суроғаи IP 169.254.169.254 ҷавоб медиҳад ва дар байни чизҳои дигар, барои идоракунии номҳои домен масъул аст. Мо инчунин бори дигар тафтиш кардем, ки девор бо VM дуруст кор мекунад ва бастаҳоро манъ намекунад.

Ин як навъ мушкили аҷибе буд: санҷиши nmap фарзияи асосии моро дар бораи гум шудани бастаҳои UDP рад кард, аз ин рӯ мо фикран якчанд вариант ва роҳҳои тафтиши онҳоро пайдо кардем:

  • Оё бастаҳо ба таври интихобӣ партофта мешаванд? => Қоидаҳои iptables-ро санҷед
  • Оё он хеле хурд нест? MTU? => Натиҷаро тафтиш кунед ip a show
  • Оё мушкилот танҳо ба бастаҳои UDP ё TCP низ таъсир мерасонад? => Дур кунед dig +tcp
  • Оё бастаҳои ҳосилшуда баргардонида мешаванд? => Дур кунед tcpdump
  • Оё libdns дуруст кор мекунад? => Дур кунед strace барои тафтиш кардани интиқоли пакетҳо дар ҳар ду самт

Дар ин ҷо мо тасмим гирифтем, ки корбарро даъват кунем, то мушкилотро мустақиман ҳал кунад.

Ҳангоми занг мо метавонем якчанд чизро тафтиш кунем:

  • Пас аз якчанд санҷиш мо қоидаҳои iptablesро аз рӯйхати сабабҳо хориҷ мекунем
  • Мо интерфейсҳои шабакавӣ ва ҷадвалҳои масирро тафтиш мекунем ва дурустии MTU-ро дубора тафтиш мекунем
  • Мо инро кашф мекунем dig +tcp google.com (TCP) тавре кор мекунад, ки бояд бошад, аммо dig google.com (UDP) кор намекунад
  • Бо рондан tcpdump то ҳол кор мекунад dig, мо мебинем, ки бастаҳои UDP баргардонида мешаванд
  • Мо меронем strace dig google.com ва мо мебинем, ки чӣ тавр диг дуруст даъват мекунад sendmsg() и recvms(), аммо дуюмаш бо гузашти вақт қатъ мешавад

Мутаассифона, охири смена фаро мерасад ва мо маҷбур мешавем, ки мушкилотро ба минтақаи вақти дигар гузаронем. Аммо ин дархост таваҷҷӯҳи дастаи моро ба вуҷуд овард ва як ҳамкор пешниҳод мекунад, ки бастаи ибтидоии DNS бо истифода аз модули 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())

Ин порча бастаи DNS эҷод мекунад ва дархостро ба сервери метадата мефиристад.

Истифодабаранда кодро иҷро мекунад, ҷавоби DNS баргардонида мешавад ва барнома онро қабул мекунад ва тасдиқ мекунад, ки дар сатҳи шабака мушкилот вуҷуд надорад.

Пас аз боз як «сафари ҷаҳон» дархост ба дастаи мо бармегардад ва ман онро пурра ба худам интиқол медиҳам ва фикр мекунам, ки агар дархост аз як ҷо ба ҷои дигар гардишро қатъ кунад, барои корбар қулайтар мешавад.

Дар айни замон, корбар бо меҳрубонӣ розӣ аст, ки акси тасвири системаро пешниҳод кунад. Ин хабари хеле хуб аст: қобилияти санҷиши системаро худам бартараф кардани мушкилотро тезтар мекунад, зеро ман дигар набояд аз корбар хоҳиш кунам, ки фармонҳоро иҷро кунад, натиҷаҳоро ба ман фиристад ва онҳоро таҳлил кунад, ман ҳама чизро худам карда метавонам!

Хамкасбонам ба ман каме хасад мекунанд. Дар давоми хӯроки нисфирӯзӣ мо конвертатсияро муҳокима мекунем, аммо ҳеҷ кас намедонад, ки чӣ рӯй дода истодааст. Хушбахтона, худи корбар аллакай барои кам кардани оқибатҳо чораҳо андешид ва шитоб намекунад, бинобар ин мо вақт дорем, ки мушкилотро баррасӣ кунем. Ва азбаски мо тасвир дорем, мо метавонем ҳама гуна санҷишҳоеро, ки ба мо таваҷҷӯҳ доранд, иҷро кунем. Аҷоиб!

Қадам ба ақиб

Яке аз маъмултарин саволҳои мусоҳиба барои вазифаҳои муҳандиси системаҳо ин аст: “Вақте ки шумо пинг мекунед, чӣ мешавад www.google.com? Савол бузург аст, зеро номзад бояд ҳама чизро аз ҷабҳа то фазои корбар, ядрои система ва сипас ба шабака тавсиф кунад. Ман табассум мекунам: баъзан саволҳои мусоҳиба дар ҳаёти воқеӣ муфид мешаванд ...

Ман тасмим гирифтам, ки ин саволи HR-ро ба мушкилоти ҷорӣ татбиқ кунам. Тахминан, вақте ки шумо кӯшиши муайян кардани номи DNS-ро мегӯед, инҳо рӯй медиҳанд:

  1. Барнома китобхонаи системаро ба монанди libdns даъват мекунад
  2. libdns конфигуратсияи системаро тафтиш мекунад, ки бо кадом сервери DNS бояд тамос гирад (дар диаграмма ин 169.254.169.254, сервери метамаълумот аст)
  3. libdns зангҳои системаро барои сохтани васлаки UDP (SOKET_DGRAM) истифода мебарад ва бастаҳои UDP-ро бо дархости DNS дар ҳар ду самт мефиристад
  4. Тавассути интерфейси sysctl шумо метавонед стеки UDP-ро дар сатҳи ядро ​​танзим кунед
  5. Ядро бо сахтафзор барои интиқоли бастаҳо тавассути шабака тавассути интерфейси шабака ҳамкорӣ мекунад
  6. Гипервизор ҳангоми тамос бо он бастаро ба сервери метадата интиқол медиҳад
  7. Сервери метамаълумот бо ҷодугарии худ номи DNS-ро муайян мекунад ва бо истифода аз ҳамон усул посух медиҳад

Ҳикоя дар бораи гум шудани бастаҳои DNS аз дастгирии техникии Google Cloud
Ичозат дихед ба шумо хотиррасон кунам, ки мо аллакай кадом гипотезахоро дида баромадем:

Гипотеза: Китобхонаҳои вайроншуда

  • Санҷиши 1: strace-ро дар система иҷро кунед, санҷед, ки диг зангҳои дурусти системаро даъват мекунад
  • Натиҷа: Зангҳои дурусти система даъват карда мешаванд
  • Санҷиши 2: бо истифода аз srapy барои санҷидани он, ки оё мо метавонем номҳоеро, ки аз китобхонаҳои система канорагирӣ мекунанд, муайян кунем
  • Натиҷа: мо метавонем
  • Санҷиши 3: rpm –V-ро дар бастаи libdns ва файлҳои китобхонаи md5sum иҷро кунед
  • Натиҷа: рамзи китобхона комилан ба коди системаи оператсионии корӣ шабеҳ аст
  • Санҷиши 4: тасвири системаи решаи корбарро дар VM бе ин рафтор насб кунед, chroot-ро иҷро кунед, бубинед, ки DNS кор мекунад ё не
  • Натиҷа: DNS дуруст кор мекунад

Хулоса дар асоси санҷишҳо: масъала дар китобхонахо нест

Гипотеза: Дар танзимоти DNS хатогӣ вуҷуд дорад

  • Санҷиши 1: tcpdump-ро тафтиш кунед ва бубинед, ки оё бастаҳои DNS пас аз иҷро кардани диг дуруст фиристода шудаанд ва баргардонида шудаанд
  • Натиҷа: бастаҳо дуруст интиқол дода мешаванд
  • Санҷиши 2: санҷиши дубора дар сервер /etc/nsswitch.conf и /etc/resolv.conf
  • Натиҷа: ҳама чиз дуруст аст

Хулоса дар асоси санҷишҳо: мушкилот бо конфигуратсияи DNS нест

Гипотеза: ядро ​​вайрон шудааст

  • Санҷиш: ядрои навро насб кунед, имзоро тафтиш кунед, аз нав оғоз кунед
  • Натиҷа: рафтори шабеҳ

Хулоса дар асоси санҷишҳо: ядро вайрон нашудааст

Гипотеза: рафтори нодурусти шабакаи корбар (ё интерфейси шабакаи гипервизор)

  • Санҷиши 1: Танзимоти девори худро санҷед
  • Натиҷа: брандмауэр бастаҳои DNS-ро ҳам аз ҳост ва ҳам GCP мегузарад
  • Санҷиши 2: трафикро боздоред ва дурустии интиқол ва баргардонидани дархостҳои DNS-ро назорат кунед
  • Натиҷа: tcpdump тасдиқ мекунад, ки мизбон бастаҳои бозгаштро гирифтааст

Хулоса дар асоси санҷишҳо: мушкилот дар шабака нест

Гипотеза: сервери метадата кор намекунад

  • Санҷиши 1: гузоришҳои сервери метадатаро барои аномалияҳо тафтиш кунед
  • Натиҷа: дар гузоришҳо ягон аномалия вуҷуд надорад
  • Санҷиши 2: Сервери метамаълумотро тавассути dig @8.8.8.8
  • Натиҷа: Ҳатто бидуни истифодаи сервери метадата қатънома вайрон мешавад

Хулоса дар асоси санҷишҳо: мушкилот бо сервери метадата нест

Поёни хати: мо ҳама зерсистемаҳоро санҷидем, ба истиснои танзимоти вақти корӣ!

Гузариш ба Танзимоти Runtime Kernel

Барои танзим кардани муҳити иҷрои ядро, шумо метавонед имконоти сатри фармон (grub) ё интерфейси sysctl -ро истифода баред. Ман ба дарун нигаристам /etc/sysctl.conf ва танҳо фикр кунед, ки ман якчанд танзимоти фармоиширо кашф кардам. Эҳсос кардам, ки гӯё чизеро гирифта бошам, ман ҳама танзимоти ғайришабакавӣ ё ғайри tcp-ро, ки бо танзимоти кӯҳӣ боқӣ мондам, партофтам. net.core. Пас аз он ман ба он ҷое, ки иҷозатҳои мизбон дар VM буданд, рафтам ва танзимҳоро як ба як, паси дигаре бо VM шикаста ба кор андохтам, то даме ки гунаҳкорро пайдо кунам:

net.core.rmem_default = 2147483647

Ин аст, конфигуратсияи вайронкунандаи DNS! Ман силоҳи кушторро ёфтам. Аммо чаро ин рӯй медиҳад? Ба ман ҳанӯз як ангеза лозим буд.

Андозаи асосии буфери бастаи DNS тавассути танзим карда мешавад net.core.rmem_default. Арзиши маъмулӣ тақрибан 200KiB аст, аммо агар сервери шумо бастаҳои зиёди DNS-ро қабул кунад, шумо метавонед андозаи буферро зиёд кунед. Агар буфер ҳангоми расидани бастаи нав пур шавад, масалан, аз сабаби он ки барнома онро ба қадри кофӣ зуд коркард намекунад, пас шумо аз даст додани бастаҳо шурӯъ мекунед. Мизоҷи мо андозаи буферро дуруст зиёд кард, зеро ӯ аз талафи маълумот метарсид, зеро вай аз барнома барои ҷамъоварии ченакҳо тавассути бастаҳои DNS истифода мекард. Қимати муқарраркардаи ӯ ҳадди имконпазир буд: 231-1 (агар ба 231 муқаррар карда шавад, ядро ​​​​"АРГУМЕНТИ БЕЪТИБОР"-ро бармегардонад).

Ногаҳон ман фаҳмидам, ки чаро nmap ва scapy дуруст кор мекунанд: онҳо розеткаҳои хомро истифода мебурданд! Розеткаҳои хом аз розеткаҳои муқаррарӣ фарқ мекунанд: онҳо iptables-ро мегузаранд ва буферӣ карда намешаванд!

Аммо чаро "буфер аз ҳад калон" мушкилотро ба вуҷуд меорад? Он бешубҳа тавре кор намекунад.

Дар ин лаҳза ман метавонам мушкилотро дар ядроҳои сершумор ва тақсимоти сершумор дубора тавлид кунам. Мушкилот аллакай дар ядрои 3.x пайдо шуда буд ва ҳоло он дар ядрои 5.x низ пайдо шуд.

Дар ҳақиқат, ҳангоми оғозёбӣ

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

DNS кор карданро қатъ кард.

Ман ба ҷустуҷӯи арзишҳои корӣ тавассути як алгоритми оддии ҷустуҷӯи дуӣ шурӯъ кардам ва дарёфтам, ки система бо 2147481343 кор мекунад, аммо ин рақам барои ман як маҷмӯи рақамҳо буд. Ман ба муштарӣ пешниҳод кардам, ки ин рақамро санҷад ва ӯ ҷавоб дод, ки система бо google.com кор мекунад, аммо ба ҳар ҳол бо доменҳои дигар хатогӣ дод, бинобар ин ман тафтишотро идома додам.

насб кардам dropwatch, асбобе, ки бояд қаблан истифода мешуд: он маҳз дар куҷо бастаи ядроро нишон медиҳад. Гунаҳкор функсия буд udp_queue_rcv_skb. Ман манбаъҳои ядроро зеркашӣ кардам ва чандто илова кардам функсияҳо printk барои пайгирӣ кардани маҳз дар куҷо баста шудани баста. Ман зуд вазъияти дурустро ёфтам if, ва андаке ба он нигарист, зеро махз дар хамин вакт хама чиз нихоят ба як расми том гирд омада буд: 231-1, раками бемаъно, домени корношоям... Ин як пораи код дар __udp_enqueue_schedule_skb:

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

Илтимос дар хотир гиред:

  • rmem навъи int мебошад
  • size навъи u16 аст (инти беимзо шонздаҳ-бит) ва андозаи бастаро нигоҳ медорад
  • sk->sk_rcybuf навъи int аст ва андозаи буферро нигоҳ медорад, ки мувофиқи таъриф ба арзиши дар net.core.rmem_default

Ҳангоми sk_rcvbuf ба 231 наздик мешавад, ҷамъбасти андозаи баста метавонад ба натиҷа расонад пур шудани адад. Ва азбаски он int аст, арзиши он манфӣ мешавад, бинобар ин шарт вақте ки он бояд дурӯғ бошад, дуруст мешавад (шумо метавонед дар ин бора бештар хонед. пайванд).

Хатогиро метавон бо роҳи ночиз ислоҳ кард: тавассути рехтан unsigned int. Ман ислоҳро татбиқ кардам ва системаро аз нав оғоз кардам ва DNS дубора кор кард.

Бичашед

Ман бозёфтҳои худро ба муштарӣ фиристодам ва фиристодам LKML патч ядро. Ман хурсандам: ҳар як порчаи муаммо бо ҳам мувофиқат мекунад, ман метавонам дақиқ фаҳмонам, ки чаро мо он чизеро, ки мушоҳида кардем, мушоҳида кардем ва муҳимтар аз ҳама, мо ба шарофати кори дастаамон тавонистем роҳи ҳалли мушкилотро пайдо кунем!

Бояд эътироф кард, ки ин парванда нодир буд ва хушбахтона, мо чунин дархостҳои мураккабро аз корбарон хеле кам мегирем.

Ҳикоя дар бораи гум шудани бастаҳои DNS аз дастгирии техникии Google Cloud


Манбаъ: will.com

Илова Эзоҳ