Sargieties no ievainojamÄ«bām, kas liek strādāt. 1. daļa: FragmentSmack/SegmentSmack

Sargieties no ievainojamÄ«bām, kas liek strādāt. 1. daļa: FragmentSmack/SegmentSmack

Sveiki visiem! Mani sauc Dmitrijs Samsonovs, es strādāju par vadoÅ”o sistēmas administratoru uzņēmumā Odnoklassniki. Mums ir vairāk nekā 7 tÅ«kstoÅ”i fizisko serveru, 11 tÅ«kstoÅ”i konteineru mākonÄ« un 200 aplikācijas, kas dažādās konfigurācijās veido 700 dažādus klasterus. Lielākajā daļā serveru darbojas CentOS 7.
14. gada 2018. augustā tika publicēta informācija par FragmentSmack ievainojamību
(CVE-2018-5391) un SegmentSmack (CVE-2018-5390). Tās ir ievainojamÄ«bas ar tÄ«kla uzbrukuma vektoru un diezgan augstu punktu skaitu (7.5), kas apdraud pakalpojuma atteikumu (DoS) resursu izsmelÅ”anas (CPU) dēļ. Kodola labojums FragmentSmack tobrÄ«d netika piedāvāts, turklāt tas iznāca daudz vēlāk, nekā tika publicēta informācija par ievainojamÄ«bu. Lai novērstu SegmentSmack, tika ierosināts atjaunināt kodolu. Pati atjaunināŔanas pakotne tika izlaista tajā paŔā dienā, atlika tikai to instalēt.
Nē, mēs vispār neesam pret kodola atjaunināŔanu! Tomēr ir nianses...

Kā mēs atjauninām kodolu ražoÅ”anā

Kopumā nekas sarežģīts:

  1. Lejupielādēt pakotnes;
  2. Instalējiet tos vairākos serveros (tostarp serveros, kas mitina mūsu mākoni);
  3. Pārliecinieties, ka nekas nav salauzts;
  4. Pārliecinieties, vai visi standarta kodola iestatījumi tiek lietoti bez kļūdām;
  5. Pagaidiet dažas dienas;
  6. Pārbaudiet servera veiktspēju;
  7. Pārslēgt jaunu serveru izvietoÅ”anu uz jauno kodolu;
  8. Atjauniniet visus serverus pēc datu centra (vienā datu centrā, lai problēmu gadījumā samazinātu ietekmi uz lietotājiem);
  9. Pārstartējiet visus serverus.

Atkārtojiet to visiem mūsu kodolu atzariem. Šobrīd tas ir:

Kā jau varēja uzminēt, tÅ«kstoÅ”iem serveru pārstartÄ“Å”ana aizņem visilgāko laiku. Tā kā ne visas ievainojamÄ«bas ir kritiskas visiem serveriem, mēs atsāknējam tikai tos, kas ir tieÅ”i pieejami no interneta. MākonÄ«, lai neierobežotu elastÄ«bu, mēs nepiesaistām ārēji pieejamos konteinerus atseviŔķiem serveriem ar jaunu kodolu, bet pārstartējam visus saimniekdatorus bez izņēmuma. Par laimi, procedÅ«ra tur ir vienkārŔāka nekā ar parastajiem serveriem. Piemēram, atsāknÄ“Å”anas laikā konteineri bez statusa var vienkārÅ”i pārvietoties uz citu serveri.

Tomēr darba joprojām ir daudz, un tas var ilgt vairākas nedēļas, un, ja rodas problēmas ar jauno versiju, lÄ«dz pat vairākiem mēneÅ”iem. Uzbrucēji to ļoti labi saprot, tāpēc viņiem ir nepiecieÅ”ams plāns B.

FragmentSmack/SegmentSmack. Apiet

Par laimi, dažām ievainojamÄ«bām pastāv Ŕāds plāns B, un to sauc par risinājumu. Visbiežāk tās ir kodola/lietojumprogrammas iestatÄ«jumu izmaiņas, kas var samazināt iespējamo efektu vai pilnÄ«bā novērst ievainojamÄ«bu izmantoÅ”anu.

FragmentSmack/SegmentSmack gadījumā tika ierosināts Šāds risinājums:

Ā«Varat mainÄ«t noklusējuma vērtÄ«bas 4MB un 3MB failos net.ipv4.ipfrag_high_thresh un net.ipv4.ipfrag_low_thresh (un to ekvivalentos ipv6 net.ipv6.ipfrag_high_thresh un net.ipv6.ipfrag_low_thresh) uz attiecÄ«gi 256 vai kB un kB. zemāks. Testi uzrāda nelielu lÄ«dz ievērojamu CPU lietojuma kritumu uzbrukuma laikā atkarÄ«bā no aparatÅ«ras, iestatÄ«jumiem un apstākļiem. Tomēr ipfrag_high_thresh=192 baiti var ietekmēt veiktspēju, jo montāžas rindā vienlaikus var ietilpt tikai divi 262144 64 fragmenti. Piemēram, pastāv risks, ka lietojumprogrammas, kas strādā ar lielām UDP paketēm, sabojāsies'.

PaŔi parametri kodola dokumentācijā aprakstīts Ŕādi:

ipfrag_high_thresh - LONG INTEGER
    Maximum memory used to reassemble IP fragments.

ipfrag_low_thresh - LONG INTEGER
    Maximum memory used to reassemble IP fragments before the kernel
    begins to remove incomplete fragment queues to free up resources.
    The kernel still accepts new fragments for defragmentation.

Mums nav lielu UDP ražoÅ”anas pakalpojumiem. Vietējā tÄ«klā nav sadrumstalotas trafika; WAN ir sadrumstalota trafika, taču tā nav nozÄ«mÄ«ga. Nav nekādu pazÄ«mju ā€” varat ieviest risinājumu!

FragmentSmack/SegmentSmack. Pirmās asinis

Pirmā problēma, ar ko mēs saskārāmies, bija tā, ka mākoņa konteineri dažreiz lietoja jaunos iestatÄ«jumus tikai daļēji (tikai ipfrag_low_thresh), un dažreiz tos neizmantoja vispār ā€” tie vienkārÅ”i avarēja sākumā. Problēmu nebija iespējams stabili reproducēt (visi iestatÄ«jumi tika lietoti manuāli bez jebkādām grÅ«tÄ«bām). Saprast, kāpēc konteiners avarē sākumā, arÄ« nav tik vienkārÅ”i: kļūdas netika atrastas. Viena lieta bija droÅ”a: iestatÄ«jumu atgrieÅ”ana atrisina konteinera avāriju problēmu.

Kāpēc nepietiek ar Sysctl lietoÅ”anu resursdatorā? Konteiners atrodas savā Ä«paŔā tÄ«klā Namespace, tāpēc vismaz daļa no tÄ«kla Sysctl parametriem konteinerā var atŔķirties no saimniekdatora.

Kā tieÅ”i Sysctl iestatÄ«jumi tiek lietoti konteinerā? Tā kā mÅ«su konteineri nav priviliģēti, jÅ«s nevarēsit mainÄ«t nevienu Sysctl iestatÄ«jumu, ieejot paŔā konteinerā ā€” jums vienkārÅ”i nav pietiekami daudz tiesÄ«bu. Lai darbinātu konteinerus, mÅ«su mākonis tajā laikā izmantoja Docker (tagad Podmans). Jaunā konteinera parametri tika nodoti Docker, izmantojot API, ieskaitot nepiecieÅ”amos Sysctl iestatÄ«jumus.
Pārmeklējot versijas, izrādÄ«jās, ka Docker API neatgrieza visas kļūdas (vismaz versijā 1.10). Kad mēģinājām iedarbināt konteineru, izmantojot ā€œdocker runā€, mēs beidzot redzējām vismaz kaut ko:

write /proc/sys/net/ipv4/ipfrag_high_thresh: invalid argument docker: Error response from daemon: Cannot start container <...>: [9] System error: could not synchronise with container process.

Parametra vērtÄ«ba nav derÄ«ga. Bet kāpēc? Un kāpēc tas nav derÄ«gs tikai dažreiz? IzrādÄ«jās, ka Docker negarantē secÄ«bu, kādā tiek lietoti Sysctl parametri (jaunākā pārbaudÄ«tā versija ir 1.13.1), tāpēc dažreiz ipfrag_high_thresh mēģināja iestatÄ«t uz 256K, kad ipfrag_low_thresh vēl bija 3M, tas ir, augŔējā robeža bija zemāka. nekā apakŔējā robeža, kas izraisÄ«ja kļūdu.

Tajā laikā mēs jau izmantojām savu mehānismu konteinera pārkonfigurÄ“Å”anai pēc palaiÅ”anas (konteinera iesaldÄ“Å”ana pēc grupas saldētava un komandu izpilde konteinera nosaukumvietā, izmantojot ip netns), un Å”ai daļai pievienojām arÄ« Sysctl parametru rakstÄ«Å”anu. Problēma tika atrisināta.

FragmentSmack/SegmentSmack. Pirmās asinis 2

Pirms mums bija laiks izprast Workaround izmantoÅ”anu mākonÄ«, sāka saņemt pirmās retās lietotāju sÅ«dzÄ«bas. TobrÄ«d bija pagājuÅ”as vairākas nedēļas kopÅ” Workaround lietoÅ”anas sākuma pirmajos serveros. Sākotnējā izmeklÄ“Å”ana parādÄ«ja, ka sÅ«dzÄ«bas saņemtas par atseviŔķiem pakalpojumiem, nevis visiem Å”o pakalpojumu serveriem. Problēma atkal ir kļuvusi ārkārtÄ«gi neskaidra.

Pirmkārt, mēs, protams, mēģinājām atsaukt Sysctl iestatÄ«jumus, taču tam nebija nekādas ietekmes. NelÄ«dzēja arÄ« dažādas manipulācijas ar servera un aplikācijas iestatÄ«jumiem. AtsāknÄ“Å”ana palÄ«dzēja. Linux atsāknÄ“Å”ana ir tikpat nedabiska, kā tas bija normāli operētājsistēmai Windows vecos laikos. Tomēr tas palÄ«dzēja, un, piemērojot jaunos Sysctl iestatÄ«jumus, mēs to izraisÄ«jām lÄ«dz ā€œkodola kļūmeiā€. Cik tas bija vieglprātÄ«gi...

Pēc trim nedēļām problēma atkārtojās. Å o serveru konfigurācija bija diezgan vienkārÅ”a: Nginx starpniekservera/balansētāja režīmā. Nav daudz satiksmes. Jauna ievada piezÄ«me: 504 kļūdu skaits klientiem pieaug katru dienu (Gateway Timeout). Diagrammā parādÄ«ts 504 kļūdu skaits dienā Å”im pakalpojumam:

Sargieties no ievainojamÄ«bām, kas liek strādāt. 1. daļa: FragmentSmack/SegmentSmack

Visas kļūdas ir par vienu un to paÅ”u aizmuguri ā€” par to, kas atrodas mākonÄ«. Atmiņas patēriņa grafiks pakotņu fragmentiem Å”ajā aizmugursistēmā izskatÄ«jās Ŕādi:

Sargieties no ievainojamÄ«bām, kas liek strādāt. 1. daļa: FragmentSmack/SegmentSmack

Å Ä« ir viena no acÄ«mredzamākajām problēmas izpausmēm operētājsistēmas grafikos. MākonÄ« tajā paŔā laikā tika novērsta cita tÄ«kla problēma ar QoS (Traffic Control) iestatÄ«jumiem. PakeÅ”u fragmentu atmiņas patēriņa grafikā tas izskatÄ«jās tieÅ”i tāpat:

Sargieties no ievainojamÄ«bām, kas liek strādāt. 1. daļa: FragmentSmack/SegmentSmack

Pieņēmums bija vienkārÅ”s: ja tie grafikos izskatās vienādi, tad tiem ir viens un tas pats iemesls. Turklāt jebkādas problēmas ar Ŕāda veida atmiņu ir ārkārtÄ«gi reti.

Fiksētās problēmas bÅ«tÄ«ba bija tāda, ka mēs izmantojām fq pakeÅ”u plānotāju ar noklusējuma iestatÄ«jumiem QoS. Pēc noklusējuma vienam savienojumam tas ļauj rindai pievienot 100 paketes, un daži savienojumi kanāla trÅ«kuma situācijās sāka aizsprostot rindu lÄ«dz ietilpÄ«bai. Å ajā gadÄ«jumā paketes tiek nomestas. Tc statistikā (tc -s qdisc) to var redzēt Ŕādi:

qdisc fq 2c6c: parent 1:2c6c limit 10000p flow_limit 100p buckets 1024 orphan_mask 1023 quantum 3028 initial_quantum 15140 refill_delay 40.0ms
 Sent 454701676345 bytes 491683359 pkt (dropped 464545, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
  1024 flows (1021 inactive, 0 throttled)
  0 gc, 0 highprio, 0 throttled, 464545 flows_plimit

ā€œ464545 flows_plimitā€ ir paketes, kas tika izmestas, jo ir pārsniegts viena savienojuma rindas ierobežojums, un ā€œnokrita 464545ā€ ir visu Ŕī plānotāja atmesto pakeÅ”u summa. Pēc rindas garuma palielināŔanas lÄ«dz 1 tÅ«kstotim un konteineru restartÄ“Å”anas problēma pārstāja rasties. JÅ«s varat sēdēt un iedzert smÅ«tiju.

FragmentSmack/SegmentSmack. Pēdējās asinis

Pirmkārt, vairākus mēneÅ”us pēc paziņojuma par ievainojamÄ«bu kodolā, beidzot parādÄ«jās FragmentSmack labojums (atgādināŔu, ka lÄ«dz ar paziņojumu augustā tika izlaists tikai SegmentSmack labojums), kas deva mums iespēju atteikties no Workaround, kas mums sagādāja diezgan daudz nepatikÅ”anas. Å ajā laikā mēs jau bijām paspējuÅ”i pārsÅ«tÄ«t dažus serverus uz jauno kodolu, un tagad mums bija jāsāk no sākuma. Kāpēc mēs atjauninājām kodolu, negaidot FragmentSmack labojumu? Fakts ir tāds, ka aizsardzÄ«bas process pret Ŕīm ievainojamÄ«bām sakrita (un apvienojās) ar paÅ”a CentOS atjaunināŔanas procesu (kas aizņem pat vairāk laika nekā tikai kodola atjaunināŔana). Turklāt SegmentSmack ir bÄ«stamāka ievainojamÄ«ba, un tās labojums parādÄ«jās nekavējoties, tāpēc tam bija jēga. Tomēr mēs nevarējām vienkārÅ”i atjaunināt CentOS kodolu, jo FragmentSmack ievainojamÄ«ba, kas parādÄ«jās CentOS 7.5 laikā, tika novērsta tikai 7.6 versijā, tāpēc mums bija jāpārtrauc atjaunināŔana uz 7.5 un jāsāk no jauna ar atjaunināŔanu uz 7.6. Un tas arÄ« notiek.

Otrkārt, pie mums ir atgriezuŔās retas lietotāju sÅ«dzÄ«bas par problēmām. Tagad mēs jau droÅ”i zinām, ka tie visi ir saistÄ«ti ar failu augÅ”upielādi no klientiem uz dažiem mÅ«su serveriem. Turklāt caur Å”iem serveriem tika veikts ļoti neliels augÅ”upielādes skaits no kopējās masas.

Kā mēs atceramies no iepriekÅ” minētā stāsta, Sysctl atgrieÅ”ana nepalÄ«dzēja. AtsāknÄ“Å”ana palÄ«dzēja, bet Ä«slaicÄ«gi.
Aizdomas par Sysctl netika noņemtas, taču Å”oreiz bija nepiecieÅ”ams savākt pēc iespējas vairāk informācijas. Tāpat ļoti trÅ«ka spējas reproducēt augÅ”upielādes problēmu klientam, lai precÄ«zāk izpētÄ«tu notiekoÅ”o.

Visas pieejamās statistikas un žurnālu analÄ«ze neļāva mums tuvāk saprast, kas notiek. Bija akÅ«ts nespēja atveidot problēmu, lai ā€œsajustuā€ konkrētu saikni. Visbeidzot, izstrādātājiem, izmantojot Ä«paÅ”u lietojumprogrammas versiju, izdevās panākt stabilu problēmu reproducÄ“Å”anu testa ierÄ«cē, kad tika izveidots savienojums, izmantojot Wi-Fi. Tas bija izrāviens izmeklÄ“Å”anā. Klients izveidoja savienojumu ar Nginx, kas bija starpniekserveris ar aizmugursistēmu, kas bija mÅ«su Java lietojumprogramma.

Sargieties no ievainojamÄ«bām, kas liek strādāt. 1. daļa: FragmentSmack/SegmentSmack

Dialogs par problēmām bija Ŕāds (fiksēts Nginx starpniekservera pusē):

  1. Klients: pieprasīt informāciju par faila lejupielādi.
  2. Java serveris: atbilde.
  3. Klients: POST ar failu.
  4. Java serveris: kļūda.

Tajā paŔā laikā Java serveris ieraksta žurnālā, ka no klienta tika saņemti 0 baiti datu, un Nginx starpniekserveris raksta, ka pieprasÄ«jums aizņēma vairāk nekā 30 sekundes (30 sekundes ir klienta lietojumprogrammas taimauts). Kāpēc noildze un kāpēc 0 baiti? No HTTP viedokļa viss darbojas kā nākas, taču Ŕķiet, ka POST ar failu pazÅ«d no tÄ«kla. Turklāt tas pazÅ«d starp klientu un Nginx. Ir pienācis laiks bruņoties ar Tcpdump! Bet vispirms jums ir jāsaprot tÄ«kla konfigurācija. Nginx starpniekserveris atrodas aiz L3 balansētāja NFware. TunelÄ“Å”ana tiek izmantota, lai piegādātu paketes no L3 balansētāja uz serveri, kas pievieno paketēm savas galvenes:

Sargieties no ievainojamÄ«bām, kas liek strādāt. 1. daļa: FragmentSmack/SegmentSmack

Å ajā gadÄ«jumā tÄ«kls Å”ajā serverÄ« nonāk Vlan marķētas trafika veidā, kas arÄ« pievieno savus laukus paketēm:

Sargieties no ievainojamÄ«bām, kas liek strādāt. 1. daļa: FragmentSmack/SegmentSmack

Un Ŕī trafika var bÅ«t arÄ« sadrumstalota (tā pati neliela daļa no ienākoŔās sadrumstalotās trafika, par kuru mēs runājām, novērtējot riskus, ko rada risinājums), kas arÄ« maina galveņu saturu:

Sargieties no ievainojamÄ«bām, kas liek strādāt. 1. daļa: FragmentSmack/SegmentSmack

Vēlreiz: paketes ir iekapsulētas ar Vlan tagu, iekapsulētas ar tuneli, sadrumstalotas. Lai labāk izprastu, kā tas notiek, izsekosim pakeÅ”u marÅ”rutu no klienta uz Nginx starpniekserveri.

  1. Pakete sasniedz L3 balansētāju. Pareizai marÅ”rutÄ“Å”anai datu centrā pakete tiek iekapsulēta tunelÄ« un nosÅ«tÄ«ta uz tÄ«kla karti.
  2. Tā kā pakete + tuneļa galvenes neietilpst MTU, pakete tiek sagriezta fragmentos un nosūtīta uz tīklu.
  3. Slēdzis aiz L3 balansētāja, saņemot paketi, pievieno tai Vlan tagu un nosūta to.
  4. Slēdzis Nginx starpniekservera priekŔā redz (pamatojoties uz porta iestatÄ«jumiem), ka serveris gaida Vlan iekapsulētu paketi, tāpēc tas nosÅ«ta to tādu, kāds tas ir, nenoņemot Vlan tagu.
  5. Linux ņem atseviŔķu pakotņu fragmentus un apvieno tos vienā lielā pakotnē.
  6. Tālāk pakete sasniedz Vlan saskarni, kur no tās tiek noņemts pirmais slānis - Vlan iekapsulÄ“Å”ana.
  7. Pēc tam Linux to nosÅ«ta uz tuneļa interfeisu, kur no tā tiek noņemts vēl viens slānis - tuneļa iekapsulÄ“Å”ana.

Grūtības ir nodot to visu kā parametrus tcpdump.
Sāksim no beigām: vai ir tīras (bez nevajadzīgām galvenēm) IP paketes no klientiem, ar noņemtu vlan un tuneļa iekapsulāciju?

tcpdump host <ip ŠŗŠ»ŠøŠµŠ½Ń‚Š°>

Nē, serverÄ« Ŕādu pakotņu nebija. Tātad problēmai jābÅ«t jau agrāk. Vai ir kādas paketes, kurām ir noņemta tikai Vlan iekapsulÄ“Å”ana?

tcpdump ip[32:4]=0xx390x2xx

0xx390x2xx ir klienta IP adrese hex formātā.
32:4 ā€” tā lauka adrese un garums, kurā tuneļa paketē ierakstÄ«ts SCR IP.

Lauka adrese bija jāizvēlas ar brutālu spēku, jo internetā viņi raksta par 40, 44, 50, 54, bet tur nebija IP adreses. Varat arī apskatīt vienu no paketēm hex formātā (parametrs -xx vai -XX tcpdump) un aprēķināt jums zināmo IP adresi.

Vai ir pakeÅ”u fragmenti, kuriem nav noņemta Vlan un tuneļa iekapsulÄ“Å”ana?

tcpdump ((ip[6:2] > 0) and (not ip[6] = 64))

Å Ä« maÄ£ija mums parādÄ«s visus fragmentus, ieskaitot pēdējo. DroÅ”i vien to paÅ”u var filtrēt pēc IP, bet es nemēģināju, jo Ŕādu pakeÅ”u nav ļoti daudz, un vajadzÄ«gās man bija viegli atrast vispārējā plÅ«smā. Å eit tie ir:

14:02:58.471063 In 00:de:ff:1a:94:11 ethertype IPv4 (0x0800), length 1516: (tos 0x0, ttl 63, id 53652, offset 0, flags [+], proto IPIP (4), length 1500)
    11.11.11.11 > 22.22.22.22: truncated-ip - 20 bytes missing! (tos 0x0, ttl 50, id 57750, offset 0, flags [DF], proto TCP (6), length 1500)
    33.33.33.33.33333 > 44.44.44.44.80: Flags [.], seq 0:1448, ack 1, win 343, options [nop,nop,TS val 11660691 ecr 2998165860], length 1448
        0x0000: 0000 0001 0006 00de fb1a 9441 0000 0800 ...........A....
        0x0010: 4500 05dc d194 2000 3f09 d5fb 0a66 387d E.......?....f8}
        0x0020: 1x67 7899 4500 06xx e198 4000 3206 6xx4 [email protected].
        0x0030: b291 x9xx x345 2541 83b9 0050 9740 0x04 .......A...P.@..
        0x0040: 6444 4939 8010 0257 8c3c 0000 0101 080x dDI9...W.......
        0x0050: 00b1 ed93 b2b4 6964 xxd8 ffe1 006a 4578 ......ad.....jEx
        0x0060: 6966 0000 4x4d 002a 0500 0008 0004 0100 if..MM.*........

14:02:58.471103 In 00:de:ff:1a:94:11 ethertype IPv4 (0x0800), length 62: (tos 0x0, ttl 63, id 53652, offset 1480, flags [none], proto IPIP (4), length 40)
    11.11.11.11 > 22.22.22.22: ip-proto-4
        0x0000: 0000 0001 0006 00de fb1a 9441 0000 0800 ...........A....
        0x0010: 4500 0028 d194 00b9 3f04 faf6 2x76 385x E..(....?....f8}
        0x0020: 1x76 6545 xxxx 1x11 2d2c 0c21 8016 8e43 .faE...D-,.!...C
        0x0030: x978 e91d x9b0 d608 0000 0000 0000 7c31 .x............|Q
        0x0040: 881d c4b6 0000 0000 0000 0000 0000 ..............

Tie ir divi viena iepakojuma fragmenti (tas pats ID 53652) ar fotogrāfiju (pirmajā iepakojumā redzams vārds Exif). Sakarā ar to, ka Å”ajā lÄ«menÄ« ir iepakojumi, bet ne apvienotā veidā izgāztuvēs, problēma nepārprotami ir montāžā. Beidzot tam ir dokumentāri pierādÄ«jumi!

PakeÅ”u dekodētājs neatklāja nekādas problēmas, kas kavētu veidoÅ”anu. Izmēģināju Å”eit: hpd.gasmi.net. Sākumā, mēģinot kaut ko tur ievietot, dekodētājam nepatÄ«k pakeÅ”u formāts. IzrādÄ«jās, ka starp Srcmac un Ethertype bija daži papildu divi okteti (nav saistÄ«ti ar fragmenta informāciju). Pēc to noņemÅ”anas dekodētājs sāka darboties. Tomēr tas neuzrādÄ«ja nekādas problēmas.
Lai ko arÄ« teiktu, nekas cits netika atrasts, izņemot Sysctl. Atlika tikai atrast veidu, kā identificēt problēmu serverus, lai saprastu mērogu un izlemtu par turpmākajām darbÄ«bām. NepiecieÅ”amais skaitÄ«tājs tika atrasts pietiekami ātri:

netstat -s | grep "packet reassembles failedā€

Tas ir arī snmpd ar OID=1.3.6.1.2.1.4.31.1.1.16.1 (ipSystemStatsReasmFails).

"IP atkārtotas montāžas algoritma atklāto kļūmju skaits (jebkura iemesla dēļ: noildze, kļūdas utt.)."

No serveru grupas, kurā problēma tika pētÄ«ta, divos Å”is skaitÄ«tājs palielinājās ātrāk, divos lēnāk, bet vēl divos tas nepalielinājās vispār. SalÄ«dzinot Ŕī skaitÄ«tāja dinamiku ar HTTP kļūdu dinamiku Java serverÄ«, atklājās korelācija. Tas ir, skaitÄ«tāju varēja uzraudzÄ«t.

Ir ļoti svarÄ«gi, lai bÅ«tu uzticams problēmu indikators, lai jÅ«s varētu precÄ«zi noteikt, vai Sysctl atgrieÅ”ana palÄ«dz, jo no iepriekŔējā stāsta mēs zinām, ka to nevar uzreiz saprast no lietojumprogrammas. Å is rādÄ«tājs ļautu mums identificēt visas ražoÅ”anas problemātiskās jomas, pirms lietotāji to atklāj.
Pēc Sysctl atgrieÅ”anas pārraudzÄ«bas kļūdas apstājās, tādējādi tika pierādÄ«ts problēmu cēlonis, kā arÄ« tas, ka atgrieÅ”ana palÄ«dz.

Mēs atcēlām sadrumstalotÄ«bas iestatÄ«jumus citos serveros, kur parādÄ«jās jauna uzraudzÄ«ba, un kaut kur fragmentiem pieŔķīrām vēl vairāk atmiņas nekā iepriekÅ” bija pēc noklusējuma (tā bija UDP statistika, kuras daļējs zudums nebija manāms uz vispārējā fona) .

Svarīgākie jautājumi

Kāpēc mÅ«su L3 balansētāja paketes ir sadrumstalotas? Lielākā daļa pakeÅ”u, kas pienāk no lietotājiem lÄ«dzsvarotājiem, ir SYN un ACK. Å o iepakojumu izmēri ir mazi. Bet, tā kā Ŕādu pakeÅ”u Ä«patsvars ir ļoti liels, uz to fona mēs nepamanÄ«jām lielu pakeÅ”u klātbÅ«tni, kas sāka sadrumstalot.

Iemesls bija bojāts konfigurācijas skripts advmss serveros ar Vlan saskarnēm (tolaik ražoÅ”anā bija ļoti maz serveru ar tagu trafiku). Advmss ļauj mums nodot klientam informāciju, ka mÅ«su virzienā esoÅ”ajām paketēm jābÅ«t mazākām, lai pēc tuneļa galveņu pievienoÅ”anas tām nebÅ«tu jāsadala.

Kāpēc Sysctl atcelÅ”ana nepalÄ«dzēja, bet atsāknÄ“Å”ana palÄ«dzēja? Sysctl atgrieÅ”ana mainÄ«ja pakotņu sapludināŔanai pieejamās atmiņas apjomu. Tajā paŔā laikā, acÄ«mredzot, pats fragmentu atmiņas pārpildes fakts izraisÄ«ja savienojumu palēnināŔanos, kas noveda pie fragmentu ilgas aizkavÄ“Å”anās rindā. Tas ir, process noritēja ciklos.
AtsāknÄ“Å”ana iztÄ«rÄ«ja atmiņu, un viss atgriezās kārtÄ«bā.

Vai bija iespējams iztikt bez risinājuma? Jā, taču pastāv liels risks atstāt lietotājus bez pakalpojuma uzbrukuma gadÄ«jumā. Protams, Workaround izmantoÅ”ana radÄ«ja dažādas problēmas, tostarp viena no pakalpojumu bremzÄ“Å”anu lietotājiem, taču mēs uzskatām, ka darbÄ«bas bija pamatotas.

Liels paldies Andrejam Timofejevam (atimofejevs) par palÄ«dzÄ«bu izmeklÄ“Å”anas veikÅ”anā, kā arÄ« Aleksejam Kreņevam (ierÄ«cex) - par titānisko Centos un kodolu atjaunināŔanu serveros. Process, kas Å”ajā gadÄ«jumā vairākas reizes bija jāsāk no sākuma, tāpēc tas ievilkās daudzus mēneÅ”us.

Avots: www.habr.com

Pievieno komentāru