пятница, 30 октября 2015 г.

Squid на Windows: мобильная экономия

Вы сколько угодно можете выпендриваться, говоря, "У нас в Москве безлимит стоит 400 рублей в месяц и мне западло даже думать о кэшировании! И вообще, сквид умер и нафиг не нужен!", но это ровно до тех пор, как вам взбрендится воспользоваться LTE/3G/GPRS - не всем повезло жить в Нерезиновой. :) (Но даже и в этом случае - в кризис да и обычно выживают чаще жлобы, чем транжиры).

Не знаю и знать не хочу, как там у вас, в Монстрополисе в Нерезиновой, но повсюду в мире интернет дорогой. Особенно не пиринговый. Особенно мобильный - безлимитные тарифы есть в считанных странах (по пальчикам одной руки черепашки-мутанта).

В остальных странах так называемый безлимит - это курнадцать гигабайт на полной скорости, обычно только облизнуться, а потом - 64/128 кбит. Сосать тырмыз. Да.

Обычные пользователи лезут за бумажником, скорбно вздохнув и матюкнув жлобство ОТПСОСов, но интеллигентные люди чешут репу и припоминают Polipo или, вообще, кэширование всуе.

Мы, однако, не настолько мазохисты и вкрации вкратце, ёпто, вкратце! (Учите родной язык, мать вашу так за ногу, дышлом крещеную!) напишем РУКОВОДСТВО ДЛЯ ЖЛОБОВ.

Как сэкономить на трафике мобильного девайса - общие положения

В случае ноутбука, оснащенного свистком для мобилиздеца, у вас есть два основных пожирателя трафика. Это DNS (описано ранее, как его нужно кэшировать) и HTTP/HTTPS (вот тут вам всякие шибздики типа Polipo нифига не в помощь, HTTPS кэшировать - это вам не хрен сосать в сырую погоду).

Соответственно, у вас, красноглазого, две задачи:
  1. Закэшировать DNS (Unbound вам в помощь)
  2. Закэшировать HTTP/HTTPS
Расточители могут дальше не читать, дочеря и сыновья Рокфеллеров - тоже, а те, которые с красными глазками - добро пожаловать дальше.

В случае мобильного устройства (ноутбука) себя, любимого - кэширование антивирусных баз и обновлений Шиндошс не имеет смысла. Все остальное - по мере возможности по максимуму.

Как это сделать конкретно?

Обычные пользователи на этом месте валят смотреть "Звездные Войны". Дружно. Колонной по четыре. Идите дальше к остальным киборгам и платите 1,85. Боливару не снести двоих.

Красноглазым СЮДА.

Да. Сквид. Который - дабы он годился нам к употреблению - на Шиндошс x64 надо хитро настроить, чтобы: 

а) все летало
б) не улетало бабло
в) чтобы HTTPS тоже кэшить - ну, в большинстве случаев.

Предварительно устанавливаем и настраиваем DNS-кэш. И убеждаемся, что он у нас работает,

Особо продвинутые могут также снабдить свое мобильное устройство Torом и Privoxy, дабы вертеть на детородном органе всяческих запрещаторов и регуляторов - пшли бы они в трещину к ишаку. Видали мы их в гробу, в белых тапках. Мы сами решим, что нам вредно, а что полезно, без санитаров. :)

Вернемся, однако, к нашим баранАм.

Итак, мы тут упоминали HTTPS. Соответственно, понадобится корневой серт, которому мы будем верить.

Создадим его:

 # Создадим ключ, без шифрования и пароля  
 # Его, ежу понятно, надо оберегать  
 openssl genrsa -out rootCA.key 2048  
   
 # Подпишем его  
 openssl req -x509 -sha256 -new -nodes -config D:\OpenSSL-Win64\bin\openssl.cfg -key rootCA.key -days 10950 -out rootCA.crt  
   
 # Конвертируем в DER и установим на свою машину - везде, где он нужен  
 # Файлы ключа и сертификата отложим в сторону, для кэша  
 openssl x509 -in rootCA.crt -inform PEM -out rootCA.der -outform DER  
   

Установим Squid, который ранее скачали. Он будет установлен, добавлен в автоматический запуск сервисов, и запущен с умолчательной конфигурацией. Можно его сразу же остановить - это не то, что нам нужно:

 net stop squidsrv  

Положим сгенерированные сертификаты в директорию:


Не забудем сгенерировать DH-параметры:

 openssl dhparam -outform PEM -out dhparam.pem 2048  

и положим их туда же.

Теперь напишем в точности вот такой squid.conf и поместим в ту же директорию:
 # -------------------------------------  
 # ACL's  
 # -------------------------------------  
 acl localnet src 10.0.0.0/8     # RFC1918 possible internal network  
 acl localnet src 172.16.0.0/12     # RFC1918 possible internal network  
 acl localnet src 192.168.0.0/16     # RFC1918 possible internal network  
 #acl localnet src fc00::/7    # RFC 4193 local private network range  
 #acl localnet src fe80::/10   # RFC 4291 link-local (directly plugged) machines  
   
 acl SSL_ports port 443  
 acl SSL_ports port 8443  
 acl Safe_ports port 80          # http  
 acl Safe_ports port 21          # ftp  
 acl Safe_ports port 443          # https  
 acl Safe_ports port 70          # gopher  
 acl Safe_ports port 210          # wais  
 acl Safe_ports port 1025-65535     # unregistered ports  
 acl Safe_ports port 280          # http-mgmt  
 acl Safe_ports port 488          # gss-http  
 acl Safe_ports port 591          # filemaker  
 acl Safe_ports port 777          # multiling http  
 acl CONNECT method CONNECT  
   
 # No-cache ACLs  
 acl dont_cache dstdomain rulesofwargame.com imgur.com  
   
 # Privoxy+Tor acl  
 acl tor_url dstdom_regex "C:/Squid/etc/squid/url.tor"  
   
 # -------------------------------------  
 # Access parameters  
 # -------------------------------------  
 # Deny requests to unknown ports  
 http_access deny !Safe_ports  
   
 # Deny CONNECT to other than SSL ports  
 http_access deny CONNECT !SSL_ports  
   
 # Only allow cachemgr access from localhost  
 http_access allow localhost manager  
 http_access deny manager  
 http_access deny to_localhost  
   
 # Rule allowing access from your local networks.  
 # Adapt localnet in the ACL section to list your (internal) IP networks  
 # from where browsing should be allowed  
 http_access allow localnet  
 http_access allow localhost  
   
 # Cache directives  
 cache deny dont_cache  
   
 # Disable alternate protocols  
 reply_header_access Alternate-Protocol deny all  
 # Disable HSTS  
 reply_header_access Strict-Transport-Security deny all  
 reply_header_replace Strict-Transport-Security max-age=0; includeSubDomains  
 # Normalize Vary to reduce duplicates  
 reply_header_access Vary deny all  
 reply_header_replace Vary Accept-Encoding  
   
 # SSL bump rules  
 sslproxy_cert_error allow all  
 acl DiscoverSNIHost at_step SslBump1  
 ssl_bump peek DiscoverSNIHost  
 acl NoSSLIntercept ssl::server_name_regex -i "C:/Squid/etc/squid/url.nobump"  
 acl NoSSLIntercept ssl::server_name_regex -i "C:/Squid/etc/squid/url.tor"  
 ssl_bump splice NoSSLIntercept  
 ssl_bump bump all  
   
 # Privoxy+Tor access rules  
 never_direct allow tor_url  
   
 # And finally deny all other access to this proxy  
 http_access deny all  
   
 # -------------------------------------  
 # HTTP parameters  
 # -------------------------------------  
   
 # Local Privoxy is cache parent  
 cache_peer 127.0.0.1 parent 8118 0 no-query no-digest default  
   
 cache_peer_access 127.0.0.1 allow tor_url  
 cache_peer_access 127.0.0.1 deny all  
   
 # Don't cache 404 long time  
 negative_ttl 5 minutes  
   
 # -------------------------------------  
 # Cache parameters  
 # -------------------------------------  
 # Squid normally listens to port 3128  
 #       dhparams=     File containing DH parameters for temporary/ephemeral  
 #               DH key exchanges. See OpenSSL documentation for details  
 #               on how to create this file.  
 #               WARNING: EDH ciphers will be silently disabled if this  
 #                     option is not set.  
 http_port 3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid/rootCA.crt key=/etc/squid/rootCA.key options=NO_SSLv3 dhparams=/etc/squid/dhparam.pem  
 sslproxy_cafile /etc/ssl/certs/ca-bundle.trust.crt  
 sslproxy_options NO_SSLv3,SINGLE_DH_USE  
 sslproxy_cipher EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:HIGH:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS  
 sslcrtd_program /lib/squid/ssl_crtd -s /var/cache/squid_ssldb -M 4MB  
   
 # Turn off collect per-client statistics  
 client_db off  
   
 # Hide internal networks details outside  
 via off  
 forwarded_for delete  
   
 pipeline_prefetch 4  
 reload_into_ims on  
   
 # Do not show Squid version  
 httpd_suppress_version_string on  
   
 # Specify local DNS cache  
 dns_nameservers 127.0.0.1  
   
 visible_hostname cthulhu_jr  
   
 dns_v4_first on  
   
 # -------------------------------------  
 # Store parameters  
 # -------------------------------------  
 # Uncomment and adjust the following to add a disk cache directory  
 cache_dir ufs C:/squid/var/cache 8192 16 256  
   
 # -------------------------------------  
 # Memory parameters  
 # -------------------------------------  
 cache_mem 256 Mb  
 maximum_object_size_in_memory 2 Mb  
 maximum_object_size 4 Gb  
   
 # -------------------------------------  
 # Tuning parameters  
 # -------------------------------------  
 memory_replacement_policy heap GDSF  
 cache_replacement_policy heap LFUDA  
   
 # Default is 20  
 store_objects_per_bucket 128  
   
 # Shutdown delay before terminate connections  
 shutdown_lifetime 1 second  
   
 # -------------------------------------  
 # Process/log parameters  
 # -------------------------------------  
 # Access log  
 access_log daemon:C:/squid/var/logs/access.log squid  
   
 logfile_rotate 0  
   
 # Cache log  
 cache_log C:/squid/var/logs/cache.log  
   
 # Store log  
 cache_store_log none  
   
 # Leave coredumps in the first cache dir  
 coredump_dir /var/cache/squid  
   
 # Buffered logs. Default is off  
 buffered_logs on  
   
 strip_query_terms off  
   
 # -------------------------------------  
 # Content parameters  
 # -------------------------------------  
 quick_abort_min 100 KB  
 quick_abort_max 1 MB  
 quick_abort_pct 80  
   
 # Keep swf in cache  
 refresh_pattern -i \.swf$     10080     100%     43200     override-expire reload-into-ims ignore-private  
 # .NET cache  
 refresh_pattern -i \.((a|m)s(h|p)x?)$          10080     100%     43200     reload-into-ims ignore-private  
 # Other long-lived items  
 refresh_pattern -i \.(jp(e?g|e|2)|gif|png|tiff?|bmp|ico|svg|webp|flv|f4f|mp4|ttf|eot|woff)(\?.*)?$     14400     99%     518400      override-expire ignore-reload reload-into-ims ignore-private ignore-must-revalidate  
 refresh_pattern -i \.((cs|d?|m?|p?|r?|s?|w?|x?|z?)h?t?m?(l?)|(c|x|j)ss|js(t?|px)|php(3?|5?)|rss|atom|vr(t|ml))(\?.*)?$     10080     90%     86400     override-expire override-lastmod reload-into-ims ignore-private ignore-must-revalidate  
 # Default patterns  
 refresh_pattern -i (/cgi-bin/|\?)     0     0%     0  
 refresh_pattern     .     0     20%     10080     override-lastmod reload-into-ims ignore-private  
 ##  
 #nonhierarchical_direct off  
 #debug_options ALL,0 44,2 11,2  
 ##  

Файл url.tor:

 torproject.*  
 archive\.org.*  
 livejournal\.com.*  
 #wordpress\.com.*  
 #youtube.*  
 #ytimg.*  
 #googlevideo.*  
 #google.*  
 #googleapis.*  
 #googleusercontent.*  
 #gstatic.*  
 #gmodules.*  
 #blogger.*  
 #blogspot.*  
 #facebook.*  
 #fb.*  
   
и файл url.nobump:
 localhost  
 # ICQ  
 icq\.com  
 icq\.net  
 mrim\.mail\.ru  
 # Docs/Clouds  
 e\.mail\.ru  
 docs\.mail\.ru  
 cloud\.mail\.ru  
 drive\.google\.com  
 disk\.yandex\.ru  
 # Banking  
 # WU (Squid 3.5.x and above with SSL Bump)  
 # Only this three sites must be spliced.  
 fe1\.update\.microsoft\.com\.akadns\.net  
 fe2\.update\.microsoft\.com\.akadns\.net  
 fe2\.update\.microsoft\.com  
 # Mozilla services  
 services\.mozilla\.com  

и запустим наш Squid с новыми конфигурациями:
 net start squidsrv  

Осталась мелочь. Настроить нашу машину на использование прокси:


Если вы все сделали правильно, то в логах, разумеется, после прогрева кэша, будет примерно следующее:


а ваш провайдер недополучит примерно 30-40% (в среднем) денег за тот же самый объем трафика (по моей личной статистике - до 50-60%).

И если у вас установлен правильно настроенный Tor Bundle и Privoxy, то в access.log будут вот такие записи при обращении:

 1446552738.421  8015 127.0.0.1 TCP_TUNNEL/200 68644 CONNECT www.torproject.org:443 - FIRSTUP_PARENT/127.0.0.1 -  
 1446552738.647 10617 127.0.0.1 TCP_TUNNEL/200 136911 CONNECT www.torproject.org:443 - FIRSTUP_PARENT/127.0.0.1 -  
 1446552738.808  8401 127.0.0.1 TCP_TUNNEL/200 23501 CONNECT www.torproject.org:443 - FIRSTUP_PARENT/127.0.0.1 -  
 1446552738.969  8605 127.0.0.1 TCP_TUNNEL/200 30266 CONNECT www.torproject.org:443 - FIRSTUP_PARENT/127.0.0.1 -  
 1446552739.131  8687 127.0.0.1 TCP_TUNNEL/200 2796 CONNECT www.torproject.org:443 - FIRSTUP_PARENT/127.0.0.1 -  
 1446552740.910  8015 127.0.0.1 TCP_TUNNEL/200 7841 CONNECT www.torproject.org:443 - FIRSTUP_PARENT/127.0.0.1 -  
   

И - да, вы имеете полноценный HTTPS-прокси с бампом, который должен показывать для всех сайтов (кроме списка url.nobump) примерно следующее:


Да, в качестве корневого сертификата должен быть корневой сертификат вашего прокси, который вы ранее сгенерировали и установили. Сечете, о чем я? 

PS. Продвинутым красноглазым хочу напомнить - кэш не только экономит ваши деньги, но и защищает. Если вы удосужились настроить ваш локальный кэш DNS с DNSSEC. получаете для него данные через DNSCrypt, и ваш локальный кэширующий прокси снабжен Tor - то вы весьма нешуточно усиливаете вашу защиту от всяких нехороших парней.

PPS. А теперь приняли таблетки и марш в палату! Параноики живут дольше - мы бережем себе подобных! :)