https.txt redsocks.conf fix

This commit is contained in:
bolvan 2016-12-22 17:20:28 +03:00
parent 2c30f8e4c2
commit 03eb41f463

163
https.txt
View File

@ -1,31 +1,31 @@
Расскажу как я решал вопрос с блокировкой 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
Запуск : /etc/init.d/socks_vps start Запуск : /etc/init.d/socks_vps start
Останов : /etc/init.d/socks_vps stop Останов : /etc/init.d/socks_vps stop
Включить автозагрузку : /etc/init.d/socks_vps enable Включить автозагрузку : /etc/init.d/socks_vps enable
Проверка : curl --socks5 127.0.0.1:1098 https://btc-e.com Проверка : curl --socks5 127.0.0.1:1098 https://btc-e.com
* Организовать прозрачную соксификацию * Организовать прозрачную соксификацию
Установить пакет 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
* Завертывание соединений через iptables * Завертывание соединений через iptables
/etc/firewall.user /etc/firewall.user
Код: Код:
SOXIFIER_PORT=1099 SOXIFIER_PORT=1099
. /lib/functions/network.sh . /lib/functions/network.sh
network_find_wan wan_iface network_find_wan wan_iface
@ -90,26 +97,26 @@ done
sysctl -w net.ipv4.conf.br-lan.route_localnet=1 sysctl -w net.ipv4.conf.br-lan.route_localnet=1
iptables -t nat -C prerouting_lan_rule -p tcp --dport 443 -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$SOXIFIER_PORT || iptables -t nat -C prerouting_lan_rule -p tcp --dport 443 -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$SOXIFIER_PORT ||
iptables -t nat -I prerouting_lan_rule -p tcp --dport 443 -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$SOXIFIER_PORT iptables -t nat -I prerouting_lan_rule -p tcp --dport 443 -m set --match-set zapret dst -j DNAT --to 127.0.0.1:$SOXIFIER_PORT
Внести параметр "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