குபெர்னெட்டஸுடனான வாழ்க்கையிலிருந்து: HTTP சேவையகம் எப்படி ஸ்பானியர்களுக்கு ஆதரவாக இல்லை

குபெர்னெட்டஸுடனான வாழ்க்கையிலிருந்து: HTTP சேவையகம் எப்படி ஸ்பானியர்களுக்கு ஆதரவாக இல்லை

மைக்ரோசாப்ட் (Azure) இலிருந்து கிளவுட்டில் இருக்கும் அப்ளிகேஷன் ஸ்டேக் இருக்கும் எங்கள் கிளையண்டின் பிரதிநிதி, ஒரு சிக்கலைத் தீர்த்தார்: சமீபத்தில், ஐரோப்பாவிலிருந்து சில வாடிக்கையாளர்களிடமிருந்து சில கோரிக்கைகள் பிழை 400 உடன் முடிவடையத் தொடங்கின (தவறான கோரிக்கை) அனைத்து பயன்பாடுகளும் .NET இல் எழுதப்பட்டுள்ளன, குபெர்னெட்ஸில் பயன்படுத்தப்படுகின்றன...

பயன்பாடுகளில் ஒன்று API ஆகும், இதன் மூலம் அனைத்து போக்குவரமும் இறுதியில் வருகிறது. இந்த டிராஃபிக்கை HTTP சர்வர் கேட்கிறது கெஸ்ட்ரல், .NET கிளையண்ட் மூலம் கட்டமைக்கப்பட்டது மற்றும் ஒரு பாட் ஹோஸ்ட். பிழைத்திருத்தத்தின் மூலம், சிக்கலைத் தொடர்ந்து மறுஉருவாக்கம் செய்யும் ஒரு குறிப்பிட்ட பயனர் இருப்பதால் நாங்கள் அதிர்ஷ்டசாலிகள். இருப்பினும், போக்குவரத்து சங்கிலியால் எல்லாம் சிக்கலானது:

குபெர்னெட்டஸுடனான வாழ்க்கையிலிருந்து: HTTP சேவையகம் எப்படி ஸ்பானியர்களுக்கு ஆதரவாக இல்லை

உட்செலுத்தலில் உள்ள பிழை இப்படி இருந்தது:

{
   "number_fields":{
      "status":400,
      "request_time":0.001,
      "bytes_sent":465,
      "upstream_response_time":0,
      "upstream_retries":0,
      "bytes_received":2328
   },
   "stream":"stdout",
   "string_fields":{
      "ingress":"app",
      "protocol":"HTTP/1.1",
      "request_id":"f9ab8540407208a119463975afda90bc",
      "path":"/api/sign-in",
      "nginx_upstream_status":"400",
      "service":"app",
      "namespace":"production",
      "location":"/front",
      "scheme":"https",
      "method":"POST",
      "nginx_upstream_response_time":"0.000",
      "nginx_upstream_bytes_received":"120",
      "vhost":"api.app.example.com",
      "host":"api.app.example.com",
      "user":"",
      "address":"83.41.81.250",
      "nginx_upstream_addr":"10.240.0.110:80",
      "referrer":"https://api.app.example.com/auth/login?long_encrypted_header",
      "service_port":"http",
      "user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36",
      "time":"2019-03-06T18:29:16+00:00",
      "content_kind":"cache-headers-not-present",
      "request_query":""
   },
   "timestamp":"2019-03-06 18:29:16",
   "labels":{
      "app":"nginx",
      "pod-template-generation":"6",
      "controller-revision-hash":"1682636041"
   },
   "namespace":"kube-nginx-ingress",
   "nsec":6726612,
   "source":"kubernetes",
   "host":"k8s-node-55555-0",
   "pod_name":"nginx-v2hcb",
   "container_name":"nginx",
   "boolean_fields":{}
}

அதே நேரத்தில், கெஸ்ட்ரல் கொடுத்தார்:

HTTP/1.1 400 Bad Request
Connection: close
Date: Wed, 06 Mar 2019 12:34:20 GMT
Server: Kestrel
Content-Length: 0

அதிகபட்ச verbosity கூட, Kestrel பிழை மிகவும் கொண்டுள்ளது சிறிய பயனுள்ள தகவல்:

{
   "number_fields":{"ThreadId":76},
   "stream":"stdout",
   "string_fields":{
      "EventId":"{"Id"=>17, "Name"=>"ConnectionBadRequest"}",
      "SourceContext":"Microsoft.AspNetCore.Server.Kestrel",
      "ConnectionId":"0HLL2VJSST5KV",
      "@mt":"Connection id "{ConnectionId}" bad request data: "{message}"",
      "@t":"2019-03-07T13:06:48.1449083Z",
      "@x":"Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Malformed request: invalid headers.n   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection.TryParseRequest(ReadResult result, Boolean& endConnection)n   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.<ProcessRequestsAsync>d__185`1.MoveNext()",
      "message":"Malformed request: invalid headers."
   },
   "timestamp":"2019-03-07 13:06:48",
   "labels":{
      "pod-template-hash":"2368795483",
      "service":"app"
   },
   "namespace":"production",
   "nsec":145341848,
   "source":"kubernetes",
   "host":"k8s-node-55555-1",
   "pod_name":"app-67bdcf98d7-mhktx",
   "container_name":"app",
   "boolean_fields":{}
}

இந்த சிக்கலை தீர்க்க tcpdump மட்டுமே உதவும் என்று தோன்றுகிறது ... ஆனால் நான் போக்குவரத்து சங்கிலி பற்றி மீண்டும் சொல்கிறேன்:

குபெர்னெட்டஸுடனான வாழ்க்கையிலிருந்து: HTTP சேவையகம் எப்படி ஸ்பானியர்களுக்கு ஆதரவாக இல்லை

விசாரணை

வெளிப்படையாக, போக்குவரத்தைக் கேட்பது நல்லது அந்த குறிப்பிட்ட முனையில், குபெர்னெட்டஸ் ஒரு பாட் ஒன்றை அமைத்துள்ளார்: டம்ப்பின் அளவு, குறைந்த பட்சம் எதையாவது மிக விரைவாகக் கண்டுபிடிக்கும் வகையில் இருக்கும். உண்மையில், அதை ஆராயும்போது, ​​​​பின்வரும் சட்டகம் கவனிக்கப்பட்டது:

GET /back/user HTTP/1.1
Host: api.app.example.com
X-Request-ID: 27ceb14972da8c21a8f92904b3eff1e5
X-Real-IP: 83.41.81.250
X-Forwarded-For: 83.41.81.250
X-Forwarded-Host: api.app.example.com
X-Forwarded-Port: 443
X-Forwarded-Proto: https
X-Original-URI: /front/back/user
X-Scheme: https
X-Original-Forwarded-For: 83.41.81.250
X-Nginx-Geo-Client-Country: Spain
X-Nginx-Geo-Client-City: M.laga
Accept-Encoding: gzip
CF-IPCountry: ES
CF-RAY: 4b345cfd1c4ac691-MAD
CF-Visitor: {"scheme":"https"}
pragma: no-cache
cache-control: no-cache
accept: application/json, text/plain, */*
origin: https://app.example.com
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36
referer: https://app.example.com/auth/login
accept-language: en-US,en;q=0.9,en-GB;q=0.8,pl;q=0.7
cookie: many_encrypted_cookies; .AspNetCore.Identity.Application=something_encrypted; 
CF-Connecting-IP: 83.41.81.250
True-Client-IP: 83.41.81.250
CDN-Loop: cloudflare

HTTP/1.1 400 Bad Request
Connection: close
Date: Wed, 06 Mar 2019 12:34:20 GMT
Server: Kestrel
Content-Length: 0

குப்பைத்தொட்டியை உன்னிப்பாகப் பார்த்தபோது, ​​அந்த வார்த்தை கவனிக்கப்பட்டது M.laga. ஸ்பெயினில் M.laga நகரம் இல்லை என்று யூகிக்க எளிதானது (ஆனால் உள்ளது மலகா) இந்த யோசனையைப் பயன்படுத்தி, உள் நுழைவு கட்டமைப்புகளைப் பார்த்தோம், அங்கு ஒரு மாதத்திற்கு முன்பு செருகப்பட்டதைக் கண்டோம் (வாடிக்கையாளரின் வேண்டுகோளின்படி) "தீங்கற்ற" துணுக்கு:

    ingress.kubernetes.io/configuration-snippet: |
      proxy_set_header X-Nginx-Geo-Client-Country $geoip_country_name;
      proxy_set_header X-Nginx-Geo-Client-City $geoip_city;

இந்த தலைப்புகளை முன்னனுப்புவதை முடக்கிய பிறகு, எல்லாம் சரியாகிவிட்டது! (பயன்பாட்டிற்கு இனி இந்த தலைப்புகள் தேவையில்லை என்பது விரைவில் தெளிவாகியது.)

இப்போது சிக்கலைப் பார்ப்போம் மேலும் பொதுவாக. டெல்நெட் கோரிக்கையை வைப்பதன் மூலம் பயன்பாட்டிற்குள் எளிதாக மீண்டும் உருவாக்க முடியும் localhost:80:

GET /back/user HTTP/1.1
Host: api.app.example.com
cache-control: no-cache
accept: application/json, text/plain, */*
origin: https://app.example.com
Cookie: test=Desiree

... திரும்புகிறது 401 Unauthorized, எதிர்பார்த்தபடி. நாம் செய்தால் என்ன நடக்கும்:

GET /back/user HTTP/1.1
Host: api.app.example.com
cache-control: no-cache
accept: application/json, text/plain, */*
origin: https://app.example.com
Cookie: test=Désirée

?

திரும்பி வரும் 400 Bad request - விண்ணப்பப் பதிவில் ஏற்கனவே நமக்குத் தெரிந்த பிழையைப் பெறுவோம்:

{
   "@t":"2019-03-31T12:59:54.3746446Z",
   "@mt":"Connection id "{ConnectionId}" bad request data: "{message}"",
   "@x":"Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Malformed request: invalid headers.n   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection.TryParseRequest(ReadResult result, Boolean& endConnection)n   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.<ProcessRequestsAsync>d__185`1.MoveNext()",
   "ConnectionId":"0HLLLR1J974L9",
   "message":"Malformed request: invalid headers.",
   "EventId":{
      "Id":17,
      "Name":"ConnectionBadRequest"
   },
   "SourceContext":"Microsoft.AspNetCore.Server.Kestrel",
   "ThreadId":71
}

முடிவுகளை

குறிப்பாக கெஸ்ட்ரல் முடியாது UTF-8 இல் சரியான எழுத்துகளுடன் HTTP தலைப்புகளைச் சரியாகச் செயல்படுத்தவும், அவை அதிக எண்ணிக்கையிலான நகரங்களின் பெயர்களில் உள்ளன.

எங்கள் விஷயத்தில் கூடுதல் காரணி என்னவென்றால், க்ளையன்ட் தற்போது பயன்பாட்டில் Kestrel ஐ செயல்படுத்துவதை மாற்றத் திட்டமிடவில்லை. இருப்பினும், AspNetCore இல் உள்ள சிக்கல்கள் (№4318, №7707) இது உதவாது என்று அவர்கள் கூறுகிறார்கள் ...

சுருக்கமாக: குறிப்பு Kestrel அல்லது UTF-8 (2019 இல்?!) இன் குறிப்பிட்ட சிக்கல்களைப் பற்றியது அல்ல, ஆனால் அந்த உண்மையைப் பற்றியது நினைவாற்றல் மற்றும் நிலையான படிப்பு சிக்கல்களைத் தேடும்போது நீங்கள் எடுக்கும் ஒவ்வொரு அடியும் விரைவில் அல்லது பின்னர் பலனைத் தரும். நல்ல அதிர்ஷ்டம்!

சோசலிஸ்ட் கட்சி

எங்கள் வலைப்பதிவிலும் படிக்கவும்:

ஆதாரம்: www.habr.com

கருத்தைச் சேர்