Комментарии 45
Многое уже было описано до вас:
Определитель типа блокировки сайтов у провайдера habrahabr.ru/post/228305/
Статистика применяемых средств блокирования сайтов habrahabr.ru/post/229377/
tl;dr -> github.com/ValdikSS/blockcheck
Определитель типа блокировки сайтов у провайдера habrahabr.ru/post/228305/
Статистика применяемых средств блокирования сайтов habrahabr.ru/post/229377/
tl;dr -> github.com/ValdikSS/blockcheck
Тут я несколько иное описал — подробное изучение конкретного метода блокировки у конкретного провайдера (одного из крупнейших в РФ). И выводы о способах его обхода.
Стоило вам присмотреться к трафику, который приходит на интерфейс от Ростелекома. Вероятно, 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, затем приходит пакет с нормальным ответом сайта.
Однако система не отбрасывает второй пакет, а своеобразно объединяет с первым.
Т.е. приходят пакеты
Это наблюдается и в Windows и в Linux.
Но приведенное вами правило действительно решает вопрос.
Добавлю в пост :)
Сначала приходит пакет, в котором только 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?
НЛО прилетело и опубликовало эту надпись здесь
Для macOS: github.com/dzhidzhoev/AntiRTDPI
Интересно, а можно ли через плагины заставить Firefox или Chrome игнорировать вредоносные редиректы на адрес Ростелекома?
уважаемый автор, подскажите пожалуйста, каким образом оператор заставит пользователей доверять своему сертификату для того, чтобы залезть в https
Никак. Когда они залазят в https, пользователи видят в браузерах сообщение о подмене сертификата.
Они несколько раз включали такой механизм для https-сайтов из реестра, потом отключали.
Они несколько раз включали такой механизм для https-сайтов из реестра, потом отключали.
В Squid 3.2.x, например, есть SSLBump. На каждый домен (например, vk.com) динамически генерится сертификат, подписанный своим CA. Единственное условие — чтобы этот CA был установлен как доверенный в браузере пользователя (мой ответ неточный, но смысл в целом такой). Я пользовался этой штукой, чтобы фильтровать https-трафик и собирать статистику юзеров на одном предприятии.
Статья на тему: habrahabr.ru/post/168515/
Статья на тему: habrahabr.ru/post/168515/
Если какой-то CA начнет так делать, то сертификат этого CA будет отозван из списка доверенных.
Ростелеком, когда начинает лезть в https, подписывает все своим собственным сертификатом, выданным для *.rt.ru. Либо у РТ нет своего CA, либо они им не рискуют.
Ростелеком, когда начинает лезть в https, подписывает все своим собственным сертификатом, выданным для *.rt.ru. Либо у РТ нет своего CA, либо они им не рискуют.
А как жестко забанить у себя все сертификаты *.rt.ru, даже те, которые еще не появились? Так, на всякий пожарный.
НЛО прилетело и опубликовало эту надпись здесь
Спасибо за совет, сохранил их сертификат, добавил в «Untrusted certificates» — при открытии страницы https://rt.ru IE и Chrome ругаются на отозванный сертификат, а FF почему-то нет.
Элементарно. Люди периодически видят предупреждения о самоподписанных сертификатах и дают разрешение на использование, особо не вчитываясь.
Для сайтов с HSTS и Chrome современных версий уже не прокатывает. Нельзя просто взять и дать разрешение (хотя всегда можно открыть в другом браузере).
В Хроме ссылка на сайт прячется в «Дополнительно».
Для обычных сайтов — да, но для сайтов с HSTS там ссылки нет. blogs.msdn.com/cfs-filesystemfile.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-47-13-metablogapi/8446.chrome37_5F00_404325B2.png
НЛО прилетело и опубликовало эту надпись здесь
Да, я писал
Отправка 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
-A FORWARD -o eth1 -p tcp --tcp-flags SYN,RST SYN -m tcp --dport 80 -j TCPMSS --set-mss 10
По идее это не очень хорошо, ведь это приведет к тому, что весь обмен трафиком с сервером будет идти пакетами по 10 байт. Или я что-то упускаю?
Это очень плохо, это будет нереально тормозить интернет. Как крайний выход — устанавливать MSS, равный 10, только на заблокированные IP. Но вообще, по идее, в интернете нельзя использовать MSS меньше, чем 536 для IPv4 и 516 для IPv6.
Вообще, вот скрипт для OpenWRT и Ростелекома. Блокирует пакет от DPI на 80 порту, блокирует подмену сертификата для HTTPS.
github.com/proukornew/rt_iptables/blob/master/ipset.sh
Вообще, вот скрипт для OpenWRT и Ростелекома. Блокирует пакет от DPI на 80 порту, блокирует подмену сертификата для HTTPS.
github.com/proukornew/rt_iptables/blob/master/ipset.sh
С дом.ру/эртелекомом не сработает, ответ стабильный:
Реагирует только на GET, на регистр и пробелы пофиг.
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 в отдельном пакете.
Ну или попробуйте разные описанные варианты, в частности передачу заголовка Host в отдельном пакете.
У домру же вроде DNS-запросы подменяются (даже если использовать сторонний сервер или свой резолвер), если DNS-сервер подцеплять поверх шифрованного канала типа DNSCrypt или банального OpenVPN, то по идее будет работать
> а в этой версии протокола не было заголовка Host, поэтому со многими сайтами это работать не будет.
Не не было, а был не обязательным.
Иначе бы, например, proxy_pass в nginx никогда не работал бы — он очень долгое время работал по HTTP/1.0 =)
Не не было, а был не обязательным.
Иначе бы, например, proxy_pass в nginx никогда не работал бы — он очень долгое время работал по HTTP/1.0 =)
> # кэшируем dns
> nscache 65536
А за такое нужно бить тапком по пальцам.
> nscache 65536
А за такое нужно бить тапком по пальцам.
Без кэширования DNS-запросов прокси будет дергать DNS на каждый запрос. Очевидно, это будет приводить к задержкам.
А в чем вообще проблема с кэшированием в данном случае? Это же собственный прокси для собственного серфинга. Без использования прокси тоже самое кэширование DNS делает сам браузер.
А в чем вообще проблема с кэшированием в данном случае? Это же собственный прокси для собственного серфинга. Без использования прокси тоже самое кэширование DNS делает сам браузер.
В DNS и так есть кеширование. И есть TTL, на который полагаются админы и вообще команды сервисов.
А на практике, из-за таких рекомендаций, как выше, ещё месяц-два после смены dns-записи трафик ломится на старый IP.
А на практике, из-за таких рекомендаций, как выше, ещё месяц-два после смены 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 происходило бы следующее:
— пришел запрос на 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 секунд на всех хостах.
Вот только браузеры TTL учитывают.
> Что касается TTL, то я уверен, что 3proxy (как и браузер) учитывает его в алгоритме кэширования.
Нет. В данном примере написано «любую dns-запись кешировать на 65536 секунд». Для примера, у меня TTL — 360 секунд на всех хостах.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Исследование механизма блокировки сайтов «Ростелекомом» и способы ее обхода