Pull to refresh

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

Reading time4 min
Views43K
Введение

Всем хороши плагины для обхода блокировок вроде популярного 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/сторонних расширений.
Tags:
Hubs:
+17
Comments11

Articles

Change theme settings