Всем хороши плагины для обхода блокировок вроде популярного friGate, но есть у них один минус — любят встраивать свою рекламу и в перспективе следить за всем, что вы делаете в интернете.
VPN имеет свои недостатки: либо весь трафик будет ходить через удаленный сервер, либо нужно будет настраивать сложные правила роутинга.
Ssh-туннель на постоянно засыпающем и просыпающемся ноутбуке приходится каждый раз перезапускать.
Есть решения вроде autossh, но настоящего перфекциониста они не удовлетворят.
Попробуем добиться удобства, аналогичного friGate с использованием сервисов, находящихся полностью под нашим контролем.
Нам понадобятся: выделенный сервер с Linux/FreeBSD (я использовал Ubuntu), домен, letsencrypt, squid и немного магии PAC-файлов.
Домен можно взять бесплатный 3-го уровня от вашего хостера или тут: freedomain.co.nr, registry.cu.cc.
Squid поддерживает шифрованое соединение с браузером — именно то, что нужно для такого случая.
Эта возможность почему-то практически неизвестна широкой публике, поэтому появился этот пост.
Установка 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"
--- 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)
MAXHO
29.03.2016 15:12+1Как ни странно — "Спасибо за материал"
Почему странно — потому что в целом ничего нового.
Почему спасибо — никогда так не настраивал, надо попробовать
roller
29.03.2016 15:57Зачем такие сложности? 5-долларовый digitalocean и…
https://hub.docker.com/r/kylemanna/openvpn/
ProRunner
29.03.2016 16:05+2Рекламу во friGate, к слову, можно отключить.
Anisotropic
29.03.2016 18:35А чтобы сайт добавить в список нужно с бубном сплясать
ProRunner
29.03.2016 20:43+2Там неочивидно, но можно (Параметры — Мой_список в название списка — Добавить — Нажимаем на Мой_список и на открывшейся странице добавляем, что нужно). Ещё отключить всплывающую панель по умолчанию нужно в настройках оповещения, которая очень мешается.
К слову, недавно узнал о расширении и теперь с удовольствием пользуюсь. Проксируются только нужные сайты, на скорость остальных никак не влияет.
kvaps
30.03.2016 10:46Есть давняя мечта собрать docker-образ с преднастроенным squid, privoxy, tor и i2p.
Чтобы иметь доступ к закрытым сайтам и сайтам в сетях .onion и .i2p (в ущерб приватности, понятное дело)
Плюс ко всему хочу что бы тот генерил proxy.pac скрипт и обновлял списоков запрещенных сайтов с https://antizapret.info/
То есть эдакий аналог https://antizapret.prostovpn.org/ но с поддержкой i2p и tor.
Но времени все никак нету.
Может кто-нибудь в курсе и знает, делал ли кто что-то подобное?lopatoid
30.03.2016 16:33Ну как раз автор этого https://antizapret.prostovpn.org/ и написал инструкцию, как сделать прокси с поддержкой i2p и tor:
https://habrahabr.ru/post/122835/
ofedotov
30.03.2016 15:08«Т.к. у меня уже был настроен виртуальный хост apache на нужный домен — простое следование инструкции сделало всю магию»
Добавьте, пожалуйста, информацию для тех у кого еще не настроен виртуальный хост apache на нужный домен и у кого магия не работает.
Obramko
Поставил винд^W squid — напиши на Хабр.