Comment nous avons percé le grand pare-feu chinois (partie 1)

Bonjour Ă  tous!


En contact Nikita est un ingénieur système de SEMrush . Aujourd'hui, je vais vous expliquer comment nous avons fait face à la tâche d'assurer la stabilité de notre service semrush.com en Chine et quels problèmes nous avons rencontrés lors de sa mise en œuvre (compte tenu de l'emplacement de notre centre de données sur la côte est des États-Unis).


Ce sera une grande histoire, divisée en plusieurs articles. Je vais vous raconter comment tout cela s’est passé avec nous: d’un service totalement inutilisé de la Chine à la performance du service au niveau de sa version américaine pour les Américains. Je promets que ce sera intéressant et utile. Alors allons-y.



Problèmes d'Internet chinois


Même la personne la plus éloignée des spécificités de l'administration réseau a au moins une fois entendu parler du grand pare-feu chinois . Euh, ça a l'air cool, hein? Mais ce que c'est, comment cela fonctionne réellement est une question assez compliquée. Sur Internet, vous pouvez trouver de nombreux articles à ce sujet, mais d'un point de vue technique, l'appareil de ce pare-feu n'est décrit nulle part. Ce qui n'est cependant pas surprenant. J'avoue tout de suite que, sur la base des résultats de l'année de travail, je ne peux pas dire exactement comment cela fonctionne, mais je peux parler de mes commentaires et de mes conclusions pratiques. Et nous commencerons par des rumeurs sur ce pare-feu.


Il y a beaucoup de rumeurs sur ce pare-feu. Rassemblons les principaux et les plus intéressants d'entre eux dans une seule liste:


  • Google, Facebook, Twitter et d'autres services similaires sont bloquĂ©s et ne fonctionnent pas en Chine.
  • Tout trafic allant au-delĂ  de la Chine et vers la Chine est analysĂ© et limitĂ© par l'apprentissage automatique (en cas de trafic suspect), ce qui le ralentit considĂ©rablement (trafic) passant par la frontière.
  • Les agences de renseignement chinois piratent tout trafic cryptĂ© qui passe par leur pare-feu.
  • Les tunnels VPN, les tunnels IPSEC sont instables, tombent et sont constamment bloquĂ©s.
  • Plus le cryptage est simple, plus la phrase de passe utilisĂ©e pour l'authentification / chiffrement du trafic est simple, plus il passe rapidement le pare-feu chinois.

Voici ce que nous avons réussi à découvrir sur ces rumeurs:


  • Google, Facebook, Twitter et d'autres services similaires sont vraiment bloquĂ©s (votre KO), mais de nombreux domaines techniques de Google, par exemple, ne sont pas interdits et fonctionnent (le mĂŞme gstatic.com). Cela conduit Ă  la conclusion: ne supprimez pas imprudemment toutes les ressources Google et autres qui semblent ĂŞtre bloquĂ©es, apparemment bloquĂ©es.
  • Tout trafic passant par la frontière ajoute vraiment un sĂ©rieux retard Ă  son temps. Regardez les deux rĂ©sultats. Un site, une page, simple get curl . La première mesure de la Chine elle-mĂŞme (la belle ville de Shenzhen). Le second s'est figĂ© Ă  l'extĂ©rieur de Hong Kong (il a la souverainetĂ©, et il n'y a pas de pare-feu entre lui et le monde). La distance entre les villes en ligne droite est d'environ 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 

Faites attention à time_connect . Et en général, vous voyez le résultat: le pare-feu ajoute 4 secondes supplémentaires, ce qui est monstrueusement long.


  • Les VPN et les tunnels IPSEC tombent souvent. J'en parlerai un peu plus tard et plus en dĂ©tail. Les serveurs VPN utilisĂ©s par les utilisateurs sont bloquĂ©s au fil du temps (gĂ©nĂ©ralement dans la journĂ©e suivant le dĂ©but de l'utilisation).
  • Des personnes vivant en Chine pensent que plus le cryptage du trafic est facile, plus il passe rapidement Ă  la frontière, car il est facile de comprendre qu'il n'y a rien d'illĂ©gal. Et tout comme le trafic «propre» obtient plus de bande passante et de vitesse, et le trafic «sale», qui ne fait rien, obtient un passage plus lent au contraire. Pour un exemple, j'apporterai curl Ă  ifconfig.co en utilisant les protocoles HTTPS et HTTP.

 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 

La différence est de 5 secondes pour un temps de chargement total de 13 octets. En effectuant ce test plusieurs fois, vous pouvez voir que GET sur HTTP se termine en général en même temps à chaque fois, alors qu'en utilisant HTTPS le site répond parfois en 3, 5, 10 et même 17 secondes. Des erreurs SSL se produisent parfois:


Unknown SSL protocol error in connection to ifconfig.co:443.


Donc ce que nous avons:


  • Les problèmes créés par le pare-feu chinois dĂ©crit ci-dessus.
  • Les pings vers les ressources externes et les tunnels intĂ©rieurs disparaissent pĂ©riodiquement.
  • La latence entre deux points est en constante Ă©volution, et souvent elle est tout simplement imprĂ©visible. En connectant diffĂ©rentes villes / rĂ©gions, vous vous attendez Ă  ce qu'en fonction de la situation gĂ©ographique des rĂ©gions, le retard soit moindre et vous obtenez exactement la situation inverse.
  • Les canaux Internet et de communication sont rapides ou lents. Il y a une lĂ©gère dĂ©pendance Ă  l'heure et au jour de la semaine, mais pas toujours.
  • Les requĂŞtes DNS vers le monde extĂ©rieur depuis la Chine dĂ©passent parfois le dĂ©lai d'attente autorisĂ©.

L'image se profile simplement «excellente».


Le centre de données, comme je l'ai déjà dit, se trouve à l'est des États-Unis, et l'ensemble du SEMrush se compose de dizaines de produits, backends, frontends, bases de données interconnectés, et tout cela dans le centre de données et dans les nuages. En tant qu'équipe d'administrateurs système, nous avons été chargés d'un petit effort pour commencer rapidement à travailler en Chine.


Nous avons dû répondre à une question importante: pouvons-nous nous débrouiller avec un peu de sang et résoudre tous les problèmes liés à Internet chinois et au pare-feu au niveau du réseau / cloud / serveur?


Nous avons commencé par obtenir une licence ICP .


Licence ICP


Afin de pouvoir placer votre service en Chine (Chine continentale) et effectuer des tests, vous devez d'abord obtenir une licence de domaine ICP.


Si le trafic utilisateur de votre site est interrompu en Chine continentale, et si votre domaine n'a pas de licence ICP, votre trafic sera bloqué côté fournisseur / hébergement. Fait intéressant, un fournisseur spécifique s'intègre dans la licence ICP, que ce soit Cloudflare ou Alibaba Cloud. Par conséquent, si vous avez reçu une licence ICP pour Cloudflare et hébergé votre site avec eux, vous ne pourrez pas passer «en toute transparence» à Alibaba Cloud. Il sera nécessaire d'ajouter un hébergement supplémentaire à cette licence.


Ayant reçu une licence de domaine ICP, nous avons pu trouver et mettre en œuvre des idées et des solutions techniques spécifiques.


Solutions de test


Mais avant de créer directement les options de mise en scène, de tourner les boutons, d'optimiser le site et sa vitesse, vous devez choisir un outil pour le tester pour voir ce que nos actions améliorent ou aggravent le travail du site.


Notre outil de test devait répondre à deux exigences principales:


  • il devrait pouvoir effectuer des tests en Chine,
  • Il doit avoir des tests de navigateur.

Nous avons donc trouvé le point d' arrêt ! Ils ont une excellente couverture avec des points de test dans le monde entier. En Chine, grâce à cet outil, vous pouvez également exécuter des tests dans 100 500 provinces. Dans chacun, plusieurs fournisseurs différents + la possibilité de faire des tests Backbone (quelque chose comme une machine virtuelle dans un centre de données) et des tests Lastmile (aussi près que possible des conditions de l'utilisateur, alias poste de travail). Ce dernier type de test est plus cher.


Après avoir conclu un contrat d'un an (vous ne pouvez pas faire moins), nous avons commencé à étudier l'outil. Franchement, nous avons été agréablement surpris par sa fonctionnalité. Vous pouvez exécuter:


  • Tests DNS
  • Tests Web (navigateur, simple GET / POST, Ă©mulation d'un client mobile, etc.),
  • ContrĂ´les transactionnels (par exemple, connexion),
  • Tests API
  • Ping, traceroute, NTP, etc.

Vous ne pouvez pas tout répertorier. Et surtout, chaque test peut être assez bien personnalisé en ajoutant un tas d'en-têtes et d'autres paramètres. Le résultat est une énorme quantité d'informations qui décrit pleinement votre test. Si nous parlons des plus intéressants pour nous (tests de navigateur), le résultat comprend:


  • Se connecter, attendre, charger, SSL, heure DNS,
  • TTFB, TTLB, Document terminĂ©, Temps de rendu, Charge DOM,
  • RĂ©ponse (quelque chose proche de Time To First Byte), RĂ©ponse de page Web (quelque chose proche de Time To Last Byte),
  • N'importe quel centile, moyenne, temps mĂ©dian
  • Etc.

En conséquence, toutes ces métriques vous aident à voir les changements et à comprendre s'ils se sont améliorés. Nous avons principalement examiné Response, Webpage Response, Median, 75 et 95 Percentiles .


Une question importante qui se pose depuis le tout début: est- il possible de croire Catchpoint ? Cet outil reflète-t-il la vitesse réelle de chargement du site en Chine à partir de différentes villes ou s'agit-il simplement d'une sorte de test dans le vide qui n'a rien à voir avec une véritable expérience utilisateur?
C'est un gros problème, car être en Russie est presque impossible de savoir de manière fiable comment fonctionne le site chinois. En faisant socks-proxy via une machine virtuelle, vous obtenez un chargement de site Web en quelques minutes à la fin, ce qui est tout simplement inacceptable pour les tests, donc les boucles et les GET simples à partir de la console avec mesure du temps restent la seule option pour les tests manuels. Cela aide, car ce test reflète la vitesse de la solution réseau et s'il y a des tests de navigateur, c'est très bien.


Plus tard, nous sommes allés en Chine nous-mêmes et nous sommes assurés que Catchpoint peut être digne de confiance, il reflète assez précisément les vrais indicateurs de vitesse.


Réseau Cloudflare Chine


Comme nous utilisons avec succès Cloudflare pour le domaine principal semrush.com, nous avons décidé d'essayer immédiatement leur fonctionnalité appelée China Network . Cette option est activée uniquement pour les sites Enterprise sur demande et moyennant des frais. Il est également disponible uniquement pour les sites qui ont la licence ICP appropriée, dans laquelle Cloudflare est spécifié comme fournisseur. Après son inclusion, le «CDN chinois» de Cloudflare devient disponible pour le site - le trafic en provenance des régions chinoises arrive dans le prochain PoP (Points of Presence) CF, puis il est livré à l'origine via ses réseaux ou réseaux de fournisseurs / partenaires.


Le schéma de ce banc d'essai est présenté ci-dessous.



C'est une excellente option pour nous. Il s'avère que le deuxième domaine sera également pour CF, ce qui n'ajoute pas le nombre de solutions utilisées dans l'entreprise et ne complique pratiquement pas l'infrastructure.


Nous avons exécuté les tests du navigateur, et c'est ce qui s'est produit:



Les diamants rouges sont des fichiers de test. Les fichiers ci-dessous sont des erreurs DNS (résoudre le délai). Les échecs ci-dessus sont des délais d'attente.


Disponibilité: 86,6
Médiane: 18 s
75 centile: 29,3 s
95 centile: 60s


La médiane, après avoir supprimé le téléchargement de reCaptcha (un service Google bloqué en Chine), est passée de 28 à 18 secondes. Mais quand même, ce sont de terribles indicateurs, étant donné que le même test pour semrush.com (aux USA) a donné moins de 10 secondes pour 95% des utilisateurs (aux USA) à la même page (statique + dynamique).


Dans chaque test, vous pouvez aller voir Waterfall et d'autres paramètres plus détaillés. Nous avons commencé à enquêter sur les causes des erreurs, et si pour les délais d'attente tout est moins ou moins clair: Internet en Chine "se déplace vers le bas, puis s'éloigne", à cause de cela la vitesse de connexion et de chargement des ressources de l'étranger est instable et inégale, alors les erreurs DNS nous ont beaucoup surpris . Nous avons constaté que les PoPs de Cloudflare sont en effet situés en Chine, l'adresse du site se résout en une seule IP anycast, mais les serveurs DNS sont utilisés par les États-Unis, c'est pourquoi les requêtes DNS sont obligées de passer par la frontière, donc parfois elles échouent.


Après avoir clarifié cette question avec CF, il s'est avéré qu'ils n'ont pas leurs propres serveurs DNS en Chine , et on ne sait toujours pas quand ce sera le cas.


Par conséquent, nous avons décidé de tester uniquement DNS Cloudflare et changé le mécanisme Cloudflare pour notre site en mode « DNS uniquement ». C'est un tel mode lorsque Cloudflare ne procède pas à un trafic proxy via lui-même, ce qui signifie qu'il ne fournit pas de protection DDoS, CDN et d'autres fonctionnalités, et fonctionne en mode de serveur DNS normal.


Ce support est représenté schématiquement dans la figure suivante. La figure prend en compte la nouvelle connaissance que le serveur DNS Cloudflare se trouve derrière le pare-feu.



Chez Catchpoint, nous avons exécuté de simples tests GET (sans navigateur) qui ont montré de nombreux échecs. La raison en était toutes les mêmes erreurs DNS.



Nous avons commencé à déboguer ces erreurs à l'aide de dig et avons constaté que l'adresse est déterminée correctement lors de la première demande, et sur demande répétée nous obtenons SERVFAIL et non trouvé à chaque fois. Qu'est-ce que c'est tout d'un coup?


 root@iZwz97n2wgbp61qucbfrjsZ:~# host semrushchina.cn semrushchina.cn has address 220.170.186.192 Host semrushchina.cn not found: 2(SERVFAIL) root@iZwz97n2wgbp61qucbfrjsZ:~# host semrushchina.cn semrushchina.cn has address 220.170.186.192 Host semrushchina.cn not found: 2(SERVFAIL) root@iZwz97n2wgbp61qucbfrjsZ:~# host semrushchina.cn semrushchina.cn has address 220.170.186.192 Host semrushchina.cn not found: 2(SERVFAIL) root@iZwz97n2wgbp61qucbfrjsZ:~# host semrushchina.cn semrushchina.cn has address 220.170.186.192 Host semrushchina.cn not found: 2(SERVFAIL) 

Lorsque vous demandez directement des serveurs Cloudflare NS, il n'y a pas de telles erreurs:


 root@iZwz97n2wgbp61qucbfrjsZ:~# for i in `seq 1 2`; do host semrushchina.cn ray.ns.cloudflare.com.; done Using domain server: Name: ray.ns.cloudflare.com. Address: 173.245.59.138#53 Aliases: semrushchina.cn has address 220.170.186.192 semrushchina.cn has address 220.170.186.192 Using domain server: Name: ray.ns.cloudflare.com. Address: 173.245.59.138#53 Aliases: semrushchina.cn has address 220.170.186.192 semrushchina.cn has address 220.170.186.192 

Cela signifie que le problème est du côté du serveur DNS «local» ou du serveur fournisseur.
Une enquête plus approfondie a montré que nous obtenons SERVFAIL sur la résolution du dossier AAAA .


Il s'est avéré que lorsque Cloudflare a demandé un enregistrement AAAA qui n'était pas dans le domaine, Cloudflare a répondu avec un enregistrement A , qui est une erreur et une incompatibilité RFC. À cause de cela, le résolveur local ( xxxx ) n'aimait pas cela, et il a répondu à SERVFAIL . Dans le journal ci-dessous, ce comportement est clairement visible:


 root@iZwz97n2wgbp61qucbfrjsZ:~# dig -t AAAA semrushchina.cn @xxxx ; <<>> DiG 9.10.3-P4-Ubuntu <<>> -t AAAA semrushchina.cn @xxxx ;; 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: xxxx#53(xxxx) ;; 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 

Nous avons envoyé un rapport de bogue Cloudflare, et ils l'ont corrigé après un certain temps. Cela s'est avéré intéressant: à l'heure actuelle, il n'y a toujours pas de support IPv6 en Chine, donc Cloudflare n'a pas pu donner son adresse IPv6 en réponse à une demande d'enregistrement AAAA . Au final, tout a été décidé pour que China Cloudflare commence à répondre à NODATA à de telles demandes.


Ainsi, les erreurs DNS dans les tests Catchpoint ont fortement diminué, mais pas jusqu'à la fin. Les délais d'attente n'ont pas non plus disparu:



Et nous avons commencé à chercher une autre solution.


Dans la partie suivante, je dirai comment nous avons testé le cloud chinois d' Alibaba , comment, avec l'aide d'un peu "magique" Nginx, nous avons pu créer rapidement des solutions PoC (Proof of Concept), comment nous avons créé des solutions multi-cloud, dont l'une a finalement beaucoup aidé accélérer le service depuis la Chine.


Restez à l'écoute!


Toutes les pièces


2e partie
3e partie

Source: https://habr.com/ru/post/fr458602/


All Articles