Робимо свій friGate з анонімністю і без реклами

Введення

Всім хороші плагіни для обходу блокувань зразок популярного 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" \

engOne 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*.деб ../squid_*.deb


Отримання підписаного сертифіката за допомогою сервісу letsencrypt.org

Викачуємо скрипти:
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto --help

Оскільки у мене вже був налаштований віртуальний хост apache на потрібний домен — просте слідування інструкції зробило всю магію:
apachectl stop 
#Зупиняємо вже працює apache, т. к. наступна команда запустить свій
./letsencrypt-auto --кодів 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 <ваш_внешний_ір>/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/сторонніх розширень.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.