Hur vi bröt igenom den Stora Kinesiska Brandskyddsmuren (del 1)

Hej alla!

Förbindelse hĂ€r, Nikita – systemingenjör frĂ„n företaget SEMrush. Idag ska jag berĂ€tta för er hur vi stĂ€lldes inför uppgiften att sĂ€kerstĂ€lla stabiliteten hos vĂ„r tjĂ€nst semrush.com i Kina, och vilka problem vi stötte pĂ„ under genomförandet (med tanke pĂ„ platsen för vĂ„rt datacenter pĂ„ USA:s östkust).

Det hÀr kommer att bli en lÄng historia, uppdelad i flera artiklar. Jag ska berÀtta hur allt gick till hos oss: frÄn en helt oanvÀndbar tjÀnst i Kina, till prestanda som matchade den amerikanska versionen för amerikaner. Jag lovar, det kommer bli intressant och nyttigt. SÄ, lÄt oss köra.

Kinas internetproblem

Även den mest avlĂ€gsna personen frĂ„n nĂ€tverksadministration har Ă„tminstone en gĂ„ng hört talas om Den Stora Kinesiska BrandvĂ€ggen. Uuu, lĂ„ter coolt, eller hur? Men vad Ă€r det, hur fungerar det egentligen – frĂ„gan Ă€r ganska komplex. Det finns mĂ„nga artiklar pĂ„ internet som handlar om detta, men ur teknisk synvinkel beskrivs enheten av denna brandvĂ€gg sĂ€llan. Vilket, förresten, inte Ă€r förvĂ„nande. Jag erkĂ€nner direkt, efter ett Ă„rs arbete kan jag inte sĂ€ga exakt hur den fungerar, men jag kan berĂ€tta om mina observationer och praktiska slutsatser. Och vi börjar med ryktena om denna brandvĂ€gg.

Det finns mÄnga rykten om denna brandvÀgg. LÄt oss sammanstÀlla de viktigaste och mest intressanta av dem i en lista:

  • Google, Facebook, Twitter och andra liknande tjĂ€nster Ă€r blockerade och fungerar inte i Kina.
  • All trafik som gĂ„r UT ur Kina och IN i Kina analyseras och begrĂ€nsas med hjĂ€lp av maskininlĂ€rning (vid misstĂ€nkt trafik), vilket kraftigt saktar ner den (trafiken) nĂ€r den passerar grĂ€nsen.
  • Kinas sĂ€kerhetstjĂ€nster kan bryta krypterad trafik som gĂ„r genom deras brandvĂ€gg.
  • VPN-tunnlar och IPSEC-tunnlar Ă€r instabila, faller och blockeras stĂ€ndigt.
  • Ju enklare kryptering, desto enklare lösenfras som anvĂ€nds för autentisering/kryptering av trafiken, desto snabbare passerar den genom den kinesiska brandvĂ€ggen.

HÀr Àr vad vi har lyckats ta reda pÄ om dessa rykten:

  • Google, Facebook, Twitter och andra liknande tjĂ€nster Ă€r faktiskt blockerade (din KO), men mĂ„nga tekniska domĂ€ner frĂ„n Google, exempelvis, Ă€r inte blockerade och fungerar (som gstatic.com). DĂ€rför följer slutsatsen: det Ă€r inte klokt att avfĂ€rda alla Google och andra resurser som verkar vara blockerade.
  • All traffic crossing the border significantly increases its delay. Take a look at two results. One site, one page, simple GET curlfrom. The first measurement is from China (the beautiful city of Shenzhen). The second measurement is from outside in Hong Kong (which has sovereignty, and there is no firewall between it and the world). The distance between the cities is approximately 30-40 km.

nikita@china-shenzhen:~# curl -o /dev/null -w@curl_time "https://www.semrush.com/info/ebay.com"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  381k    0  381k    0     0  71824      0 --:--:--  0:00:05 --:--:-- 82832
time_namelookup:  0.004500
time_connect:  0.169342
time_appconnect:  0.723189
time_pretransfer:  0.723499
time_redirect:  0.000000
time_starttransfer:  1.532912
----------
time_total:  5.443407
----------
size_download:  390968 Bytes
speed_download:  71824.000B/s

nikita@china-hongkong:~# curl -o /dev/null -w@curl_time "https://www.semrush.com/info/ebay.com"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  319k    0  319k    0     0  2555k      0 --:--:-- --:--:-- --:--:-- 2573k
time_namelookup:  0.029366
time_connect:  0.030742
time_appconnect:  0.047310
time_pretransfer:  0.047388
time_redirect:  0.000000
time_starttransfer:  0.120793
----------
time_total:  0.124871
----------
size_download:  326755 Bytes
speed_download:  2616740.000B/s

Observera time_connect. And overall, you see the result: the firewall adds 4 extra seconds, which is extremely long.

  • VPN and IPSEC tunnels do indeed often drop. I will discuss this in more detail later. VPN servers used by users are blocked over time (usually within a day after use starts).
  • There is an opinion, shared by people living in China, that the simpler the traffic encryption, the faster it crosses the border, because it is easier to understand that there is nothing illegal in it. Similarly, 'clean' traffic receives more bandwidth and speed, while 'dirty' traffic, which is harder to decipher, experiences a slower passage. For example, I will refer to curl to ifconfig.co over the HTTPS and HTTP protocols.

curl -o /dev/null -w@curl_time "https://ifconfig.co/"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    13  100    13    0     0      2      0  0:00:06  0:00:05  0:00:01     3
time_namelookup:  0.004305
time_connect:  0.397465
time_appconnect:  5.149305
time_pretransfer:  5.149393
time_redirect:  0.000000
time_starttransfer:  5.568847
----------
time_total:  5.568893
----------
size_download:  13 Bytes
speed_download:  2.000B/s

curl -o /dev/null -w@curl_time "http://ifconfig.co/"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    13  100    13    0     0     28      0 --:--:-- --:--:-- --:--:--    28
time_namelookup:  0.004282
time_connect:  0.212457
time_appconnect:  0.000000
time_pretransfer:  0.212484
time_redirect:  0.000000
time_starttransfer:  0.450565
----------
time_total:  0.450620
----------
size_download:  13 Bytes
speed_download:  28.000B/s

Skillnaden pÄ 5 sekunder för den totala laddningstiden av 13 byte. Under flera tester kan man se att GET pÄ HTTP vanligtvis tar ungefÀr samma tid varje gÄng, medan HTTPS-svaren varierar mellan 3, 5, 10 och till och med 17 sekunder. Ibland förekommer SSL-fel:

OkÀnt SSL-protokollfel i anslutning till ifconfig.co:443.

SĂ„ vad har vi?

  • Problem som orsakas av den kinesiska brandvĂ€ggen som beskrivits ovan.
  • Pingar till externa resurser och inom tunnlar försvinner periodiskt.
  • Latensen mellan tvĂ„ punkter förĂ€ndras stĂ€ndigt och Ă€r ofta oförutsĂ€gbar. NĂ€r man kopplar olika stĂ€der/regioner förvĂ€ntar man sig att latensen ska vara lĂ€gre, baserat pĂ„ deras geografiska lĂ€ge, men fĂ„r ofta motsatt resultat.
  • Internet och kommunikationskanaler fungerar ibland snabbt, ibland lĂ„ngsamt. Det finns en viss beroende av tid pĂ„ dagen och veckodag, men det Ă€r inte alltid konsekvent.
  • DNS-förfrĂ„gningar till omvĂ€rlden frĂ„n Kina överskrider ibland den tillĂ„tna tidsgrĂ€nsen.

Bilden som mÄlas upp Àr helt enkelt "utmÀrkt".

Datacentret, som jag redan nÀmnt, ligger i östra USA, och hela SEMrush bestÄr av dussintals sammanlÀnkade produkter, backend-system, frontend-grÀnssnitt, databaser, allt detta Àr i datacentret och i molnet. VÄrt team av systemadministratörer fick i uppdrag att snabbt och effektivt arbeta i Kina.

Vi behövde besvara en viktig frÄga: kan vi med smÄ insatser lösa alla problem relaterade till den kinesiska internetanvÀndningen och brandvÀggen pÄ nÀtverks-/moln-/servernivÄ?

Vi började med att fÄ ICP-licensen.

ICP-licens

För att kunna driva vÄr tjÀnst inom Kina (Mainland China) och utföra tester behöver vi först fÄ ICP-licensen för domÀnen.

Om webbtrafiken frÄn din anvÀndare termineras inom Fastlandskina och din domÀn saknar en ICP-licens, kommer din trafik att blockeras av leverantören/vÀrden. Det Àr intressant att en specifik leverantör, oavsett om det Àr Cloudflare eller Alibaba Cloud, nÀmns i ICP-licensen. Om du har fÄtt en ICP-licens för Cloudflare och har hostat din webbplats dÀr, kommer det inte att vara möjligt att "smidigt" flytta den till Alibaba Cloud senare. Du mÄste lÀgga till en ytterligare hosting i denna licens.

NÀr vi fick ICP-licensen för domÀnen kunde vi börja ta fram och implementera specifika tekniska idéer och lösningar.

Testning av lösningar

Men innan vi direkt skapar staging-alternativ, justerar instÀllningar, och optimerar webbplatsens prestanda och hastighet, Àr det nödvÀndigt att vÀlja verktyget för att testa webbplatsen, sÄ att vi kan se vilka ÄtgÀrder som förbÀttrar eller försÀmrar dess funktion.

VÄrt testverktyg mÄste uppfylla tvÄ huvudkrav:

  • det ska kunna köra tester frĂ„n Kina,
  • det ska erbjuda webblĂ€sartester.

SÄ vi hittade Catchpoint! De har utmÀrkt tÀckning med testpunkter vÀrlden över. I Kina kan tester ocksÄ köras genom detta verktyg frÄn ett stort antal provinser. I varje provins finns flera olika leverantörer + möjligheten att göra Backbone-tester (nÄgot i stil med en virtuell maskin i datacentret) och Lastmile-tester (maximalt nÀra anvÀndarens förhÄllanden, d.v.s. arbetsstation). Den sista typen av tester kostar mer.

Genom att teckna ett Ärligt avtal (mindre Àr inte möjligt) började vi studera verktyget. Vi mÄste erkÀnna att vi blev glatt överraskade av dess funktionalitet. Man kan köra:

  • DNS-tester,
  • Web-tester (webblĂ€sartester, enkel GET/POST, emulering av mobilklient etc.),
  • Transaktionskontroller (t.ex. inloggning),
  • API-tester,
  • Ping, traceroute, NTP, etc.

Man kan inte rÀkna upp allt. Och det mest intressanta för oss (webblÀsartester) Àr att resultatet inkluderar:

  • Connect, Wait, Load, SSL, DNS-tid,
  • TTFB, TTLB, Dokument komplett, Render-tid, DOM-laddning,
  • Svar (nĂ„got nĂ€ra Time To First Byte), Webbsvars-tid (nĂ„got nĂ€ra Time To Last Byte),
  • Eventuella percentiler, Genomsnitt, Median tid
  • och sĂ„ vidare.

DÀrför hjÀlper dessa mÀtningar oss att se förÀndringar och förstÄ om det har blivit bÀttre. Vi har frÀmst tittat pÄ Response, Webpage Response, Median, 75 och 95 percentiler.

En viktig frĂ„ga som hĂ€ngde i luften frĂ„n början: kan man lita pĂ„ Catchpoint? ОтражаДт лО ŃŃ‚ĐŸŃ‚ ĐžĐœŃŃ‚Ń€ŃƒĐŒĐ”ĐœŃ‚ Ń€Đ”Đ°Đ»ŃŒĐœŃƒŃŽ сĐșĐŸŃ€ĐŸŃŃ‚ŃŒ Đ·Đ°ĐłŃ€ŃƒĐ·ĐșĐž саĐčта ĐČ ĐšĐžŃ‚Đ°Đ” Оз Ń€Đ°Đ·ĐœŃ‹Ń… ĐłĐŸŃ€ĐŸĐŽĐŸĐČ ĐžĐ»Đž жД ŃŃ‚ĐŸ ĐżŃ€ĐŸŃŃ‚ĐŸ ĐșаĐșĐŸĐč-Ń‚ĐŸ тДст ĐČ ĐČаĐșŃƒŃƒĐŒĐ”, ĐœĐ” ĐžĐŒĐ”ŃŽŃ‰ĐžĐč ĐœĐžŃ‡Đ”ĐłĐŸ ĐŸĐ±Ń‰Đ”ĐłĐŸ с real user experience?
Det Àr ett stort problem, eftersom det Àr nÀstan omöjligt att pÄ ett tillförlitligt sÀtt ta reda pÄ hur en webbplats frÄn Kina fungerar nÀr man befinner sig i Ryssland. Genom att anvÀnda en socks-proxy via en virtuell maskin fÄr man en webbplatsladdning pÄ ett par minuter, vilket Àr oacceptabelt för tester; dÀrför ÄterstÄr curl och enkla GET-anrop frÄn konsolen med tidsmÀtning som det enda alternativet för manuell testning. Detta Àr till hjÀlp eftersom detta test vÀl Äterspeglar hastigheten pÄ nÀtverkslösningen, och om det dessutom finns webblÀsartester sÄ Àr det helt okej.

Senare reste vi sjÀlva till Kina och kunde bekrÀfta att man kan lita pÄ Catchpoint, den Äterspeglar hastighetsresultaten ganska exakt.

Cloudflare China Network

Eftersom vi framgĂ„ngsrikt anvĂ€nder Cloudflare för vĂ„r huvuddomĂ€n semrush.com, beslöt vi oss för att omedelbart prova deras funktion som kallas China Network. Detta alternativ aktiveras endast för Enterprise-webbplatser pĂ„ förfrĂ„gan och mot en extra kostnad. Dessutom Ă€r det endast tillgĂ€ngligt för webbplatser som har en giltig ICP-licens, dĂ€r Cloudflare anges som leverantör. NĂ€r det har aktiverats blir ‘kinesisk CDN’ frĂ„n Cloudflare tillgĂ€nglig för webbplatsen - trafiken frĂ„n kinesiska regioner landar i nĂ€rmaste CF PoP (Points of Presence), och dĂ€refter levereras den genom deras nĂ€tverk eller nĂ€tverken hos leverantörer/parters till origin.

Skissen av denna testmiljö presenteras nedan.

För oss Àr detta ett utmÀrkt alternativ. Det visar sig att den andra domÀnen ocksÄ kommer att vara bakom CF, vilket inte ökar antalet lösningar som anvÀnds i företaget samt praktiskt taget inte komplicerar infrastrukturen.

Vi har startat webblÀsartester och hÀr Àr vad vi fick:

De röda romberna Àr testfel. Felen lÀngst ner Àr DNS-fel (resolve timeout). Felen högst upp Àr tidsöverskridanden.

Uptime: 86.6
Median: 18s
75 Percentile: 29.3s
95 Percentile: 60s

Medianen, efter att ha tagit bort laddningen reCaptcha (en Google-tjÀnst som Àr blockerad i Kina), minskade frÄn 28 till 18 sekunder. Men det Àr ÀndÄ fruktansvÀrda siffror, med tanke pÄ att samma test för semrush.com (frÄn USA) gav mindre Àn 10 sekunder för 95% av anvÀndarna (frÄn USA) pÄ samma sida (statik + dynamik).

Du kan gÄ in i varje test och titta pÄ Waterfall och andra mer detaljerade parametrar. Vi började undersöka orsakerna till felen, och om tidsutdragen Àr ganska tydliga: internet i Kina "gÄr fram och tillbaka", vilket gör att hastigheten pÄ anslutningen och inlÀsningen av resurser frÄn utlandet Àr instabil och varierande, sÄ blev vi djupt överraskade av DNS-felen. Vi upptÀckte att PoP Cloudflares servrar verkligen Àr i Kina, webbplatsadressen resolveras till en anycast IP, men DNS-servrarna Àr amerikanska, vilket gör att DNS-förfrÄgningarna mÄste passera grÀnsen, sÄ ibland misslyckas de.

Vid förtydligande av denna frÄga med CF, visade det sig att de inte har egna DNS-servrar i Kina, och nÀr de kommer att ha det Àr fortfarande okÀnt.

DÀrför beslutade vi att bara testa Cloudflares DNS och Àndrade Cloudflares arbetslÀge för vÄr webbplats till lÀget "Endast DNS". Det Àr ett lÀge dÀr Cloudflare inte proxyar trafiken genom sig sjÀlv, vilket innebÀr att de inte erbjuder DDoS-skydd, CDN och andra funktioner och fungerar som en vanlig DNS-server.

Denna arkitektur Àr schematiskt presenterad i följande bild. I bilden beaktas de nya insikterna om att Cloudflares DNS-servrar Àr bakom brandvÀggen.

I Catchpoint körde vi enkla GET-tester (inte webblÀsartester), vilket visade mycket mÄnga misslyckanden. Orsaken till dessa var fortfarande DNS-felen.

Vi började debugga dessa fel med hjÀlp av dig och upptÀckte att vid den första förfrÄgan bestÀms adressen korrekt, men vid en upprepning av förfrÄgan fÄr vi varje gÄng SERVFAIL och not found. Vad Àr det plötsligt?

root@iZwz97n2wgbp61qucbfrjsZ:~# host semrushchina.cn
semrushchina.cn har adress 220.170.186.192
VĂ€rd semrushchina.cn kunde inte hittas: 2(SERVFAIL)
root@iZwz97n2wgbp61qucbfrjsZ:~# host semrushchina.cn
semrushchina.cn har adress 220.170.186.192
VĂ€rd semrushchina.cn kunde inte hittas: 2(SERVFAIL)
root@iZwz97n2wgbp61qucbfrjsZ:~# host semrushchina.cn
semrushchina.cn har adress 220.170.186.192
VĂ€rd semrushchina.cn kunde inte hittas: 2(SERVFAIL)
root@iZwz97n2wgbp61qucbfrjsZ:~# host semrushchina.cn
semrushchina.cn har adress 220.170.186.192
VĂ€rd semrushchina.cn kunde inte hittas: 2(SERVFAIL)

Vid direktförfrÄgan av Cloudflares NS-servrar finns det inga sÄdana fel:

root@iZwz97n2wgbp61qucbfrjsZ:~# for i in `seq 1 2`; do host semrushchina.cn ray.ns.cloudflare.com.; done
AnvÀnder domÀnserver:
Namn: ray.ns.cloudflare.com.
Adress: 173.245.59.138#53
Alias:

semrushchina.cn har adress 220.170.186.192
semrushchina.cn har adress 220.170.186.192
AnvÀnder domÀnserver:
Namn: ray.ns.cloudflare.com.
Adress: 173.245.59.138#53
Alias:

semrushchina.cn har adress 220.170.186.192
semrushchina.cn har adress 220.170.186.192

Det betyder att problemet ligger pÄ sidan av den "lokala" DNS-servern eller leverantörens server.
Vidare undersökning visade att SERVFAIL vi fÄr pÄ resolven AAAA-poster.

Det visade sig att vid en förfrÄgan hos Cloudflare AAAAA-post som inte finns i domÀnen, svarade Cloudflare A-post som Àr ett fel och en avvikelse frÄn RFC. Vilket ledde till att den lokala resolvern (x.x.x.x) inte gillade det, och den svarade SERVFAIL. I loggen nedan syns detta beteende tydligt:

root@iZwz97n2wgbp61qucbfrjsZ:~# dig -t AAAA semrushchina.cn @x.x.x.x

; <> DiG 9.10.3-P4-Ubuntu <> -t AAAA semrushchina.cn @x.x.x.x
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 55467
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;semrushchina.cn.               IN      AAAA

;; Query time: 334 msec
;; SERVER: x.x.x.x#53(x.x.x.x)
;; WHEN: Tue Aug 14 23:38:50 CST 2018
;; MSG SIZE  rcvd: 44

root@iZwz97n2wgbp61qucbfrjsZ:~# dig -t AAAA semrushchina.cn @dana.ns.cloudflare.com.

; <> DiG 9.10.3-P4-Ubuntu <> -t AAAA semrushchina.cn @dana.ns.cloudflare.com.
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63944
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;semrushchina.cn.               IN      AAAA

;; ANSWER SECTION:
semrushchina.cn.        300     IN      A       220.170.186.192

;; Query time: 185 msec
;; SERVER: 173.245.58.105#53(173.245.58.105)
;; WHEN: Tue Aug 14 23:43:03 CST 2018
;; MSG SIZE  rcvd: 60

Vi skickade en buggrapport till Cloudflare, och de ÄtgÀrdade det efter ett tag. Det visade sig vara intressant: för nÀrvarande finns det fortfarande inget stöd för IPv6 i Kina, sÄ Cloudflare kunde inte ge sitt IPv6-adress i svaret pÄ förfrÄgan AAAAA-poster. Slutresultatet blev att Cloudflare började svara NODATA pÄ sÄdana förfrÄgningar.

SÄ, DNS-fel i Catchpoint-testerna minskade kraftigt, men inte helt. TidsgrÀnser försvann inte heller:

Och vi började söka efter en annan lösning.

I nÀsta del kommer jag att berÀtta hur vi testade det kinesiska molnet Alibaba Cloud, hur vi med lite "magi" frÄn Nginx snabbt kunde skapa PoC (Proof of Concept) lösningar, hur vi skapade Multi-Cloud lösningar, varav en verkligen hjÀlpte till att pÄskynda tjÀnsten frÄn Kina.

Stay tuned!

Följande delar

Del 2

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster