Делаем свой friGate с анонимностью и без рекламы

в 8:39, , рубрики: linux, proxy, squid, squid3, Ubuntu, блокировки сайтов, информационная безопасность, Роскомнадзор

Введение

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

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

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

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

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

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

apachectl stop 
#Останавливаем уже работающий apache, т.к. следующая команда запустит свой
./letsencrypt-auto --authenticator standalone --installer apache

В результате получаем ключ и сертификат в каталоге /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/сторонних расширений.

Автор: flyaway

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js