He moʻolelo e pili ana i ka nalo ʻana o nā ʻeke DNS mai ke kākoʻo ʻenehana Google Cloud

Mai Google Blog Editor: Ua noʻonoʻo paha ʻoe pehea e lawelawe ai nā ʻenekinia Google Cloud Technical Solutions (TSE) i kāu mau noi kākoʻo? ʻO TSE Technical Support Engineers ke kuleana e ʻike a hoʻoponopono i nā kumu pilikia i hōʻike ʻia e ka mea hoʻohana. He mea maʻalahi kekahi o kēia mau pilikia, akā i kekahi manawa e ʻike ʻoe i kahi tiketi e pono ai ka nānā ʻana o kekahi mau ʻenekinia i ka manawa hoʻokahi. Ma kēia ʻatikala, e haʻi mai kekahi o nā limahana TSE iā mākou e pili ana i kahi pilikia paʻakikī loa mai kāna hana hou - hihia o ka nalo ʻana o nā ʻeke DNS. Ma kēia moʻolelo, e ʻike kākou i ka hoʻoponopono ʻana o nā ʻenekinia i ke kūlana, a me nā mea hou a lākou i aʻo ai i ka hoʻoponopono ʻana i ka hewa. Manaʻo mākou ʻaʻole kēia moʻolelo e hoʻonaʻauao iā ʻoe e pili ana i kahi pahu hohonu hohonu, akā hāʻawi pū kekahi iā ʻoe i ka ʻike i nā kaʻina hana i ka waiho ʻana i kahi tikiki kākoʻo me Google Cloud.

He moʻolelo e pili ana i ka nalo ʻana o nā ʻeke DNS mai ke kākoʻo ʻenehana Google Cloud

ʻO ka hoʻoponopono pilikia he ʻepekema a he hana noʻeau. Hoʻomaka ia me ke kūkulu ʻana i kahi kuhiakau e pili ana i ke kumu o ka hana maʻamau ʻole o ka ʻōnaehana, a laila hoʻāʻo ʻia no ka ikaika. Eia naʻe, ma mua o ka hoʻokumu ʻana i kahi kuhiakau, pono mākou e wehewehe a hoʻonohonoho pololei i ka pilikia. Inā he haʻahaʻa loa ka nīnau, a laila pono ʻoe e nānā pono i nā mea a pau; ʻO kēia ka "art" o ka hoʻoponopono pilikia.

Ma lalo o Google Cloud, lilo ia mau kaʻina hana i mea paʻakikī loa, ʻoiai ke hoʻāʻo nei ʻo Google Cloud i ka mea maikaʻi loa e hōʻoia i ka pilikino o kāna mau mea hoʻohana. Ma muli o kēia, ʻaʻole hiki i nā ʻenekinia TSE ke hoʻoponopono i kāu mau ʻōnaehana, ʻaʻole hiki ke nānā i nā hoʻonohonoho like ākea e like me nā mea hoʻohana. No laila, no ka hoʻāʻo ʻana i kekahi o kā mākou hypotheses, ʻaʻole hiki iā mākou (nā ʻenekinia) ke hoʻololi koke i ka ʻōnaehana.

Manaʻo kekahi mau mea hoʻohana e hoʻoponopono mākou i nā mea āpau e like me ka mechanics i ka lawelawe kaʻa, a hoʻouna wale mai iā mākou i ka id o kahi mīkini virtual, akā ʻo ka ʻoiaʻiʻo ke hana ʻia ke kaʻina hana ma ke ʻano kamaʻilio: ʻohi ʻike, hoʻokumu a hōʻoia (a hōʻole paha) i nā kuhiakau, a, i ka hopena, hoʻoholo nā pilikia ma muli o ke kamaʻilio ʻana me ka mea kūʻai aku.

Pilikia i nīnau ʻia

I kēia lā he moʻolelo kā mākou me ka hopena maikaʻi. ʻO kekahi kumu o ka hoʻoholo kūleʻa o ka hihia i manaʻo ʻia he wehewehe kikoʻī loa a pololei o ka pilikia. Ma lalo ʻoe e ʻike ai i ke kope o ka tikiki mua (hoʻoponopono ʻia e hūnā i ka ʻike huna):
He moʻolelo e pili ana i ka nalo ʻana o nā ʻeke DNS mai ke kākoʻo ʻenehana Google Cloud
Loaʻa i kēia leka nā ʻike he nui no mākou:

  • VM kikoʻī i kuhikuhi ʻia
  • Hōʻike ʻia ka pilikia ponoʻī - ʻaʻole hana ʻo DNS
  • Hōʻike ʻia kahi i hōʻike ʻia ai ka pilikia - VM a me ka pahu
  • Hōʻike ʻia nā hana a ka mea hoʻohana e ʻike ai i ka pilikia.

Ua hoʻopaʻa inoa ʻia ka noi ma ke ʻano he "P1: Critical Impact - Service Unusable in production", ʻo ia hoʻi ka nānā mau ʻana i ke kūlana 24/7 e like me ka papahana "Follow the Sun" (hiki iā ʻoe ke heluhelu hou e pili ana i nā mea nui o nā noi mea hoʻohana), me kona hoʻololi ʻana mai kahi hui kākoʻo ʻenehana i kekahi me kēlā me kēia neʻe ʻana o ka manawa. ʻOiaʻiʻo, i ka manawa i hiki ai ka pilikia i kā mākou hui ma Zurich, ua hoʻopuni ʻo ia i ka honua. I kēia manawa, ua hana ka mea hoʻohana i nā hana hoʻohaʻahaʻa, akā makaʻu i ka hana hou ʻana o ke kūlana i ka hana ʻana, ʻoiai ʻaʻole i ʻike ʻia ke kumu kumu.

I ka manawa i hōʻea ai ka tiketi i Zurich, ua loaʻa iā mākou kēia ʻike ma ka lima:

  • ʻIke maʻiʻo /etc/hosts
  • ʻIke maʻiʻo /etc/resolv.conf
  • hopena iptables-save
  • Hoʻākoakoa ʻia e ka hui ngrep pcap file

Me kēia ʻikepili, ua mākaukau mākou e hoʻomaka i ka "hoʻokolokolo" a me ka hoʻoponopono pilikia.

ʻO kā mākou hana mua

ʻO ka mea mua, ua nānā mākou i nā lāʻau a me ke kūlana o ka metadata server a hōʻoia i ka hana pono. Pane ka server metadata i ka IP address 169.254.169.254 a, ma waena o nā mea ʻē aʻe, ke kuleana o ka mālama ʻana i nā inoa kikowaena. Ua hoʻopaʻa ʻelua mākou i ka hana pono o ka pā ahi me ka VM a ʻaʻole hoʻopaʻa i nā ʻeke.

He pilikia ʻē kēia: ua hōʻole ka nmap i kā mākou kuhiakau nui e pili ana i ka nalowale ʻana o nā ʻeke UDP, no laila ua noʻonoʻo mākou i nā koho a me nā ala e nānā ai iā lākou:

  • Hoʻokuʻu wale ʻia nā ʻeke? => E nānā i nā lula iptables
  • ʻAʻole liʻiliʻi loa? KANAKA? => E nānā i ka puka ip a show
  • Pili ka pilikia i nā ʻeke UDP a i ʻole TCP pū kekahi? => Kipaku aku dig +tcp
  • Ua hoʻihoʻi ʻia nā ʻeke i hana ʻia? => Kipaku aku tcpdump
  • Ke hana pololei nei ʻo libdns? => Kipaku aku strace e nānā i ka lawe ʻana o nā ʻeke ma nā ʻaoʻao ʻelua

Maanei mākou e hoʻoholo ai e kelepona i ka mea hoʻohana e hoʻoponopono i nā pilikia ola.

I ka wā kelepona hiki iā mākou ke nānā i kekahi mau mea:

  • Ma hope o kekahi mau loiloi, kāpae mākou i nā lula iptables mai ka papa inoa o nā kumu
  • Nānā mākou i nā pilina pūnaewele a me nā papa hoʻokele, a nānā pālua i ka pololei o ka MTU
  • ʻIke mākou i kēlā dig +tcp google.com (TCP) hana e like me ka pono, aka dig google.com (UDP) ʻaʻole hana
  • Ua kipaku aku tcpdump ke hana mau nei dig, ʻike mākou e hoʻihoʻi ʻia ana nā ʻeke UDP
  • Holo mākou strace dig google.com a ʻike mākou i ke kāhea pololei ʻana sendmsg() и recvms(), akā naʻe, ua hoʻopau ʻia ka lua e ka manawa pau

ʻO ka mea pōʻino, hiki mai ka hopena o ka neʻe ʻana a koi ʻia mākou e hoʻonui i ka pilikia i ka manawa aʻe. ʻO ka noi, ua hoʻāla ʻia ka hoihoi i kā mākou hui, a manaʻo kekahi hoa hana e hana i ka pūʻulu DNS mua me ka hoʻohana ʻana i ka 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())

Hoʻokumu kēia ʻāpana i kahi ʻeke DNS a hoʻouna i ka noi i ke kikowaena metadata.

Holo ka mea hoʻohana i ke code, hoʻihoʻi ʻia ka pane DNS, a loaʻa iā ia ka noi, e hōʻoia ana ʻaʻohe pilikia ma ka pae pūnaewele.

Ma hope o kekahi "huakaʻi puni honua," e hoʻi ka noi i kā mākou hui, a hoʻololi loa wau iaʻu iho, me ka manaʻo e ʻoi aku ka maʻalahi o ka mea hoʻohana inā pau ka noi ʻana mai kahi a i kahi.

I kēia manawa, ʻae ʻoluʻolu ka mea hoʻohana e hāʻawi i kahi kiʻi o ke kiʻi ʻōnaehana. He nūhou maikaʻi loa kēia: ʻo ka hiki ke hoʻāʻo i ka ʻōnaehana iaʻu iho e wikiwiki loa i ka hoʻoponopono ʻana, no ka mea ʻaʻole pono iaʻu e noi i ka mea hoʻohana e holo i nā kauoha, e hoʻouna mai iaʻu i nā hopena a nānā iā lākou, hiki iaʻu ke hana i nā mea āpau iaʻu iho!

Ke hoʻomaka nei koʻu mau hoa hana e lili iki iaʻu. Ma ka ʻaina awakea, kūkākūkā mākou i ka hoʻololi ʻana, akā ʻaʻohe mea i manaʻo i ka mea e hana nei. ʻO ka mea pōmaikaʻi, ua hana mua ka mea hoʻohana i nā hana e hoʻēmi i nā hopena a ʻaʻole wikiwiki, no laila ua loaʻa iā mākou ka manawa e wehe i ka pilikia. A no ka loaʻa ʻana o kahi kiʻi, hiki iā mākou ke holo i nā hoʻokolohua āu e makemake ai. Nui!

Ke hoʻi i hope

ʻO kekahi o nā nīnau nīnau nīnau kaulana loa no nā kūlana ʻenekinia ʻōnaehana: "He aha ka mea i ka wā e ping ai ʻoe www.google.com? He mea nui ka nīnau, no ka mea, pono ka moho e wehewehe i nā mea a pau mai ka pūpū a hiki i ka mea hoʻohana, i ka ʻōnaehana kernel a laila i ka pūnaewele. ʻIke au: i kekahi manawa ua lilo nā nīnau nīnauele i mea pono i ke ola maoli...

Hoʻoholo wau e hoʻopili i kēia nīnau HR i kahi pilikia o kēia manawa. ʻO ka ʻōlelo koʻikoʻi, ke hoʻāʻo ʻoe e hoʻoholo i kahi inoa DNS, hiki mai kēia:

  1. Kāhea ka polokalamu i kahi waihona pūnaewele e like me libdns
  2. Nānā ʻo libdns i ka hoʻonohonoho ʻōnaehana i kahi kikowaena DNS e hoʻopili ai (ma ke kiʻikuhi ʻo 169.254.169.254, kikowaena metadata)
  3. Hoʻohana ʻo libdns i nā kelepona ʻōnaehana e hana i kahi kumu UDP (SOKET_DGRAM) a hoʻouna i nā ʻeke UDP me kahi nīnau DNS ma nā ʻaoʻao ʻelua.
  4. Ma o ka interface sysctl hiki iā ʻoe ke hoʻonohonoho i ka waihona UDP ma ka pae kernel
  5. Hoʻopili ka kernel me ka ʻenehana e hoʻouna i nā ʻeke ma luna o ka pūnaewele ma o ke kikowaena pūnaewele
  6. Hopu ka hypervisor a hoʻouna i ka ʻeke i ke kikowaena metadata ma ke kamaʻilio ʻana me ia
  7. ʻO ka metadata server, ma kāna kilokilo, e hoʻoholo i ka inoa DNS a hoʻihoʻi i kahi pane me ka hoʻohana ʻana i ke ʻano like

He moʻolelo e pili ana i ka nalo ʻana o nā ʻeke DNS mai ke kākoʻo ʻenehana Google Cloud
E hoʻomanaʻo wau iā ʻoe i nā kuhiakau a mākou i noʻonoʻo ai:

Kuhiakau: Nā hale waihona puke haʻihaʻi

  • Ho'āʻo 1: holo strace i loko o ka ʻōnaehana, e nānā i ka ʻeli ʻana i nā kelepona ʻōnaehana pololei
  • Ka hopena: Kāhea ʻia nā kelepona ʻōnaehana pololei
  • Ho'āʻo 2: me ka hoʻohana ʻana i ka srapy e nānā inā hiki iā mākou ke hoʻoholo i nā inoa e kāpae ana i nā hale waihona puke
  • Ka hopena: hiki iā mākou
  • Hoʻāʻo 3: holo rpm –V ma ka pūʻolo libdns a me nā faila waihona md5sum
  • Ka hopena: ua like loa ke code waihona me ke code ma ka ʻōnaehana hana
  • Hoʻāʻo 4: kau i ke kiʻi ʻōnaehana kumu o ka mea hoʻohana ma kahi VM me ka ʻole o kēia ʻano, holo chroot, ʻike inā hana DNS
  • Ka hopena: Hana pololei ka DNS

Ka hopena ma muli o nā hoʻokolohua: ʻAʻole i loko o nā hale waihona puke ka pilikia

Kuhiakau: Aia ka hewa i nā hoʻonohonoho DNS

  • Hoʻāʻo 1: nānā i ka tcpdump a ʻike inā hoʻouna ʻia nā ʻeke DNS a hoʻihoʻi pololei ʻia ma hope o ka holo ʻana i ka ʻeli
  • Ka hopena: hoʻouna pololei ʻia nā ʻeke
  • Ho'āʻo 2: nānā pālua ma ke kikowaena /etc/nsswitch.conf и /etc/resolv.conf
  • Ka hopena: pololei nā mea a pau

Ka hopena ma muli o nā hoʻokolohua: ʻAʻole pili ka pilikia me ka hoʻonohonoho DNS

Kuhiakau: pōʻino ke kumu

  • E ho'āʻo: e hoʻokomo i ka kernel hou, e nānā i ka pūlima, e hoʻomaka hou
  • Ka hopena: ka hana like

Ka hopena ma muli o nā hoʻokolohua: ʻaʻole i pōʻino ke kino

Kuhiakau: hewa hewa o ka mea hoʻohana pūnaewele (a i ʻole hypervisor network interface)

  • Hoʻāʻo 1: E nānā i kāu hoʻonohonoho pā ahi
  • ʻO ka hopena: hāʻawi ka pā ahi i nā ʻeke DNS ma ka host a me GCP
  • Ho'āʻo 2: hoʻokaʻawale i nā kaʻa a nānā i ka pololei o ka hoʻouna ʻana a me ka hoʻihoʻi ʻana i nā noi DNS
  • Ka hopena: hōʻoia ʻo tcpdump ua loaʻa i ka mea hoʻokipa nā ʻeke hoʻihoʻi

Ka hopena ma muli o nā hoʻokolohua: ʻaʻole i ka pūnaewele ka pilikia

Kuhiakau: ʻaʻole e hana ana ke kikowaena metadata

  • Hoʻāʻo 1: e nānā i nā log server metadata no nā anomalies
  • Ka hopena: ʻaʻohe anomalies ma nā lāʻau
  • Hoʻāʻo 2: Kāpae i ke kikowaena metadata ma o dig @8.8.8.8
  • Ka hopena: Ua haki ka hoʻoholo me ka hoʻohana ʻole ʻana i kahi kikowaena metadata

Ka hopena ma muli o nā hoʻokolohua: ʻAʻole pili ka pilikia me ke kikowaena metadata

Lalo laina: ua hoʻāʻo mākou i nā subsystem a pau koe nā hoʻonohonoho manawa holo!

Luʻu i loko o nā hoʻonohonoho Kernel Runtime

No ka hoʻonohonoho ʻana i ke kaiapuni hoʻokō kernel, hiki iā ʻoe ke hoʻohana i nā koho laina kauoha (grub) a i ʻole ka interface sysctl. Nānā wau i loko /etc/sysctl.conf a noʻonoʻo wale, ua ʻike au i kekahi mau hoʻonohonoho maʻamau. Me he mea lā ua hopu wau i kekahi mea, ua hoʻolei au i nā hoʻonohonoho non-network a i ʻole tcp, i koe me nā pae mauna. net.core. A laila hele au i kahi o ka ʻae ʻana o ka host i ka VM a hoʻomaka wau e hoʻopili i nā hoʻonohonoho i kēlā me kēia, kēlā me kēia, me ka VM haki, a ʻike wau i ka mea hewa:

net.core.rmem_default = 2147483647

Eia, kahi hoʻonohonoho hoʻonohonoho DNS-breaking! Ua loaʻa iaʻu ka mea pepehi kanaka. Akā, no ke aha kēia hana? Makemake au i kumu.

Hoʻonohonoho ʻia ka nui packet buffer DNS kumu ma o net.core.rmem_default. Aia kahi waiwai maʻamau ma kahi o 200KiB, akā inā loaʻa i kāu kikowaena nā ʻeke DNS he nui, makemake paha ʻoe e hoʻonui i ka nui buffer. Inā piha ka pahu i ka hiki ʻana mai o kahi ʻeke hou, no ka laʻana, no ka mea ʻaʻole wikiwiki ka noi ʻana, a laila e hoʻomaka ana ʻoe e nalowale i nā ʻeke. Ua hoʻonui pono kā mākou mea kūʻai aku i ka nui buffer no ka mea makaʻu ʻo ia i ka nalowale o ka ʻikepili, ʻoiai ke hoʻohana nei ʻo ia i kahi noi no ka hōʻiliʻili ʻana i nā metric ma o nā ʻeke DNS. ʻO ka waiwai āna i hoʻonoho ai ʻo ia ka mea hiki loa: 231-1 (inā hoʻonoho ʻia i 231, e hoʻihoʻi ka kernel i ka "INVALID ARGUMENT").

Ua ʻike koke wau i ke kumu i hana pololei ai ka nmap a me ka scapy: ke hoʻohana nei lākou i nā kumu maka! ʻOkoʻa nā kumu kumu mai nā kumu maʻamau: kāʻalo lākou i nā iptables, ʻaʻole lākou i pale ʻia!

Akā, no ke aha e pilikia ai ka "paʻa nui"? ʻAʻole maopopo ka hana e like me ka mea i manaʻo ʻia.

I kēia manawa hiki iaʻu ke hana hou i ka pilikia ma nā kernels he nui a me nā māhele lehulehu. Ua ʻike mua ʻia ka pilikia ma ka kernel 3.x a i kēia manawa ua ʻike pū ʻia ma ka kernel 5.x.

ʻOiaʻiʻo, ma ka hoʻomaka ʻana

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

Ua pau ka hana ʻana o DNS.

Ua hoʻomaka wau e ʻimi i nā waiwai hana ma o kahi algorithm hulina binary maʻalahi a ʻike ua hana ka ʻōnaehana me 2147481343, akā he helu kumu ʻole kēia helu iaʻu. Ua manaʻo wau i ka mea kūʻai aku e hoʻāʻo i kēia helu, a pane ʻo ia ua hana ka ʻōnaehana me google.com, akā hāʻawi mau i kahi hewa me nā kikowaena ʻē aʻe, no laila ua hoʻomau wau i kaʻu noiʻi.

Ua hoʻokomo wau wati kulu, he mea hana pono i hoohana mua ia: e hoike pono ana i kahi o ka kernel e pau ai ka pakeke. ʻO ka mea hewa ka hana udp_queue_rcv_skb. Ua hoʻoiho au i nā kumu kernel a hoʻohui i kekahi hana printk e ʻimi i kahi e pau ai ka ʻeke. Ua loaʻa koke iaʻu ke kūlana kūpono if, a nānā wale aku iā ia no kekahi manawa, no ka mea, ʻo ia ka mea i hui pū ʻia nā mea a pau i ke kiʻi holoʻokoʻa: 231-1, kahi helu kumu ʻole, kahi kikowaena hana ʻole ... He ʻāpana code i loko. __udp_enqueue_schedule_skb:

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

Please e hoailona oukou:

  • rmem he ʻano ʻano int
  • size ʻO ke ʻano u16 (unsigned ʻumikūmāono-bit int) a mālama i ka nui o ka ʻeke
  • sk->sk_rcybuf ʻO ke ʻano int a mālama i ka nui buffer, ma ka wehewehe ʻana, ua like ia me ka waiwai i loko net.core.rmem_default

Inā sk_rcvbuf e pili ana i ka 231, e hōʻuluʻulu ʻia ka nui o ka ʻeke huina huinahalike. A no ka mea he int, lilo kona waiwai i mea maikaʻi ʻole, no laila e ʻoiaʻiʻo ke kūlana inā hewa ia (hiki iā ʻoe ke heluhelu hou e pili ana i kēia ma loulou).

Hiki ke hoʻoponopono ʻia ka hewa ma kahi ala liʻiliʻi: ma ka hoʻolei ʻana unsigned int. Ua noi au i ka hoʻoponopono a hoʻomaka hou i ka ʻōnaehana a hana hou ka DNS.

ʻono o ka lanakila

Ua hoʻouna au i kaʻu mau ʻike i ka mea kūʻai aku a hoʻouna aku LKML ʻāpana kernel. Ua hauʻoli wau: ua hui pū kēlā me kēia ʻāpana o ka puzzle, hiki iaʻu ke wehewehe pololei i ke kumu o kā mākou nānā ʻana i nā mea a mākou i ʻike ai, a ʻo ka mea nui loa, ua hiki iā mākou ke ʻimi i kahi hopena i ka pilikia ma muli o kā mākou hui pū!

He mea pono ke hoʻomaopopo ʻia ua liʻiliʻi ka hihia, a ʻoi aku ka maikaʻi o ka loaʻa ʻana o nā noi paʻakikī mai nā mea hoʻohana.

He moʻolelo e pili ana i ka nalo ʻana o nā ʻeke DNS mai ke kākoʻo ʻenehana Google Cloud


Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka