Squid HTTPS Tunneling con CONNECT molto lento


12

Uso calamari sulla mia rete per memorizzare nella cache i contenuti. Avvio Chrome con un'opzione della riga di comando che gli dice di utilizzare il proxy.

Nella maggior parte dei casi funziona alla grande poiché calamari memorizza nella cache una grande quantità di contenuti e con un numero limitato di utenti si comporta bene.

quando visito un sito Web che utilizza HTTPS con Chrome, la prima pagina si carica molto lentamente. La barra di stato su Chrome dice "In attesa di tunnel proxy ...". Chrome utilizza il verbo CONNECT per eseguire il tunneling del proxy e stabilire HTTPS con il server. Le pagine successive sono veloci perché Chrome mantiene aperta la connessione.

Ho controllato i miei registri squid3. Ecco alcune delle voci CONNECT. La seconda colonna è il tempo di risposta in millisecondi

1416064285.231   2926 192.168.12.10 TCP_MISS/200 0 CONNECT www.google.com:443 - DIRECT/74.125.136.105 -
1416064327.076  49702 192.168.12.10 TCP_MISS/200 1373585 CONNECT r2---sn-q4f7sn7l.googlevideo.com:443 - DIRECT/173.194.141.152 -
1416064345.018  63250 192.168.12.10 TCP_MISS/200 545 CONNECT mtalk.google.com:5228 - DIRECT/74.125.136.188 -
1416064372.020  63038 192.168.12.10 TCP_MISS/200 1809 CONNECT www.facebook.com:443 - DIRECT/31.13.91.2 -
1416064393.040  64218 192.168.12.10 TCP_MISS/200 25346 CONNECT clients4.google.com:443 - DIRECT/173.194.32.196 -
1416064408.040  63021 192.168.12.10 TCP_MISS/200 545 CONNECT mtalk.google.com:5228 - DIRECT/74.125.136.188 -
1416064408.040  62515 192.168.12.10 TCP_MISS/200 619 CONNECT ssl.gstatic.com:443 - DIRECT/173.194.32.207 -
1416064427.019  90301 192.168.12.10 TCP_MISS/200 2663948 CONNECT r2---sn-q4f7sn7l.googlevideo.com:443 - DIRECT/173.194.141.152 -
1416064429.019  63395 192.168.12.10 TCP_MISS/200 1339 CONNECT clients6.google.com:443 - DIRECT/173.194.32.195 -
1416064439.015  63382 192.168.12.10 TCP_MISS/200 764 CONNECT talkgadget.google.com:443 - DIRECT/173.194.32.199 -
1416064446.896 170270 192.168.12.10 TCP_MISS/200 2352814 CONNECT r20---sn-q4f7dm7z.googlevideo.com:443 - DIRECT/208.117.252.121 -
1416064471.010  62969 192.168.12.10 TCP_MISS/200 516 CONNECT mtalk.google.com:5228 - DIRECT/74.125.136.188 -
1416064524.010  63389 192.168.12.10 TCP_MISS/200 764 CONNECT talkgadget.google.com:443 - DIRECT/173.194.32.195 -
1416064534.014  63003 192.168.12.10 TCP_MISS/200 545 CONNECT mtalk.google.com:5228 - DIRECT/74.125.136.188 -
1416064542.010  63387 192.168.12.10 TCP_MISS/200 2114 CONNECT www.facebook.com:443 - DIRECT/31.13.91.2 -
1416064553.010  63376 192.168.12.10 TCP_MISS/200 470 CONNECT clients4.google.com:443 - DIRECT/173.194.32.194 -
1416064561.010  63379 192.168.12.10 TCP_MISS/200 1807 CONNECT mail.google.com:443 - DIRECT/173.194.32.213 -
1416064597.019  63003 192.168.12.10 TCP_MISS/200 545 CONNECT mtalk.google.com:5228 - DIRECT/74.125.136.188 -
1416064600.126      0 192.168.12.10 TCP_DENIED/403 3630 CONNECT www.google-analytics.com:443 - NONE/- text/html
1416064610.122  10959 192.168.12.10 TCP_MISS/200 626 CONNECT avatars0.githubusercontent.com:443 - DIRECT/185.31.17.133 -
1416064610.129  10968 192.168.12.10 TCP_MISS/200 576 CONNECT avatars1.githubusercontent.com:443 - DIRECT/185.31.17.133 -
1416064610.130  10968 192.168.12.10 TCP_MISS/200 628 CONNECT avatars1.githubusercontent.com:443 - DIRECT/185.31.17.133 -
1416064610.130  10967 192.168.12.10 TCP_MISS/200 576 CONNECT avatars1.githubusercontent.com:443 - DIRECT/185.31.17.133 -
1416064610.133  10972 192.168.12.10 TCP_MISS/200 576 CONNECT avatars1.githubusercontent.com:443 - DIRECT/185.31.17.133 -
1416064610.133  10970 192.168.12.10 TCP_MISS/200 627 CONNECT avatars0.githubusercontent.com:443 - DIRECT/185.31.17.133 -
1416064610.135  10972 192.168.12.10 TCP_MISS/200 576 CONNECT avatars3.githubusercontent.com:443 - DIRECT/185.31.17.133 -
1416064610.135  10972 192.168.12.10 TCP_MISS/200 628 CONNECT avatars2.githubusercontent.com:443 - DIRECT/185.31.17.133 -
1416064610.260  11098 192.168.12.10 TCP_MISS/200 574 CONNECT avatars3.githubusercontent.com:443 - DIRECT/185.31.17.133 -
1416064610.316  11155 192.168.12.10 TCP_MISS/200 1063 CONNECT avatars3.githubusercontent.com:443 - DIRECT/185.31.17.133 -
1416064611.722  13327 192.168.12.10 TCP_MISS/200 17113 CONNECT github.com:443 - DIRECT/192.30.252.128 -
1416064619.130  19005 192.168.12.10 TCP_MISS/200 141 CONNECT avatars3.githubusercontent.com:443 - DIRECT/185.31.17.133 -
1416064639.016  95397 192.168.12.10 TCP_MISS/200 1037 CONNECT talkgadget.google.com:443 - DIRECT/173.194.32.194 -
1416064643.210   4739 192.168.12.10 TCP_MISS/200 4085 CONNECT dgafology.com:443 - DIRECT/198.74.52.100 -
1416064662.010  64990 192.168.12.10 TCP_MISS/200 545 CONNECT mtalk.google.com:5228 - DIRECT/74.125.136.188 -
1416064665.219  65086 192.168.12.10 TCP_MISS/200 3851 CONNECT collector.githubapp.com:443 - DIRECT/54.236.179.219 -
1416064685.276   4003 192.168.12.10 TCP_MISS/200 3956 CONNECT qa.sockets.stackexchange.com:443 - DIRECT/198.252.206.25 -
1416064689.142   3750 192.168.12.10 TCP_MISS/200 357 CONNECT qa.sockets.stackexchange.com:443 - DIRECT/198.252.206.25 -
1416064709.014  78381 192.168.12.10 TCP_MISS/200 779 CONNECT clients6.google.com:443 - DIRECT/173.194.32.193 -
1416064721.010  63396 192.168.12.10 TCP_MISS/200 764 CONNECT talkgadget.google.com:443 - DIRECT/173.194.32.193 -
1416064725.013  63001 192.168.12.10 TCP_MISS/200 545 CONNECT mtalk.google.com:5228 - DIRECT/74.125.136.188 -

Alcune connessioni richiedono oltre 60000 millisecondi!

Ecco alcuni GET per il confronto

1416064691.281     68 192.168.12.10 TCP_MISS/200 412 GET http://serverfault.com/questions/ticks? - DIRECT/198.252.206.16 text/plain
1416064693.492     70 192.168.12.10 TCP_MISS/200 309 GET http://serverfault.com/search/titles? - DIRECT/198.252.206.16 application/json
1416064693.548    126 192.168.12.10 TCP_MISS/200 739 GET http://serverfault.com/content/img/progress-dots.gif - DIRECT/198.252.206.16 image/gif

Le prestazioni complessive dei calamari sono eccellenti! Ma per CONNECT è molto lento.

Ho scoperto che puoi usare echoe ncrichiedere un tunnel dalla riga di comando.

Ho effettuato due collegamenti schiena contro schiena usando questa tecnica

ericu@ericu-desktop:~$ echo -e -n 'CONNECT russiatoday.com:443\r\n\r\n' | nc 192.168.12.95 3127
HTTP/1.0 200 Connection established

ericu@ericu-desktop:~$ echo -e -n 'CONNECT russiatoday.com:443\r\n\r\n' | nc 192.168.12.95 3127
HTTP/1.0 200 Connection established

Nei registri,

1416065033.065   3079 192.168.12.10 TCP_MISS/200 0 CONNECT russiatoday.com:443 - DIRECT/62.213.85.4 -
1416065034.090    208 192.168.12.10 TCP_MISS/200 0 CONNECT russiatoday.com:443 - DIRECT/62.213.85.4 -

La prima connessione ha richiesto 3079 millisecondi, ma la seconda solo 208. Quindi, sembra che Squid non sia sempre lento.

Più tardi, ho fatto di nuovo la stessa cosa, ma utilizzato tcpdumpper acquisire il traffico dal squidserver.

1416070989.180    732 192.168.12.10 TCP_MISS/200 0 CONNECT russiatoday.com:443 - DIRECT/62.213.85.4 -

Come puoi vedere, la latenza segnalata è di 732 ms.

Ecco l'output della cattura tcpdump dei primi 3 pacchetti, SYNdalla mia scatola, SYN ACKdal telecomando e ACK dalla mia scatola. La mia comprensione è che questa è la stretta di mano a 3 vie necessaria per stabilire la connessione

11:03:08.973995 IP 192.168.12.95.34778 > 62.213.85.4.443: Flags [S], seq 1280719736, win 14600, options [mss 1460,sackOK,TS val 605181173 ecr 0,nop,wscale 7], length 0
11:03:09.180753 IP 62.213.85.4.443 > 192.168.12.95.34778: Flags [S.], seq 614920595, ack 1280719737, win 14480, options [mss 1460,sackOK,TS val 1284340103 ecr 605181173,nop,wscale 7], length 0
11:03:09.180781 IP 192.168.12.95.34778 > 62.213.85.4.443: Flags [.], ack 1, win 115, options [nop,nop,TS val 605181225 ecr 1284340103], length 0

Il tempo trascorso è di 206,8 ms in quello scambio. Quindi in questo esempio squidha 526 ms di latenza se la mia analisi è corretta. Una latenza extra di circa 500 ms è enorme.

Ma la mia analisi potrebbe essere imperfetta, penso perché il "tempo di risposta" per un CONNECTcalamaro misura solo il tempo totale di apertura del tunnel.

Ho modificato la mia logformatdirettiva per squidaggiungere il tempo di risoluzione DNS in millisecondi.

1416072432.918 580 776 192.168.12.10 TCP_MISS/200 0 CONNECT russiatoday.com:443 - DIRECT/62.213.85.4 -
1416072446.823 - 185 192.168.12.10 TCP_MISS/200 0 CONNECT russiatoday.com:443 - DIRECT/62.213.85.4 -

La seconda colonna è il tempo di ricerca DNS, la terza è "tempo di risposta" che potrebbe non significare molto per CONNECT. La colonna appare come -perché squidha una cache DNS interna. Ciò significa che squid ha utilizzato la sua cache DNS interna per la connessione successiva. Ciò spiega che la prima visualizzazione della pagina è lenta e le successive sono relativamente veloci. Questo spiega anche i ~ 500 ms di latenza in più. Sto usando bind9 in esecuzione su inoltro host locale per google DNS su ipv4. Come ottengo ~ 500 ms di latenza per una semplice ricerca DNS?

Esecuzione nslookuputilizzando direttamente 8.8.8.8 e bypassando il mio server locale:

ericu@katz:~$ time nslookup russiatoday.com 8.8.8.8
Server:     8.8.8.8
Address:    8.8.8.8#53

Non-authoritative answer:
Name:   russiatoday.com
Address: 62.213.85.4


real    0m0.056s
user    0m0.004s
sys 0m0.008s

Ciò mostra 56 ms di latenza per l'intera ricerca. Il ping di quel server ha una latenza di circa 50 ms, quindi questo ha senso.

Quindi qualcosa squide bind9non sei d'accordo?


Stai eseguendo qualche firewall tra il proxy e l'intervallo della rete pubblica o tra il desktop rig e il proxy?
Xavier Lucas,

Sì, sto usando un'altra macchina che utilizza iptablescome firewall NAT + per la mia connessione Internet.
Eric Urban,

Assicurati che le tue regole utilizzino gli stati di netfilter (NUOVO, STABILITO) per consentire il traffico e non solo coppie ip: port. Un po 'di tcpdump per vedere cosa sta impiegando del tempo sarebbe sicuramente di aiuto (per esempio controlla le richieste DNS).
Xavier Lucas,

come sarebbe diverso dal solo avere una regola iptables -A chain_name -j ACCEPT. Voglio dire certo, potrei aggiungerlo, ma non vedo perché sia ​​importante.
Eric Urban,

1
È sicuramente più veloce controllare lo stato di una connessione esistente piuttosto che testare un mucchio di regole per ogni pacchetto. Nella mia esperienza, ho visto drammatiche perdite di prestazioni senza tale impostazione. Il modo migliore per analizzare il problema: tcpdump.
Xavier Lucas,

Risposte:


12

So che è una vecchia domanda ma ho avuto lo stesso problema e ho risolto usando questo in squid.conf

dns_v4_first on

Saluti


Fantastico, grazie mille! Ho incolpato Chrome per tutto il tempo che ho avuto questo fastidioso problema. Avrei dovuto pensarci perché ho un problema con la rete IPv6 sul mio VM.
piit79,

Al punto! Grazie.
Marinos Un

1

Pubblicare questo come penso che sarà utile a chiunque esegua calamari con una scatola pfSense. Grazie a Juliano per la loro risposta! La stessa impostazione è disponibile in (nella casella pfSense) Servizi> Squid Proxy Server> Generale come Resolve DNS IPv4 First. Di seguito è riportato uno screenshot.

Impostazioni proxy di calamari pfSense


-1

Ho dovuto impostare "connect_timeout 2.0" perché stava provando prima la risoluzione dns ipv6 e poi passando a ipv4 dopo un timeout predefinito di 60 secondi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.