Введение

Всем хороши плагины для обхода блокировок вроде популярного friGate, но есть у них один минус — любят встраивать свою рекламу и в перспективе следить за всем, что вы делаете в интернете.

VPN имеет свои недостатки: либо весь трафик будет ходить через удаленный сервер, либо нужно будет настраивать сложные правила роутинга.

Ssh-туннель на постоянно засыпающем и просыпающемся ноутбуке приходится каждый раз перезапускать.
Есть решения вроде autossh, но настоящего перфекциониста они не удовлетворят.

Попробуем добиться удобства, аналогичного friGate с использованием сервисов, находящихся полностью под нашим контролем.
Нам понадобятся: выделенный сервер с Linux/FreeBSD (я использовал Ubuntu), домен, letsencrypt, squid и немного магии PAC-файлов.

Домен можно взять бесплатный 3-го уровня от вашего хостера или тут: freedomain.co.nr, registry.cu.cc.

Squid поддерживает шифрованое соединение с браузером — именно то, что нужно для такого случая.
Эта возможность почему-то практически неизвестна широкой публике, поэтому появился этот пост.

image


Установка Squid с поддержкой SSL

В Ubuntu squid собран без поддержки нужных нам ключей (--enable-ssl)
Если у вас другой дистрибутив и с этим всё хорошо (проверить можно запуском команды squid3 -v | grep -E --color "(ssl|tls)" ) — сразу переходите к следующему пункту.
А мы соберем для Ubuntu свой собственный пакет (использована эта инструкция):
sudo apt-get install devscripts build-essential fakeroot libssl-dev
apt-get source squid3
sudo apt-get build-dep squid3


применяем следующие патчи:
--- squid3-3.3.8/debian/rules	2013-11-15 11:49:59.052362467 +0100
+++ squid3-3.3.8/debian/rules.new	2013-11-15 11:49:35.412362836 +0100
@@ -19,6 +19,8 @@
 DEB_CONFIGURE_EXTRA_FLAGS := --datadir=/usr/share/squid3  		--sysconfdir=/etc/squid3  		--mandir=/usr/share/man +		--enable-ssl +		--enable-ssl-crtd  		--enable-inline  		--enable-async-io=8  		--enable-storeio="ufs,aufs,diskd,rock" 

eng
One file in source code of Squid Proxy needs to be adjusted too (src/ssl/gadgets.cc). This change is needed to prevent Firefox error sec_error_inadequate_key_usage that usually occurs when doing HTTPS filtering with latest Firefox browsers. If you use only Google Chrome, Microsoft Internet Explorer or Apple Safari this step is not required.

--- squid3-3.3.8/src/ssl/gadgets.cc	2013-07-13 09:25:14.000000000 -0400
+++ squid3-3.3.8/src/ssl/gadgets.cc.new	2013-11-26 03:25:25.461794704 -0500
@@ -257,7 +257,7 @@
 mimicExtensions(Ssl::X509_Pointer & cert, Ssl::X509_Pointer const & mimicCert)
 {
     static int extensions[]= {
-        NID_key_usage,
+        //NID_key_usage,
         NID_ext_key_usage,
         NID_basic_constraints,
         0

Собираем и устанавливаем:
cd squid3-3.3.8 && dpkg-buildpackage -rfakeroot -b
sudo apt-get install squid-langpack 
sudo dpkg -i ../squid-common*.deb ../squid_*.deb


Обретение подписанного сертификата с помощью сервиса letsencrypt.org

Скачиваем скрипты:
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto --help

Если у вас уже запущен вебсервер — останавливаем его, т.к. скрипт letsencrypt запустит свой.
В случае сурового продакшна можно верифицировать контроль над доменом без остановки вебсервера, смотрите документацию.
Получаем сертификат:
./letsencrypt-auto --authenticator standalone --installer apache -d <наш_домен.ру>


В случае успеха pem-файлы можно будет найти в каталоге /etc/letsencrypt/live/<наш домен>/

Настройка Squid

Конфиг — дефолтный, добавляем только опцию https_port
https_port 3129 cert=/etc/letsencrypt/live/example.com/fullchain.pem key=/etc/letsencrypt/live/example.com/privkey.pem

По желанию — acl для доступа только с определенных ip или по паролю.
Например
acl mynet src <ваш_внешний_ip>/32
http_access allow mynet

Запускаем squid
sudo /etc/init.d/squid3 start


Учим браузер шифрованным соединениям с прокси

Как указано в документации Squid, настроить https-соединение с прокси-сервером в Firefox и Chrome с недавних пор можно, но только с использованием PAC-файла.
The Chrome browser is able to connect to proxies over SSL connections if configured to use one in a PAC file or command line switch. GUI configuration appears not to be possible (yet).

The Firefox 33.0 browser is able to connect to proxies over SSL connections if configured to use one in a PAC file. GUI configuration appears not to be possible (yet).

PAC (Proxy Auto Configuration) — это файл, содержащий javascript, исполняемый браузером с целью определить прокси для каждого запроса.
Я использовал следующий код:
// encrypted_squid.pac
var hosts = 'myip.ru internet.yandex.ru';
var blocked = hosts.split(' ');

function FindProxyForURL(url, host) {
    var shost = host.split('.').reverse();
    shost = shost[1] + '.' + shost[0];
    for(var i = 0; i < blocked.length; i++)
    {
        if( shost == blocked[i] ) return "HTTPS <ваш_прокси_FQDN>:3129";
    }
    return "DIRECT";
}

Адреса в списке hosts взяты для теста, разбавьте их нужными вам ;)

Подключаем файл в соответствующем поле настроек браузера ( Preferences -> Advanced -> Network -> Settings ), проверяем как теперь выглядит наш внешний адрес на myip.ru, наслаждаемся стабильной работой.
При этом трафик ходит напрямую на все хосты, кроме указанных в строке hosts.
Этот pac-файл можно положить на веб-сервер, подключать через http и изменения в нём будут автоматически подтягиваться на всех хостах, например, на ноутбуке, десктопе и даже смартфоне.

Также можно использовать foxyproxy для фильтрации хостов, которые должны работать через прокси в сочетании с более простым PAC-файлом — тогда можно будет править этот список прямо в браузере.

Заключение

Топик написан по горячим следам исключительно с целью продемонстрировать концепцию шифрованного туннеля в браузере без использования VPN/ssh/сторонних расширений.

Комментарии (11)


  1. Obramko
    29.03.2016 12:16
    -4

    Поставил винд^W squid — напиши на Хабр.


  1. MAXHO
    29.03.2016 15:12
    +1

    Как ни странно — "Спасибо за материал"
    Почему странно — потому что в целом ничего нового.
    Почему спасибо — никогда так не настраивал, надо попробовать


  1. roller
    29.03.2016 15:57

    Зачем такие сложности? 5-долларовый digitalocean и…
    https://hub.docker.com/r/kylemanna/openvpn/


  1. ProRunner
    29.03.2016 16:05
    +2

    Рекламу во friGate, к слову, можно отключить.


    1. Anisotropic
      29.03.2016 18:35

      А чтобы сайт добавить в список нужно с бубном сплясать


      1. ProRunner
        29.03.2016 20:43
        +2

        Там неочивидно, но можно (Параметры — Мой_список в название списка — Добавить — Нажимаем на Мой_список и на открывшейся странице добавляем, что нужно). Ещё отключить всплывающую панель по умолчанию нужно в настройках оповещения, которая очень мешается.
        К слову, недавно узнал о расширении и теперь с удовольствием пользуюсь. Проксируются только нужные сайты, на скорость остальных никак не влияет.


        1. Loveworthy
          30.03.2016 22:02

          Это только для chrome такое работает, а в firefox как раз танцы с бубном.


  1. kvaps
    30.03.2016 10:46

    Есть давняя мечта собрать docker-образ с преднастроенным squid, privoxy, tor и i2p.
    Чтобы иметь доступ к закрытым сайтам и сайтам в сетях .onion и .i2p (в ущерб приватности, понятное дело)
    Плюс ко всему хочу что бы тот генерил proxy.pac скрипт и обновлял списоков запрещенных сайтов с https://antizapret.info/

    То есть эдакий аналог https://antizapret.prostovpn.org/ но с поддержкой i2p и tor.
    Но времени все никак нету.

    Может кто-нибудь в курсе и знает, делал ли кто что-то подобное?


    1. lopatoid
      30.03.2016 16:33

      Ну как раз автор этого https://antizapret.prostovpn.org/ и написал инструкцию, как сделать прокси с поддержкой i2p и tor:
      https://habrahabr.ru/post/122835/


  1. ofedotov
    30.03.2016 15:08

    «Т.к. у меня уже был настроен виртуальный хост apache на нужный домен — простое следование инструкции сделало всю магию»
    Добавьте, пожалуйста, информацию для тех у кого еще не настроен виртуальный хост apache на нужный домен и у кого магия не работает.


  1. e11it
    30.03.2016 15:10

    А где же часть про «без рекламы»...?