В связи с разгулом банхамера по интернет просторам участились советы по использованию различных прокси, vpn, tor и анонимайзеров для обхода блокировок сайтов. Эти все способы отправляют трафик третей стороне которая его может перехватывать и модифицировать. Это не наш метод. Мы сейчас просто и легко научим браузер дурить DPI.

Я вдохновился этой статьёй и сообразил относительно лёгкий способ ходить на заблокированные сайты прямо а не используя чужие прокси, дополнения и программы.

я осуществил необратимые манипуляции с доменным именем таким образом, чтобы не существовало ни одного достоверного и однозначного алгоритма обращения получившейся хеш-функции.


Исходные данные:
Заблокированный сайт(Адрес изменён): rutracker.og

Это один из сайтов на который РКН ограничил доступ.

Страница блокировки(Адрес изменён): 198.51.100.0...

Адрес страницы заглушки которая появляется при попытке открытия сайта. У каждого провайдера адрес страницы заглушки наверно разный.


Итак открываем блокнот и пишем первый скрипт:
function FindProxyForURL(url, host) {

  if (shExpMatch(url, "http://*") && shExpMatch(host, "rutracker.og")) {
    return "PROXY rutracker.og; DIRECT";
  }

  return "DIRECT";
}


Сохраняем как «proxy.pac»

Суть этого скрипта в том чтобы использовать как прокси сам сервер к которому мы и хотим получить доступ.

Подключаем «proxy.pac» в Chrome:
1. Настройки -> Показать дополнительные настройки ->
Сеть -> Изменить настройки прокси-сервера ->
Вкладка «Поключения» -> Настройка сети
2. Ставим галочку «Использовать сценарий автоматической настройки»
3. В поле адрес пишем полный путь к «proxy.pac»
Например: C:\Users\name\Documents\proxy.pac

Теперь страница блокировки будет появляется через раз.

Снова открываем блокнот и пишем:
// ==UserScript==
// @name BackUserJS
// @description Window History Back Script
// @author ivan386
// @license MIT
// @version 1.0
// @include http://198.51.100.0/*
// @run-at document_start
// @grant none
// ==/UserScript==

(function (window) { 
    var w;

    w = window;
    
    if (w.self != w.top) {
        return;
    }

    if (/http:\/\/198.51.100.0/.test(w.location.href)) {
		w.history.back()
    }
})(window);


Сохраняем как «back.user.js» в папку «back»

Этот скрипт возвращает нас на страницу где мы можем снова кликнуть заблокированную ссылку.

И опять открываем Блокнот и пишем:
{ 
    "manifest_version": 2,
    "content_scripts" : [
        {
            "js":[ "back.user.js" ], 
            "matches":[ "http://198.51.100.0/*" ], 
            "run_at":"document_start"  
        }
    ], 
    "description" : "Window History Back Script", 
    "name" : "BackUserJS",
    "version" : "1.0.0"
}


Сохраняем как «manifest.json» в папку «back»

Теперь добавим в Chrome как Расширение:
1. Дополнительные инструменты -> Расширения
2. Ставим галочку «Режим разработчика»
3. Нажимаем «Загрузить распакованное расширение...»
4. Находим папку «back» в которую сохраняли «back.user.js» и «manifest.json» и нажимаем ОК

Проверяем:
1. Перезагружаем Chrome
2. Нажимаем «Отмена» в окошке «Отключить расширения в режиме разработчика» справа.
3. Пишем в адресную строку адрес заблокированного сайта и нажимаем Enter.
4. ???
5. PROFIT

Использованные материалы:
Изучаем deep packet inspection у RETN
Proxy Auto Configuration (PAC)
Учимся писать userscript'ы
Userscripts. Упаковываем юзерскрипт для Chrome

Продолжение:
Обходим блокировку сайта фильтрующим прокси при помощи скрипта во имя Луны

Комментарии (53)


  1. d1Mm
    29.01.2016 10:30

    В ростелекоме убрали редирект на страницу-заглушку, теперь просто отдает страницу со статусом 451 (Unavailable For Legal Reasons) и данный способ не помогает это обойти.


    1. ivan386
      29.01.2016 10:47
      +1

      Видимо ваше отделение оперативней среагировало. Или у них алгоритмы блокировки по проще. У меня пока метод работает.


    1. ivan386
      29.01.2016 12:02
      +1

      Этот метод не работает против фильтрующего прокси. Изучаю вопрос.


    1. IRainman
      29.01.2016 15:09

      Ого, а покажите, пожалуйста скриншот, например, ибо у себя попробовал попасть на страницу блокировки, а там всё тоже самое. Прошу поскольку очень уж интересно посмотреть на страницу с 451 ошибкой в реальном рунете.


      1. d1Mm
        29.01.2016 17:20
        +1

        скриншот
        image


        1. IRainman
          30.01.2016 00:56

          Какой оригинальный ответ однако от блокировщика ибо приходит с block.ip.center.rt.ru похоже Ростелеком всё таки поставил полноценный DPI.


        1. ivan386
          30.01.2016 03:28

          В хедерах есть Location но переадресация не происходит. Это даже лучше. В данном случае можно просто обновлять страницу. Кстати нажмите «view source» в «Request Headers» и убедитесь что в GET полный адрес (http://...) а не только путь. Если только путь (GET /...) то proxy.pac не сработал.


    1. IRainman
      29.01.2016 15:38

      P.S. у меня просто вот такая «заглушка», как раз с кодом 451 по умолчанию выдаётся «моим пользователям»

      451.html


      <!DOCTYPE html><meta charset="utf-8"/><html><head><title>Государственная цензура</title></head><body><center><br><br><h2>Вас пытались перенаправить с заблокированного в РФ ресурса на страницу заглушку</h2><br><h3>Пожалуйста, сообщите, сами знаете кому, о том, что испытали проблемы с доступом, я всё исправлю.<br><br>В случае если меня в данный момент нет дома или же я сплю, пожалуйста, не беспокойте меня, вы можете самостоятельно восстановить доступ, воспользовавшись одним из способов описанным на станице <a href="http://rublacklist.net/bypass">«Восстановление доступа к информации»</a> на сайте организации Роскомсвобода или же на странице <a href="https://meduza.io/cards/kak-oboyti-blokirovki-saytov">«Как обойти блокировки сайтов?»</a> на сайте Медуза.</h3><img src="/image/lit_censorship.png"><center></body></html>
      


  1. navion
    29.01.2016 10:35

    А каков принцип работы?
    «Эшелонированную защиту» не пробивает, когда блокирует провайдер и его аплинк.


    1. ivan386
      29.01.2016 10:43

      DPI пакет не узнаёт и не высылает заглушку. Но работает метод через раз поэтому второй скрипт нужен.


  1. RicoX
    29.01.2016 12:23
    +2

    Сильно зависит от паранойи админов провайдера, встречал схему DPI + дополнительно все запросы на 53 порт редиректятся провайдером на свой сервер DNS, какой у себя DNS не укажи все равно будет обрабатывать провайдерский, тогда только VPN спасает до своего сервера.


    1. Nikon_NLG
      29.01.2016 12:41
      +5

      Кстати, я у себя только dns завернул в vpn, чтобы не весь трафик туда гонять. Дёшево и сердито.


      1. RicoX
        29.01.2016 12:48
        +1

        Аналогично, плюс таблица IP которые ходят исключительно через VPN, все что не в таблице идет через провайдера, оптимальное соотношение скорости работы и доступности сайтов.


    1. arabesc
      29.01.2016 18:15

      От перехвата DNS запросов может помочь DNSCrypt, он через 443 порт работает.


  1. MaximChistov
    29.01.2016 12:32
    -6

    www.torproject.org/projects/torbrowser.html — захожу через это на заблокированные сайты, полет нормальный.
    Не нашел только как тут включить меня как внутрисетевой узел в сеть, раньше это просто было, мб в курсе кто?


    1. IRainman
      29.01.2016 15:13

      У тора уж очень большие шансы нарваться на человека посередине, даже в топике об этом сказано и рассматривается пример с сайтом без https.


      1. MaximChistov
        29.01.2016 15:25
        +3

        ну если им заходить только на торрент-трекеры/луркоморье и прочие заблокированные, не вижу особо проблемы. он мне не для анонимности нужен


        1. IRainman
          29.01.2016 15:43

          Проблемы, в основном, из-за авторизации возникают, хотя подделки страниц без https тоже однозначно исключить нельзя.


  1. volk0ff
    29.01.2016 13:16

    Я дико извиняюсь, но в качестве альтернативной меры использование DNS серверов гугла прям в роутере не практичнее?
    Спасибо


    1. ivan386
      29.01.2016 13:32

      От DPI это не поможет. DNS прописаны и гугловские и яндексовские. Блок у меня идёт на уровне TCP пакетов. Каждый провайдер по своему решил проблему блокирования сайтов поэтому решение не универсально.


    1. mukizu
      29.01.2016 19:14

      Нет, у меня провайдер весь трафик переводит на себя, простое прописывание альтернативных DNS от этого не спасет, все равно будут его юзаться.


  1. skolk
    29.01.2016 14:03

    Фактически, вместо поля Host: имя сервера оказывается в самой строке GET.
    Интересно, какие веб-сервера совместимы с этим по умолчанию?


    1. ivan386
      30.01.2016 05:45

      Видимо все. Поскольку если сделать так:

      function FindProxyForURL(url, host) {
      
        if (shExpMatch(url, "http://*")) {
          return "PROXY "+host+"; DIRECT";
        }
      
        return "DIRECT";
      }
      


      Проблем не наблюдается. Проблема здесь может быть только с сайтами которые используют альтернативный порт для http вместо стандартного (80).


      1. skolk
        30.01.2016 10:32

        А если убрать "; DIRECT"? Порт можно, кстати, выпарсить…


        1. ivan386
          30.01.2016 17:40

          Тогда проблема с другим портом будет гарантированно. Так хоть если не соедениться с 80тым попробует напрямую.


  1. ValdikSS
    29.01.2016 16:16
    +3

    Есть и более практичные способы, которые, правда, требуют устройства под управлением Linux (роутер, например):
    Для ДОМ.ру и Интерзет
    Для Ростелекома способ 1 (тот, что ниже, от меня) и способ 2.

    Ну и на основе proxy.pac, но с прокси.


    1. ivan386
      29.01.2016 22:24

      Я также исследовал модификацию хедеров для прохода DPI как и в этой статье. Написал простенький тестер прохода на Lua. Пытался писать свой локальный прокси но он коряво работает. И собственно таки пришёл к идее как прокси использовать сам сервер.

      Второй способ вообще должен быть идеален для данного типа блокировки если есть iptables. Я о нём также думал смотря в WireShark. Но в windows iptables нет. Не знаю есть ли у меня доступ к этому на роутере.

      Я на кстати на основе этого proxy.pac (скачав и изменив) себе сделал свой для всех заблокированных сайтов.

      Если прикроют мой способ будем пробовать вариант с 3proxy если антивирус на него ругаться не будет.

      К сожалению все варианты с модификацией заголовка и отбрасыванием пакетов не работают при фильтрующем прокси. Если прокси не понимает заголовка то и сервер не поймет. Этот вопрос я поставил в очередь на исследование. Очень хочется как можно дольше не отдавать трафик в чужие руки.


  1. Krey
    29.01.2016 17:08

    Что только не придумают, лишь бы ipv6 не настраивать.


    1. ivan386
      29.01.2016 22:57

      Ну ipv6 на сервере недавно только подняли. И если использовать 6to4 гейт 192.88.99.1 то у него приоритет ниже ipv4. Это наверно можно исправить прописав в proxy.pac как прокси ipv6 адрес узла.


      1. ValdikSS
        29.01.2016 23:12

        6to4 не нужно использовать, он объявлен устаревшим в мае 2015.


        1. ivan386
          29.01.2016 23:21

          Надеюсь он всё ещё работает поскольку другого способа получения халявного ipv6 я не знаю.


          1. ValdikSS
            29.01.2016 23:23

            Его работоспособность зависит от anycast-сервера, ближайшего к вам. Обычно работает, да. Но и других способов хватает.


            1. ivan386
              29.01.2016 23:27

              А какие альтернативы?


              1. ValdikSS
                29.01.2016 23:44

                Туннельные брокеры (6in4, иначе говоря), AYIYA, умирающий Teredo (только не с серверами Microsoft).


        1. Krey
          30.01.2016 02:44

          Вы перепутали с teredo


          1. ValdikSS
            30.01.2016 02:46

            1. Krey
              30.01.2016 02:58

              Попробуйте тогда найти этому подтверждение. Я бегло погуглил и вику посмотрел и ничего не нашел. Про отмену тередо везде находится начиная с его rfc.


              1. ValdikSS
                30.01.2016 03:03

                Подтверждение чему? Я же привел ссылку на RFC.


                1. Krey
                  30.01.2016 03:06

                  Извиняюсь, на телефоне не заметил что это ссылка была. Сейчас ознакомлюсь.


            1. ivan386
              30.01.2016 03:37

              Расскажите пожалуйста вкратце почему они решили отказаться и какую альтернативу предложили.


              1. Krey
                30.01.2016 04:00

                Много ошибок, глубоко скрытых от пользователя, в результате которых пользователи отключали ipv6, считая его не надежным. В рамках этого rfc никакой альтернативы, кроме того что вернуться к изначальному rfc на 6to4 без этого эникастового релея, а в последствии подумать.
                Это то что я вычитал на своем битом английском, надо бы перечитать и перепроверить.


            1. Krey
              30.01.2016 03:54

              Строго говоря RFC 7526 объявляет устаревшим только позднюю присадку к 6to4 в виде эникаста 192.88.99.1 т.е вроде бы не сам 6to4. Хотя там много всего что отговаривает от его использования. В любом случае перед продолжением его использования надо будет внимательно перечитать этот rfc и пачку связанных. Спасибо за ссылку.
              Удивительно — ни одной статьи на хабре по теме.


    1. ivan386
      30.01.2016 02:17

      Включил 6to4 туннель на роутере. Задал ipv6 в proxy.pac дабы приоритет не играл роли.

      Chrome спокойно погнал трафик по ipv6.
      FireFox начал флудить коннектами на ipv4 адрес.

      Вернул в porxy.pac как было (домен).
      Прописал в hosts (Адреса изменены)
      2001:db8:: rutracker.og

      FireFox и Chrome пошли на сайт через ipv6 без проблем. Фильтрующий прокси трафик не порезал.


      1. Krey
        30.01.2016 02:51

        В винде приоритет (prefixpolicies) выставляется в netsh довольно удобно. У меня выставлен в приоритет разных видов ipv6 над ipv4 и только для кривых сайтов специально выставлен ipv4. Это сайты районной локалки, которые работали в ipv6 когда местный провайдер игрался с новым протоколом и перестали работать когда пров забыл что этот протокол у него есть.


    1. foxmuldercp
      01.02.2016 12:00

      Мне говорили, что некоторые ISP по IPv6 тоже блокируют ресурсы, так что только vpn и т.п, но мне без надобности запоминать местечковых ISP другой страны, так что без пруфов.


  1. Alexey2005
    29.01.2016 18:13

    Метод Chrome-only, в Firefox установка proxy.pac ничего не даёт, постоянно всплывает всё та же заглушка.


    1. ValdikSS
      29.01.2016 20:12

      Думаю, вводить нужно путь с URI, т.е. file://, а не просто путь. Честно говоря, не знал, что в Chrome можно без file:// вводить.


      1. Alexey2005
        29.01.2016 20:21

        Пробовал и так, всё равно не работает. А в Chrome без проблем.


        1. ValdikSS
          29.01.2016 20:22

          А если загрузить куда-то, или просто веб-сервер поднять, ссылка с http работает? Может, где-то синтаксическая или иная ошибка?


      1. ivan386
        29.01.2016 23:08

        Chrome в Windows использует настройки сети в IE и собственно их и открывает. Видимо IE понимает и такой путь а хром получает файл. FireFox в своих настройках автоматом меняет на file://


    1. ivan386
      29.01.2016 22:46

      У меня работает и в Firefox. Заглушка проскакивает иногда и в Chrome но второй скрипт её тут же её закрывает. Я специально не стал распыляться на все браузеры сосредоточившись на Chrome.

      В Firefox для второго скрипта нужно поставить GreaseMonkey и скормить ему «back.user.js». Либо поставить RequestPolicy который запретит переадресацию и можно будет просто нажать кнопку попробовать снова.

      Также посмотрите на заголовки в FireBug в исходном виде. Там должен быть полный адрес в GET. Если в GET только путь («GET /… HTTP/1.1») то proxy.pac не сработал.


      1. Alexey2005
        30.01.2016 00:25
        +1

        Получилось запустить. Если в Firefox выбрать пункт «использовать системные настройки прокси», а в системе прописать этот proxy.pac, он подхватывается. А напрямую, через предназначенное для него поле — ни в какую. Перепробовал разные варианты, даже слеш в обратную сторону разворачивал, всё равно не подхватывается.
        Ну ладно, главное работает…


  1. stas404
    30.01.2016 23:31

    Можно избавиться от первого этапа ручной установки pac-скрипта и применить настройки прокси из самого расширения, дав ему соответствующие права в manifest-файле:

     {
        ...
        "permissions": [
            "proxy"
        ],
    }
    

    Далее использовать объект «chrome.proxy» в режиме «pac_script» с указанием соответствующего «PacScript».
    Подробнее в документации:
    https://developer.chrome.com/extensions/proxy

    Спасибо за интересный материал.