Itan kan nipa sisọnu awọn apo-iwe DNS lati atilẹyin imọ-ẹrọ Google awọsanma

Lati Google Blog Olootu: Njẹ o ti ṣe iyalẹnu bii Google Cloud Technical Solutions (TSE) awọn onimọ-ẹrọ ṣe n ṣakoso awọn ibeere atilẹyin rẹ? Awọn onimọ-ẹrọ atilẹyin imọ-ẹrọ TSE jẹ iduro fun idamo ati ṣatunṣe awọn orisun ijabọ olumulo ti awọn iṣoro. Diẹ ninu awọn iṣoro wọnyi rọrun pupọ, ṣugbọn nigbami o wa tikẹti kan ti o nilo akiyesi ọpọlọpọ awọn onimọ-ẹrọ ni ẹẹkan. Ninu nkan yii, ọkan ninu awọn oṣiṣẹ TSE yoo sọ fun wa nipa iṣoro ẹtan pupọ kan lati iṣe iṣe rẹ laipẹ - irú ti sonu DNS awọn apo-iwe. Ninu itan yii, a yoo rii bii awọn onimọ-ẹrọ ṣe ṣakoso lati yanju ipo naa, ati kini awọn nkan tuntun ti wọn kọ lakoko ti n ṣatunṣe aṣiṣe naa. A nireti pe itan yii kii ṣe kọ ẹkọ nikan nipa kokoro ti o jinle, ṣugbọn o tun fun ọ ni oye si awọn ilana ti o lọ sinu iforukọsilẹ tikẹti atilẹyin pẹlu Google Cloud.

Itan kan nipa sisọnu awọn apo-iwe DNS lati atilẹyin imọ-ẹrọ Google awọsanma

Laasigbotitusita jẹ mejeeji a Imọ ati awọn ẹya aworan. Gbogbo rẹ bẹrẹ pẹlu kikọ idawọle kan nipa idi ti ihuwasi ti kii ṣe deede ti eto, lẹhin eyi o ni idanwo fun agbara. Bibẹẹkọ, ki a to ṣe agbekalẹ idawọle kan, a gbọdọ ṣalaye ni kedere ati ṣe agbekalẹ iṣoro naa ni pipe. Ti ibeere naa ba dun pupọ, lẹhinna o yoo ni lati ṣe itupalẹ ohun gbogbo ni pẹkipẹki; Eyi ni “aworan” ti laasigbotitusita.

Labẹ Google Cloud, iru awọn ilana di idiju pupọ sii, bi Google Cloud ṣe ngbiyanju ohun ti o dara julọ lati ṣe iṣeduro asiri ti awọn olumulo rẹ. Nitori eyi, awọn onimọ-ẹrọ TSE ko ni aye lati satunkọ awọn eto rẹ, tabi agbara lati wo awọn atunto bi gbooro bi awọn olumulo ṣe. Nitorinaa, lati ṣe idanwo eyikeyi awọn idawọle wa, awa (awọn onimọ-ẹrọ) ko le yipada eto naa ni iyara.

Diẹ ninu awọn olumulo gbagbọ pe a yoo ṣe atunṣe ohun gbogbo bii awọn ẹrọ ẹrọ ni iṣẹ ọkọ ayọkẹlẹ kan, ati nirọrun firanṣẹ id ti ẹrọ foju kan wa, lakoko ti o jẹ pe ni otitọ ilana naa waye ni ọna ibaraẹnisọrọ kan: ikojọpọ alaye, ṣiṣẹda ati ifẹsẹmulẹ (tabi tako) awọn idawọle, ati, ni ipari, awọn iṣoro ipinnu kan da lori ibaraẹnisọrọ pẹlu alabara.

Isoro ni ibeere

Loni a ni itan kan pẹlu ipari to dara. Ọkan ninu awọn idi fun ipinnu aṣeyọri ti ọran ti a dabaa jẹ alaye pupọ ati apejuwe deede ti iṣoro naa. Ni isalẹ o le wo ẹda tikẹti akọkọ (ti a ṣatunkọ lati tọju alaye asiri):
Itan kan nipa sisọnu awọn apo-iwe DNS lati atilẹyin imọ-ẹrọ Google awọsanma
Ifiranṣẹ yii ni ọpọlọpọ alaye to wulo fun wa:

  • Specific VM pato
  • Iṣoro naa funrararẹ jẹ itọkasi - DNS ko ṣiṣẹ
  • O ti wa ni itọkasi ibi ti awọn isoro farahan ara - VM ati eiyan
  • Awọn igbesẹ ti olumulo ṣe lati ṣe idanimọ iṣoro naa jẹ itọkasi.

Ibeere naa ti forukọsilẹ bi “P1: Ipa pataki - Iṣẹ Ailokun ni iṣelọpọ”, eyiti o tumọ si ibojuwo igbagbogbo ti ipo 24/7 ni ibamu si ero “Tẹle oorun” (o le ka diẹ sii nipa ayo olumulo ibeere), pẹlu gbigbe rẹ lati ẹgbẹ atilẹyin imọ-ẹrọ kan si omiiran pẹlu iyipada agbegbe akoko kọọkan. Ni otitọ, nigba ti iṣoro naa de ẹgbẹ wa ni Zurich, o ti yika agbaye tẹlẹ. Ni akoko yii, olumulo ti ṣe awọn igbese idinku, ṣugbọn o bẹru ti atunwi ipo naa ni iṣelọpọ, nitori idi root ko tii ṣe awari.

Ni akoko tikẹti naa de Zurich, a ti ni alaye atẹle tẹlẹ ni ọwọ:

  • Akoonu /etc/hosts
  • Akoonu /etc/resolv.conf
  • ipari iptables-save
  • Ijọpọ nipasẹ ẹgbẹ ngrep pcap faili

Pẹlu data yii, a ti ṣetan lati bẹrẹ “iwadii” ati ipele laasigbotitusita.

Awọn igbesẹ akọkọ wa

Ni akọkọ, a ṣayẹwo awọn akọọlẹ ati ipo olupin metadata ati rii daju pe o n ṣiṣẹ ni deede. Olupin metadata ṣe idahun si adiresi IP 169.254.169.254 ati, ninu awọn ohun miiran, jẹ iduro fun ṣiṣakoso awọn orukọ-ašẹ. A tun ṣayẹwo lẹẹmeji pe ogiriina ṣiṣẹ ni deede pẹlu VM ati pe ko ṣe idiwọ awọn apo-iwe.

O jẹ diẹ ninu iru iṣoro ajeji: ayẹwo nmap tako idawọle akọkọ wa nipa isonu ti awọn apo-iwe UDP, nitorinaa a wa ni ọpọlọ pẹlu ọpọlọpọ awọn aṣayan diẹ sii ati awọn ọna lati ṣayẹwo wọn:

  • Ṣe awọn apo-iwe silẹ ni yiyan bi? => Ṣayẹwo awọn ofin iptables
  • Ṣe ko kere ju? MTU? => Ṣayẹwo jade ip a show
  • Ṣe iṣoro naa ni ipa lori awọn apo-iwe UDP nikan tabi TCP daradara? => Wakọ kuro dig +tcp
  • Ti wa ni ma wà ti ipilẹṣẹ awọn apo-iwe pada? => Wakọ kuro tcpdump
  • Njẹ awọn libdn n ṣiṣẹ ni deede? => Wakọ kuro strace lati ṣayẹwo awọn gbigbe ti awọn apo-iwe ni awọn itọnisọna mejeeji

Nibi a pinnu lati pe olumulo si awọn iṣoro laasigbotitusita laaye.

Lakoko ipe a ni anfani lati ṣayẹwo awọn nkan pupọ:

  • Lẹhin awọn sọwedowo pupọ a yọ awọn ofin iptables kuro ninu atokọ awọn idi
  • A ṣayẹwo awọn atọkun nẹtiwọki ati awọn tabili ipa-ọna, ati ṣayẹwo lẹẹmeji pe MTU tọ
  • A ṣawari iyẹn dig +tcp google.com (TCP) ṣiṣẹ bi o ti yẹ, ṣugbọn dig google.com (UDP) ko ṣiṣẹ
  • Lehin lé kuro tcpdump o tun n ṣiṣẹ dig, a rii pe awọn apo-iwe UDP ti wa ni pada
  • A wakọ kuro strace dig google.com ati awọn ti a ri bi ma wà awọn ipe ti tọ sendmsg() и recvms(), sibẹsibẹ awọn keji ti wa ni Idilọwọ nipasẹ kan akoko

Laanu, opin iṣipopada naa de ati pe a fi agbara mu lati mu iṣoro naa pọ si agbegbe aago atẹle. Ibeere naa, sibẹsibẹ, fa iwulo ninu ẹgbẹ wa, ati pe ẹlẹgbẹ kan ni imọran ṣiṣẹda package DNS akọkọ ni lilo module 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())

Ajeku yii ṣẹda apo-iwe DNS kan ati firanṣẹ ibeere naa si olupin metadata.

Olumulo naa nṣiṣẹ koodu naa, idahun DNS ti pada, ati pe ohun elo naa gba, jẹrisi pe ko si iṣoro ni ipele nẹtiwọki.

Lẹhin “irin-ajo-yika-aye” miiran, ibeere naa pada si ẹgbẹ wa, ati pe Mo gbe lọ si ara mi patapata, ni ironu pe yoo rọrun diẹ sii fun olumulo ti ibeere naa ba duro yika lati ibi de ibi.

Lakoko, olumulo naa fi inurere gba lati pese aworan aworan eto naa. Eyi jẹ iroyin ti o dara pupọ: agbara lati ṣe idanwo eto funrararẹ jẹ ki iṣoro laasigbotitusita yiyara, nitori Emi ko ni lati beere lọwọ olumulo lati ṣiṣẹ awọn aṣẹ, firanṣẹ awọn abajade ati itupalẹ wọn, Mo le ṣe ohun gbogbo funrararẹ!

Awọn ẹlẹgbẹ mi bẹrẹ lati ṣe ilara mi diẹ. Lori ounjẹ ọsan a jiroro lori iyipada, ṣugbọn ko si ẹnikan ti o ni imọran ohun ti n ṣẹlẹ. O da, olumulo funrararẹ ti ṣe awọn igbese lati dinku awọn abajade ati pe ko yara, nitorinaa a ni akoko lati pin iṣoro naa. Ati pe niwon a ni aworan kan, a le ṣiṣe awọn idanwo eyikeyi ti o nifẹ si wa. Nla!

Gbigbe igbesẹ kan pada

Ọkan ninu awọn ibeere ifọrọwanilẹnuwo olokiki julọ fun awọn ipo ẹrọ ẹrọ ni: “Kini o ṣẹlẹ nigbati o ba ping www.google.com? Ibeere naa jẹ nla, niwon oludije nilo lati ṣe apejuwe ohun gbogbo lati ikarahun si aaye olumulo, si ekuro eto ati lẹhinna si nẹtiwọki. Mo rẹrin musẹ: nigbakan awọn ibeere ifọrọwanilẹnuwo wa jade lati wulo ni igbesi aye gidi…

Mo pinnu lati lo ibeere HR yii si iṣoro lọwọlọwọ. Ni aijọju sisọ, nigbati o ba gbiyanju lati pinnu orukọ DNS kan, atẹle naa yoo ṣẹlẹ:

  1. Ohun elo naa pe ile-ikawe eto bii libdns
  2. libdns ṣayẹwo iṣeto eto eyiti olupin DNS yẹ ki o kan si (ninu aworan apẹrẹ eyi jẹ 169.254.169.254, olupin metadata)
  3. libdns nlo awọn ipe eto lati ṣẹda iho UDP kan (SOKET_DGRAM) ati firanṣẹ awọn apo-iwe UDP pẹlu ibeere DNS ni awọn itọnisọna mejeeji.
  4. Nipasẹ wiwo sysctl o le tunto akopọ UDP ni ipele ekuro
  5. Ekuro ṣe ajọṣepọ pẹlu ohun elo lati tan kaakiri awọn apo-iwe lori nẹtiwọọki nipasẹ wiwo nẹtiwọọki
  6. Awọn hypervisor mu ati ki o atagba awọn soso si awọn metadata olupin lori olubasọrọ pẹlu rẹ
  7. Olupin metadata, nipasẹ idan rẹ, pinnu orukọ DNS ati da esi pada nipa lilo ọna kanna

Itan kan nipa sisọnu awọn apo-iwe DNS lati atilẹyin imọ-ẹrọ Google awọsanma
Jẹ ki n ṣe iranti rẹ kini awọn idawọle ti a ti gbero tẹlẹ:

Itumọ: Awọn ile-ikawe ti o bajẹ

  • Idanwo 1: ṣiṣe strace ninu eto, ṣayẹwo pe ma wà awọn ipe awọn ipe eto to pe
  • Esi: Awọn ipe eto to pe ni a pe
  • Idanwo 2: lilo srapy lati ṣayẹwo boya a le pinnu awọn orukọ ti o kọja awọn ile-ikawe eto
  • Abajade: a le
  • Idanwo 3: ṣiṣe rpm –V lori package libdns ati awọn faili ikawe md5sum
  • Abajade: koodu ikawe jẹ aami aami patapata si koodu inu ẹrọ ṣiṣe
  • Idanwo 4: gbe aworan eto gbongbo olumulo sori VM laisi ihuwasi yii, ṣiṣẹ chroot, rii boya DNS ṣiṣẹ
  • Abajade: DNS ṣiṣẹ ni deede

Ipari da lori awọn idanwo: iṣoro naa ko si ninu awọn ile-ikawe

Itumọ: Aṣiṣe kan wa ninu awọn eto DNS

  • Idanwo 1: ṣayẹwo tcpdump ki o rii boya awọn apo-iwe DNS ti firanṣẹ ati pada ni deede lẹhin ṣiṣiṣẹ dig
  • Esi: awọn apo-iwe ti wa ni gbigbe ni deede
  • Idanwo 2: ṣayẹwo lẹẹmeji lori olupin naa /etc/nsswitch.conf и /etc/resolv.conf
  • Abajade: ohun gbogbo tọ

Ipari da lori awọn idanwo: iṣoro naa kii ṣe pẹlu iṣeto DNS

Hypothesis: mojuto ti bajẹ

  • Idanwo: fi ekuro tuntun sori ẹrọ, ṣayẹwo ibuwọlu, tun bẹrẹ
  • Esi: iru iwa

Ipari da lori awọn idanwo: ekuro ko baje

Itumọ: ihuwasi aṣiṣe ti nẹtiwọọki olumulo (tabi wiwo nẹtiwọọki hypervisor)

  • Idanwo 1: Ṣayẹwo awọn eto ogiriina rẹ
  • Esi: ogiriina kọja awọn apo-iwe DNS lori agbalejo ati GCP
  • Idanwo 2: idaduro ijabọ ati ṣe atẹle deede ti gbigbe ati ipadabọ ti awọn ibeere DNS
  • Esi: tcpdump jẹrisi pe agbalejo ti gba awọn apo-iwe ipadabọ

Ipari da lori awọn idanwo: iṣoro naa ko si ni nẹtiwọọki

Itumọ: olupin metadata ko ṣiṣẹ

  • Idanwo 1: ṣayẹwo awọn igbasilẹ olupin metadata fun awọn aiṣedeede
  • Esi: ko si asemase ninu awọn àkọọlẹ
  • Idanwo 2: Fori olupin metadata nipasẹ dig @8.8.8.8
  • Esi: Opinnu ti bajẹ paapaa laisi lilo olupin metadata kan

Ipari da lori awọn idanwo: iṣoro naa kii ṣe pẹlu olupin metadata

Isalẹ ila: a ni idanwo gbogbo subsystems ayafi asiko isise!

Lilọ sinu awọn Eto akoko asiko Kernel

Lati tunto agbegbe ipaniyan ekuro, o le lo awọn aṣayan laini aṣẹ (grub) tabi wiwo sysctl. Mo wo inu /etc/sysctl.conf ati ki o kan ro, Mo ti se awari orisirisi aṣa eto. Ni rilara bi ẹnipe Mo ti di nkan kan, Mo sọ gbogbo awọn eto ti kii ṣe nẹtiwọọki tabi ti kii ṣe tcp, ti o ku pẹlu awọn eto oke net.core. Lẹhinna Mo lọ si ibiti awọn igbanilaaye agbalejo wa ninu VM ati bẹrẹ lilo awọn eto ni ọkọọkan, ọkan lẹhin ekeji, pẹlu VM ti o fọ, titi emi o fi rii ẹlẹṣẹ naa:

net.core.rmem_default = 2147483647

Nibi o wa, atunto fifọ DNS kan! Mo ti ri ohun ija ipaniyan. Ṣugbọn kilode ti eyi n ṣẹlẹ? Mo tun nilo idi kan.

Iwọn apo idalẹnu DNS ipilẹ jẹ tunto nipasẹ net.core.rmem_default. Iye aṣoju jẹ ibikan ni ayika 200KiB, ṣugbọn ti olupin rẹ ba gba ọpọlọpọ awọn apo-iwe DNS, o le fẹ lati mu iwọn ifipamọ pọ sii. Ti ifipamọ ba kun nigbati soso tuntun ba de, fun apẹẹrẹ nitori pe ohun elo naa ko ṣiṣẹ ni iyara to, lẹhinna o yoo bẹrẹ sisọnu awọn apo-iwe. Onibara wa ni deede pọ si iwọn ifipamọ nitori o bẹru pipadanu data, nitori o nlo ohun elo kan fun gbigba awọn metiriki nipasẹ awọn apo-iwe DNS. Iye ti o ṣeto ni o pọju ti o ṣeeṣe: 231-1 (ti o ba ṣeto si 231, ekuro yoo pada "Ijiyan INVALID").

Lojiji Mo rii idi ti nmap ati scapy ṣiṣẹ ni deede: wọn nlo awọn iho aise! Awọn iho aise yatọ si awọn iho ti o ṣe deede: wọn kọja awọn iptables, ati pe wọn ko ni ifipamọ!

Ṣugbọn kilode ti “fififipamọ tobi ju” fa awọn iṣoro? O han gbangba ko ṣiṣẹ bi a ti pinnu.

Ni aaye yii Mo le ṣe ẹda iṣoro naa lori awọn ekuro pupọ ati awọn pinpin pupọ. Iṣoro naa ti han tẹlẹ lori ekuro 3.x ati bayi o tun han lori ekuro 5.x.

Nitootọ, ni ibẹrẹ

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

DNS duro ṣiṣẹ.

Mo bẹrẹ wiwa awọn iye iṣẹ nipasẹ algorithm wiwa alakomeji ti o rọrun ati rii pe eto naa ṣiṣẹ pẹlu 2147481343, ṣugbọn nọmba yii jẹ eto awọn nọmba ti ko ni itumọ si mi. Mo daba pe alabara gbiyanju nọmba yii, o dahun pe eto naa ṣiṣẹ pẹlu google.com, ṣugbọn tun fun aṣiṣe pẹlu awọn ibugbe miiran, nitorinaa Mo tẹsiwaju iwadii mi.

Mo ti fi sori ẹrọ aago silẹ, Ọpa kan ti o yẹ ki o ti lo ni iṣaaju: o fihan ni pato ibiti o wa ninu ekuro apo kan pari. Awọn ẹlẹṣẹ wà ni iṣẹ udp_queue_rcv_skb. Mo ṣe igbasilẹ awọn orisun kernel ati ṣafikun diẹ sii awọn iṣẹ printk lati orin ibi ti gangan soso dopin soke. Mo yara ri ipo ti o tọ if, ati ki o kan tẹjumọ rẹ fun igba diẹ, nitori pe o jẹ lẹhinna pe ohun gbogbo wa nikẹhin sinu gbogbo aworan: 231-1, nọmba ti ko ni itumọ, aaye ti kii ṣe iṣẹ ... O jẹ koodu koodu kan ninu __udp_enqueue_schedule_skb:

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

Jowo se akiyesi:

  • rmem jẹ ti iru int
  • size jẹ ti iru u16 (unsigned mẹrindilogun-bit int) ati ki o tọjú awọn soso iwọn
  • sk->sk_rcybuf jẹ ti iru int ati pe o tọju iwọn ifipamọ eyiti, nipasẹ asọye, jẹ dogba si iye ninu net.core.rmem_default

Nigbawo sk_rcvbuf yonuso 231, summing awọn soso iwọn le ja si ni odidi aponsedanu. Ati pe nitori pe o jẹ int, iye rẹ di odi, nitorinaa ipo naa di otitọ nigbati o yẹ ki o jẹ eke (o le ka diẹ sii nipa eyi ni ọna asopọ).

Aṣiṣe naa le ṣe atunṣe ni ọna ti o kere: nipa simẹnti unsigned int. Mo lo atunṣe naa ati tun bẹrẹ eto naa ati DNS tun ṣiṣẹ lẹẹkansi.

Lenu ti isegun

Mo firanṣẹ awọn awari mi si alabara ati firanṣẹ LKML alemo ekuro. Inu mi dun: gbogbo nkan ti adojuru naa ni ibamu, Mo le ṣalaye ni pato idi ti a ṣe akiyesi ohun ti a ṣe akiyesi, ati ni pataki julọ, a ni anfani lati wa ojutu kan si iṣoro naa ọpẹ si iṣẹ ẹgbẹ wa!

O tọ lati mọ pe ọran naa ti jade lati jẹ toje, ati ni oriire a ṣọwọn gba iru awọn ibeere idiju lati ọdọ awọn olumulo.

Itan kan nipa sisọnu awọn apo-iwe DNS lati atilẹyin imọ-ẹrọ Google awọsanma


orisun: www.habr.com

Fi ọrọìwòye kun