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.
ʻ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):
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:
Kāhea ka polokalamu i kahi waihona pūnaewele e like me libdns
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)
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.
Ma o ka interface sysctl hiki iā ʻoe ke hoʻonohonoho i ka waihona UDP ma ka pae kernel
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
Hopu ka hypervisor a hoʻouna i ka ʻeke i ke kikowaena metadata ma ke kamaʻilio ʻana me ia
ʻ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
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 hanaprintk 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.