Как стать автором
Обновить

Комментарии 45

Тут я несколько иное описал — подробное изучение конкретного метода блокировки у конкретного провайдера (одного из крупнейших в РФ). И выводы о способах его обхода.
Стоило вам присмотреться к трафику, который приходит на интерфейс от Ростелекома. Вероятно, DPI подключен параллельно, а не последовательно, и туда приходит только клиентский трафик. Т.к. DPI стоит явно ближе, чем вебсайт, пакет с Location от DPI приходит быстрее, чем реальный первый пакет от сайта, а пакет от сайта уже отбрасывается ядром ОС как ретрансмиссия, поэтому, если вы используете Linux, достаточно одной строки в iptables, чтобы обойти блокировку:

iptables -A INPUT -p tcp --sport 80 -m string --algo bm --string "http://95.167.13.50/?st" -j DROP
Действительно, есть ретрансмиссия. Я смотрел трафик, но очевидно недостаточно внимательно.
Сначала приходит пакет, в котором только HTTP 302 и Location, затем приходит пакет с нормальным ответом сайта.
Однако система не отбрасывает второй пакет, а своеобразно объединяет с первым.
Т.е. приходят пакеты
1
HTTP/1.1 302 Found
Connection: close
Location: http://95.167.13.50/?st=0&dt=192.237.142.117&rs=grani.ru/

2
HTTP/1.1 200 OK
Server: nginx/1.2.1
Date: Sun, 01 Feb 2015 17:34:03 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive

6d7
<!DOCTYPE HTML>
...
А приложение видит это
так
HTTP/1.1 302 Found
Connection: close
Location: http://95.167.13.50/?st=0&dt=192.237.142.117&rs=grani.ru/

f-8
Transfer-Encoding: chunked
Connection: keep-alive

6d7
<!DOCTYPE HTML>
...

Это наблюдается и в Windows и в Linux.

Но приведенное вами правило действительно решает вопрос.
Добавлю в пост :)

Можно как-то повторить этот трюк на Mac OS и Windows 10?

НЛО прилетело и опубликовало эту надпись здесь
Интересно, а можно ли через плагины заставить Firefox или Chrome игнорировать вредоносные редиректы на адрес Ростелекома?
Там не просто нужно игнорировать редирект, а именно восстановить заголовок. В частности Content-Type часто затирается.

Если плагины имеют права на модификацию заголовков, то это возможно. В таком случае и прокси не понадобится.
уважаемый автор, подскажите пожалуйста, каким образом оператор заставит пользователей доверять своему сертификату для того, чтобы залезть в https
Никак. Когда они залазят в https, пользователи видят в браузерах сообщение о подмене сертификата.
Они несколько раз включали такой механизм для https-сайтов из реестра, потом отключали.
В Squid 3.2.x, например, есть SSLBump. На каждый домен (например, vk.com) динамически генерится сертификат, подписанный своим CA. Единственное условие — чтобы этот CA был установлен как доверенный в браузере пользователя (мой ответ неточный, но смысл в целом такой). Я пользовался этой штукой, чтобы фильтровать https-трафик и собирать статистику юзеров на одном предприятии.

Статья на тему: habrahabr.ru/post/168515/
Если какой-то CA начнет так делать, то сертификат этого CA будет отозван из списка доверенных.
Ростелеком, когда начинает лезть в https, подписывает все своим собственным сертификатом, выданным для *.rt.ru. Либо у РТ нет своего CA, либо они им не рискуют.
А как жестко забанить у себя все сертификаты *.rt.ru, даже те, которые еще не появились? Так, на всякий пожарный.
Для винды можно так попробовать — создать через makecert самоподписанный сертификат с CN=*.rt.ru и положить его в Untrusted certificates (certmgr.msc), хотя у меня есть сомнения в правильности этого способа.
НЛО прилетело и опубликовало эту надпись здесь
Спасибо за совет, сохранил их сертификат, добавил в «Untrusted certificates» — при открытии страницы https://rt.ru IE и Chrome ругаются на отозванный сертификат, а FF почему-то нет.
У FF своя база сертификатов, нужно добавлять в самом FF… Вот только как там добавить исключение именно для блокировки — не знаю…
Элементарно. Люди периодически видят предупреждения о самоподписанных сертификатах и дают разрешение на использование, особо не вчитываясь.
Для сайтов с HSTS и Chrome современных версий уже не прокатывает. Нельзя просто взять и дать разрешение (хотя всегда можно открыть в другом браузере).
В Хроме ссылка на сайт прячется в «Дополнительно».
А для сайтов с HSTS блокировки актуальны?
GET https://github.com/
...
Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
НЛО прилетело и опубликовало эту надпись здесь
Да, я писал
Отправка URL и Host разными пакетами.
Можно просто сначала вызвать send для первой строки запроса (HTTP-метод и URL), а затем обычным образом отправлять остальную часть запроса.
В iptables — одна строчка в таблице mangle
-A FORWARD -o eth1 -p tcp --tcp-flags SYN,RST SYN -m tcp --dport 80 -j TCPMSS --set-mss 10
По идее это не очень хорошо, ведь это приведет к тому, что весь обмен трафиком с сервером будет идти пакетами по 10 байт. Или я что-то упускаю?
Совершенно верно. «не очень хорошо» означает всего лишь увеличение служебного трафика. В случае IPv4 это 40 байт заголовков на каждый пакет. При современных каналах IMHO проблема невелика.
40 байт на каждые 10? Т.е., в пять раз?
Это очень плохо, это будет нереально тормозить интернет. Как крайний выход — устанавливать MSS, равный 10, только на заблокированные IP. Но вообще, по идее, в интернете нельзя использовать MSS меньше, чем 536 для IPv4 и 516 для IPv6.

Вообще, вот скрипт для OpenWRT и Ростелекома. Блокирует пакет от DPI на 80 порту, блокирует подмену сертификата для HTTPS.
github.com/proukornew/rt_iptables/blob/master/ipset.sh
О, спасибо, стащу к себе часть кода добавлялки дополнительных IP в фильтр (если они не резолвятся). Как будет возможность, потестирую на ростелекоме для Zyxel Keenetic с прошивкой первого поколения (там почти штатно сродни OpenWRT, но отличия есть)
С дом.ру/эртелекомом не сработает, ответ стабильный:

HTTP/1.1 302 Moved Temporarily
Cache-Control: no-cache,no-store,max-age=1
Pragma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Connection: close
Content-Length: 13
Location: http://lawfilter.ertelecom.ru

<html></html>

Реагирует только на GET, на регистр и пробелы пофиг.
Интересно было бы поэкспериментировать. Можете дать VPN на роутер? :)

Ну или попробуйте разные описанные варианты, в частности передачу заголовка Host в отдельном пакете.
У домру же вроде DNS-запросы подменяются (даже если использовать сторонний сервер или свой резолвер), если DNS-сервер подцеплять поверх шифрованного канала типа DNSCrypt или банального OpenVPN, то по идее будет работать
Уже не только DNS. :(
> а в этой версии протокола не было заголовка Host, поэтому со многими сайтами это работать не будет.
Не не было, а был не обязательным.

Иначе бы, например, proxy_pass в nginx никогда не работал бы — он очень долгое время работал по HTTP/1.0 =)
> # кэшируем dns
> nscache 65536

А за такое нужно бить тапком по пальцам.
Без кэширования DNS-запросов прокси будет дергать DNS на каждый запрос. Очевидно, это будет приводить к задержкам.
А в чем вообще проблема с кэшированием в данном случае? Это же собственный прокси для собственного серфинга. Без использования прокси тоже самое кэширование DNS делает сам браузер.
В DNS и так есть кеширование. И есть TTL, на который полагаются админы и вообще команды сервисов.
А на практике, из-за таких рекомендаций, как выше, ещё месяц-два после смены dns-записи трафик ломится на старый IP.
В описанном мной случае смысл кэшировать DNS определенно есть, равно как есть смысл кэшировать DNS в браузере.
Без кэширования DNS происходило бы следующее:
— пришел запрос на www.example.com/, дернули DNS, только после получения ответа DNS можем обрабатывать запрос
— пришел запрос на www.example.com/scripts.js, дернули DNS, только после получения ответа DNS можем обрабатывать запрос
— пришел запрос на www.example.com/style.css, дернули DNS, только после получения ответа DNS можем обрабатывать запрос
и т.д.
Очевидно, что даже при наличии локального DNS вносятся заметные задержки.
HTTP Keep-Alive конечно сгладил бы негативный эффект, но не отменил бы его.

Вообще в данном случае прокси, кэшируя DNS, делает тоже самое, что и браузер.
При работе через прокси браузер не посылает DNS запросы, это делает прокси.
Поэтому и кэшировать DNS тоже должен прокси.

Что касается TTL, то я уверен, что 3proxy (как и браузер) учитывает его в алгоритме кэширования.
> Вообще в данном случае прокси, кэшируя DNS, делает тоже самое, что и браузер.
Вот только браузеры TTL учитывают.

> Что касается TTL, то я уверен, что 3proxy (как и браузер) учитывает его в алгоритме кэширования.
Нет. В данном примере написано «любую dns-запись кешировать на 65536 секунд». Для примера, у меня TTL — 360 секунд на всех хостах.
На самом деле в данном примере написано «кэшировать DNS, размер кэша 65536 записей».
65536 это лишь размер кэша, но не время кэширования.
Хым. И правда.
Пардон тогда.
Для блокировки HTTPS трафика, многие DPI также смотрят на поле SNI, что позволяет блокировать не по IP, а по доменному имени. Фильтровать конкретный URI в пределах домена «увы» не получиться.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации