Расскажу как я решал вопрос с блокировкой https на роутере.
Расскажу как я решал вопрос с блокировкой https на роутере.
На тех провайдерах, что мне доступны, все, кроме одного либо банили https по IP (вообще нет конекта), либо захватывали TLS сессию и она намертво зависала - пакеты больше не приходили. На домру удалось выяснить, что DPI цепляется к SNI (Server Name Indication) в TLS, но сплит TLS запроса не помог. Я пришел к выводу, что https самым разумным будет прозрачно заворачивать в socks.
На тех провайдерах, что мне доступны, все, кроме одного либо банили https по IP (вообще нет конекта), либо захватывали TLS сессию и она намертво зависала - пакеты больше не приходили. На домру удалось выяснить, что DPI цепляется к SNI (Server Name Indication) в TLS, но сплит TLS запроса не помог. Я пришел к выводу, что https самым разумным будет прозрачно заворачивать в socks.
Tor поддерживает "из коробки" режим transparent proxy. Это можно использовать в теории, но практически - только на роутерах с 128 мб памяти и выше. Таких роутеров не так много. В основном объем памяти 32 или 64 мб. И тор еще и тормозной.
Tor поддерживает "из коробки" режим transparent proxy. Это можно использовать в теории, но практически - только на роутерах с 128 мб памяти и выше. Таких роутеров не так много. В основном объем памяти 32 или 64 мб. И тор еще и тормозной.
Другой вариант напрашивается, если у вас есть доступ к какой-нибудь unix системе с SSH, где сайты не блокируются. Например, у вас есть VPS вне России. Именно так и поступил.
Другой вариант напрашивается, если у вас есть доступ к какой-нибудь unix системе с SSH, где сайты не блокируются. Например, у вас есть VPS вне России. Именно так и поступил.
Понятийно требуются следующие шаги :
Понятийно требуются следующие шаги :
1) Выделять IP, на которые надо проксировать трафик. У нас уже имеется ipset "zapret", технология создания которого отработана.
1) Выделять IP, на которые надо проксировать трафик. У нас уже имеется ipset "zapret", технология создания которого отработана.
2) Сделать так, чтобы все время при загрузке системы на некотором порту возникал socks.
2) Сделать так, чтобы все время при загрузке системы на некотором порту возникал socks.
3) Установить transparent соксификатор. Redsocks прекрасно подошел на эту роль.
3) Установить transparent соксификатор. Redsocks прекрасно подошел на эту роль.
4) Завернуть через iptables трафик с порта назначения 443 и на ip адреса из ipset 'zapret' на соксификатор
4) Завернуть через iptables трафик с порта назначения 443 и на ip адреса из ipset 'zapret' на соксификатор
Буду рассматривать систему на базе openwrt dedicated driver, где уже установлена система обхода dpi "zapret".
Буду рассматривать систему на базе openwrt dedicated driver, где уже установлена система обхода dpi "zapret".
По крайней мере нужно иметь заполненный ipset 'zapret', устанавливать tpws или nfqws не обязательно.
По крайней мере нужно иметь заполненный ipset 'zapret', устанавливать tpws или nfqws не обязательно.
Более того, если они на вашей системе не срабатывают, то можно соксифицировать не только https, но и http.
Более того, если они на вашей системе не срабатывают, то можно соксифицировать не только https, но и http.
* Сделать так, чтобы все время при загрузке системы на некотором порту возникал socks
* Сделать так, чтобы все время при загрузке системы на некотором порту возникал socks
Т.к. дефолтный dropbear клиент не поддерживает создание socks, то для начала придется заменить dropbear ssh client на openssh : пакеты openssh-client и openssh-client-utils.
Т.к. дефолтный dropbear клиент не поддерживает создание socks, то для начала придется заменить dropbear ssh client на openssh : пакеты openssh-client и openssh-client-utils.
Устанавливать их нужно с опцией opkg --force-overwrite, поскольку они перепишут ssh клиент от dropbear.
Устанавливать их нужно с опцией opkg --force-overwrite, поскольку они перепишут ssh клиент от dropbear.
После установки пакетов расслабим неоправданно жестокие права : chmod 755 /etc/ssh.
После установки пакетов расслабим неоправданно жестокие права : chmod 755 /etc/ssh.
Следует создать пользователя, под которым будем крутить ssh client. Допустим, это будет 'proxy'.
Следует создать пользователя, под которым будем крутить ssh client. Допустим, это будет 'proxy'.
Сначала установить пакет shadow-useradd.
Сначала установить пакет shadow-useradd.
Код:
Код:
useradd -d /home/proxy proxy
useradd -d /home/proxy proxy
mkdir -p /home/proxy
mkdir -p /home/proxy
chown proxy:proxy /home/proxy
chown proxy:proxy /home/proxy
Openssh ловит разные глюки, если у него нет доступа к /dev/tty.
Openssh ловит разные глюки, если у него нет доступа к /dev/tty.
Добавим в /etc/rc.local строчку : "chmod 666 /dev/tty"
Добавим в /etc/rc.local строчку : "chmod 666 /dev/tty"
Сгенерируем для него ключ RSA для доступа к ssh серверу.
Сгенерируем для него ключ RSA для доступа к ssh серверу.
Код:
Код:
su proxy
su proxy
cd
cd
mkdir -m 700 .ssh
mkdir -m 700 .ssh
@ -33,16 +33,16 @@ cd .ssh
ssh-keygen
ssh-keygen
ls
ls
exit
exit
Должны получиться файлы id_rsa и id_rsa.pub.
Должны получиться файлы id_rsa и id_rsa.pub.
Строчку из id_rsa.pub следует добавить на ssh сервер в файл $HOME/.ssh/authorized_keys.
Строчку из id_rsa.pub следует добавить на ssh сервер в файл $HOME/.ssh/authorized_keys.
Более подробно о доступе к ssh через авторизацию по ключам : http://vds-admin.ru/ssh/ssh-autentifikatsiya-po-klyucham-ispolzovanie-programm-ss...ygen-i-ssh-agent
Более подробно о доступе к ssh через авторизацию по ключам : http://vds-admin.ru/ssh/ssh-autentifikatsiya-po-klyucham-ispolzovanie-programm-ss...ygen-i-ssh-agent
Предположим, ваш ssh сервер - vps.mydomain.com, пользователь называется 'proxy'.
Предположим, ваш ssh сервер - vps.mydomain.com, пользователь называется 'proxy'.
Проверить подключение можно так : ssh -N -D 1098 -l proxy vps.mydomain.com.
Проверить подключение можно так : ssh -N -D 1098 -l proxy vps.mydomain.com.
Сделайте это под пользователем "proxy", поскольку при первом подключении ssh спросит о правильности hostkey.
Сделайте это под пользователем "proxy", поскольку при первом подключении ssh спросит о правильности hostkey.
Соединение может отвалиться в любой момент, поэтому нужно зациклить запуск ssh.
Соединение может отвалиться в любой момент, поэтому нужно зациклить запуск ssh.
Для этого лучший вариант - использовать procd - упрощенная замена systemd на openwrt версий BB и выше.
Для этого лучший вариант - использовать procd - упрощенная замена systemd на openwrt версий BB и выше.
/etc/init.d/socks_vps :
/etc/init.d/socks_vps :
Код:
Код:
#!/bin/sh /etc/rc.common
#!/bin/sh /etc/rc.common
# Copyright (C) 2006-2011 OpenWrt.org
# Copyright (C) 2006-2011 OpenWrt.org
START=50
START=50
@ -57,28 +57,35 @@ start_service() {
procd_set_param command $COMMAND
procd_set_param command $COMMAND
procd_close_instance
procd_close_instance
}
}
Этому файлу нужно дать права : chmod +x /etc/init.d/socks_vps
Этому файлу нужно дать права : chmod +x /etc/init.d/socks_vps
Установить пакет redsocks. Redsocks есть готовый для CC 15.05.1 и DD, для более старых версий openwrt его можно взять c http://downloads.openwrt.org, либо воспользоваться прекомпилированным статическим бинариком из комплекта "zapret".
Установить пакет redsocks. Redsocks есть готовый для CC 15.05.1 и DD, для более старых версий openwrt его можно взять c http://downloads.openwrt.org, либо воспользоваться прекомпилированным статическим бинариком из комплекта "zapret".
Если вы берете ipk с downloads.openwrt.org, то имейте в виду переход с uclibc в CC на musl в DD. Динамические бинарики между ними несовместимы.
Если вы берете ipk с downloads.openwrt.org, то имейте в виду переход с uclibc в CC на musl в DD. Динамические бинарики между ними несовместимы.
/etc/redsocks.conf :
/etc/redsocks.conf :
скрытый текст
........
После чего перезапускаем : /etc/init.d/redsocks restart
local_ip = 127.0.0.1;
Смотрим появился ли листенер : netstat -tnlp | grep 1099
local_port = 1099;
Автостарт redsocks при таком конфиге не работает, потому что на момент запуска сеть не инициализирована, и у нас даже нет 127.0.0.1.
........
Вместо штатного автостарта будем вешаться на события поднятия интерфейса. Разберем это позже.
ip = 127.0.0.1;
Пока что отключим автостарт : /etc/init.d/redsocks disable
port = 1098;
type = socks5;
........
После чего перезапускаем : /etc/init.d/redsocks restart
Смотрим появился ли листенер : netstat -tnlp | grep 1099
Автостарт redsocks при таком конфиге не работает, потому что на момент запуска сеть не инициализирована, и у нас даже нет 127.0.0.1.
Вместо штатного автостарта будем вешаться на события поднятия интерфейса. Разберем это позже.
Пока что отключим автостарт : /etc/init.d/redsocks disable
Внести параметр "reload" а /etc/config/firewall в указанное место :
Внести параметр "reload" а /etc/config/firewall в указанное место :
Код:
Код:
config include
config include
option path '/etc/firewall.user'
option path '/etc/firewall.user'
option reload '1'
option reload '1'
Перезапуск : /etc/init.d/firewall restart
Перезапуск : /etc/init.d/firewall restart
Все, теперь можно проверять :
Все, теперь можно проверять :
/etc/init.d/redsocks stop
/etc/init.d/redsocks stop
curl https://btc-e.com
curl https://btc-e.com
# должно обломаться с надписью "Connection refused". если не обламывается - значит ip адрес btc-e.com не в ipset,
# должно обломаться с надписью "Connection refused". если не обламывается - значит ip адрес btc-e.com не в ipset,
# либо не сработали правила фаервола. например, из-за не установленных модулей ipt
# либо не сработали правила фаервола. например, из-за не установленных модулей ipt
/etc/init.d/redsocks start
/etc/init.d/redsocks start
curl https://btc-e.com
curl https://btc-e.com
# должно выдать страницу
# должно выдать страницу
* Автозапуск redsocks
* Автозапуск redsocks
Я сделал для себя небольшой скриптик, вешающийся на события поднятия и опускания интерфейсов.
Я сделал для себя небольшой скриптик, вешающийся на события поднятия и опускания интерфейсов.
/etc/hotplug.d/iface/99-exec-on-updown
/etc/hotplug.d/iface/99-exec-on-updown
Код:
Код:
#!/bin/sh
#!/bin/sh
local cmd
local cmd
if [ "$ACTION" = ifup ]; then
if [ "$ACTION" = ifup ]; then
@ -120,36 +127,36 @@ if [ "$ACTION" = ifdown ]; then
cmd=$(uci get network.$INTERFACE.exec_on_down)
cmd=$(uci get network.$INTERFACE.exec_on_down)
[ -n "$cmd" ] && $cmd
[ -n "$cmd" ] && $cmd
fi
fi
Теперь можно в описания интерфейсов в /etc/config/nework внести в соответствующий раздел :
Теперь можно в описания интерфейсов в /etc/config/nework внести в соответствующий раздел :
Код:
Код:
config interface 'wan'
config interface 'wan'
........
........
option exec_on_up '/etc/init.d/redsocks start'
option exec_on_up '/etc/init.d/redsocks start'
Теперь reboot. Заходим снова, смотрим, что есть redsocks, есть ssh, опять проверяем curl https://btc-e.com.
Теперь reboot. Заходим снова, смотрим, что есть redsocks, есть ssh, опять проверяем curl https://btc-e.com.
Пробуем зайти на https://btc-e.com с компа внутри локалки.
Пробуем зайти на https://btc-e.com с компа внутри локалки.
* Если у вас нет своего сервера
* Если у вас нет своего сервера
Если у вас нет своего сервера, да и просто для упрощения настройки, можно использовать proxy от antizapret.prostovpn.org.
Если у вас нет своего сервера, да и просто для упрощения настройки, можно использовать proxy от antizapret.prostovpn.org.
Посмотрите на http://antizapret.prostovpn.org/proxy.pac. Вы увидите список доменов, по которому броузер выносит решение : идти напрямую или использовать proxy. Proxy указано как "proxy.antizapret.prostovpn.org:3128".
Посмотрите на http://antizapret.prostovpn.org/proxy.pac. Вы увидите список доменов, по которому броузер выносит решение : идти напрямую или использовать proxy. Proxy указано как "proxy.antizapret.prostovpn.org:3128".
Этот прокси работает только на IP назначения из списка https://github.com/zapret-info/z-i/raw/master/dump.csv, на остальные возвращает ошибку, чтобы его не использовали для других целей. Поддерживается метод CONNECT, а значит можно его использовать для проксирования https.
Этот прокси работает только на IP назначения из списка https://github.com/zapret-info/z-i/raw/master/dump.csv, на остальные возвращает ошибку, чтобы его не использовали для других целей. Поддерживается метод CONNECT, а значит можно его использовать для проксирования https.
В последней версии "zapret" я добавил скрипт "ipset/get_antizapret.sh". Он парсит список ip от "antizapret" и заносит в ipset "zapret". Это гарантирует, что вызов прокси будет по тем адресам, которые разрешены для проксирования.
В последней версии "zapret" я добавил скрипт "ipset/get_antizapret.sh". Он парсит список ip от "antizapret" и заносит в ipset "zapret". Это гарантирует, что вызов прокси будет по тем адресам, которые разрешены для проксирования.
* Как изменится вышеописанная процедура
* Как изменится вышеописанная процедура
Убираем все, что связано с ssh. Это нам не потребуется.
Убираем все, что связано с ssh. Это нам не потребуется.
В /etc/redsocks.conf меняем :
В /etc/redsocks.conf меняем :
Код:
Код:
ip = 127.0.0.1;
ip = 127.0.0.1;
port = 1098;
port = 1098;
type = socks5;
type = socks5;
на :
на :
Код:
Код:
ip = proxy.antizapret.prostovpn.org;
ip = proxy.antizapret.prostovpn.org;
port = 3128;
port = 3128;
type = http-connect;
type = http-connect;
В отличие от SSH, TLS хэндшейк теперь пойдет в открытую, то есть DPI его могут высечь из proxy протокола и проверить поле SNI (Server Name Indication).
В отличие от SSH, TLS хэндшейк теперь пойдет в открытую, то есть DPI его могут высечь из proxy протокола и проверить поле SNI (Server Name Indication).
Так же могут поступить чуть проще : анализировать IP назначения в методе "CONNECT".
Так же могут поступить чуть проще : анализировать IP назначения в методе "CONNECT".
Однако, практически это вряд ли будут делать. Если и будут, то немногие.
Однако, практически это вряд ли будут делать. Если и будут, то немногие.
Но если вы вдруг захотите таким способом проксировать http, то здесь вероятность перехвата и облома очень высока. Многие DPI прекрасно ловят proxy запросы.
Но если вы вдруг захотите таким способом проксировать http, то здесь вероятность перехвата и облома очень высока. Многие DPI прекрасно ловят proxy запросы.
Сначала проверьте работает ли у вас antizapret в предложенном ими варианте : http://antizapret.prostovpn.org
Сначала проверьте работает ли у вас antizapret в предложенном ими варианте : http://antizapret.prostovpn.org