zhovner / zaborona_help

Бесплатный сервис для обхода блокировок сайтов в Украине — https://zaborona.help
301 stars 99 forks source link

Разблокировка по подмене DNS с использованием связки dnsmasq + sniproxy + haproxy #136

Open jokedroid opened 5 years ago

jokedroid commented 5 years ago

Доброго времени суток! Хочу поделиться концепцией по организации разблокировки ресурсов путём подмены DNS c использованием dnsmasq + sniproxy + haproxy. Принцип работы такой:

  1. Dnsmasq производит подмену IP заблокированного ресурса на свой;
  2. Sniproxy перехватывает SNI запрос и прозрачно переадресует на "правильный" сайт, прописанный в его конфиге.
  3. Haproxy организует правильный backend от ресурса (может нам будет и не нужен sniproxy, а хватит только haproxy ). Как результат - на пользовательской стороне нужно только поменять адрес DNS на роутере или усторойстве и ВСЁ! Никаких перепрошивок роутеров, анонса кучи маршрутов, удобное добавление новых сайтов на серверной стороне. Недостатки: много трафика DNS, хотя можно сделать "комбинированный" вариант с использованием ikev2. Это уже работает! По похожему принципу работает сервис http://portaller.com/ по разблокировке региональных ограничений медиаресурсов. Вот https://github.com/alardus/portaller

    P.S. Предлагаю организовать тестирование концепции.

CrazyJack1975 commented 5 years ago

Доброго времени суток! Попробую.

сб, 2 февр. 2019 г. в 22:47, jokedroid notifications@github.com:

Доброго времени суток! Хочу поделиться концепцией по организации разблокировки ресурсов путём подмены DNS c использованием dnsmasq + sniproxy + haproxy. Принцип работы такой:

  1. Dnsmasq производит подмену IP заблокированного ресурса на свой;
  2. Sniproxy перехватывает SNI запрос и прозрачно переадресует на "правильный" сайт, прописанный в его конфиге.
  3. Haproxy организует правильный backend от ресурса (может нам будет и не нужен sniproxy, а хватит только haproxy ). Как результат - на пользовательской стороне нужно только поменять адрес DNS на роутере или усторойстве и ВСЁ! Никаких перепрошивок роутеров, анонса кучи маршрутов, удобное добавление новых сайтов на серверной стороне. Недостатки: много трафика DNS, хотя можно сделать "комбинированный" вариант с использованием ikev2. Это уже работает! По похожему принципу работает сервис http://portaller.com/ по разблокировке региональных ограничений медиаресурсов. Вот https://github.com/alardus/portaller

P.S. Предлагаю организовать тестирование концепции.

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/zhovner/zaborona_help/issues/136, or mute the thread https://github.com/notifications/unsubscribe-auth/AMsXYSbe0RFyDCs6t2ReDVxTZEHRHX21ks5vJflIgaJpZM4afx8I .

spawnlmg commented 5 years ago

Есть исходники этой концепции, или какие нибудь наработки? Контакты для связи

jokedroid commented 5 years ago

Доброго времени суток! Выкладываю то, что есть.

  1. Сначала нужно установить sniproxy, собрав его из исходников. https://www.vultr.com/docs/setup-sni-proxy-on-debian-7-x64
  2. Устанавливаем dnsmasq apt-get install dnsmasq
  3. Следующий шаг - подмена DNS искомого узла через dnsmasq (файл /etc/dnsmasq.conf)
    address=/pandora.com/10.142.0.2
    address=/vk.com/10.142.0.2
  4. Необходимо указать слушаемый dnsmasq внешний интерфейс, желательно и локальный
    listen-address=10.142.0.2
    listen-address=127.0.0.1
  5. Далее в файле /etc/sniproxy.conf прописываем ВСЕ проксируемые адреса. Повторюсь, ВСЕ возможные поддомены сайта, иначе будет частичная работоспособность. В примере они даже для vk не прописаны.
    
    user daemon
    pidfile /var/tmp/sniproxy.pid

listener 10.142.0.2 80 { proto http bad_requests log

access_log { filename /var/log/sniproxy.log priority debug } }

listener 10.142.0.2 443 { proto tls bad_requests log

access_log { filename /var/log/sniproxy.log priority debug } }

table {

Pandora

pandora\.com *

tuner.pandora.com *

Ukraine blocked

vk\.com *
yandex\.ru *
yandex\.ua *
mail\.ru *
kinopoisk\.ru *
mamba\.ru *
nashe\.ru *
lutik\.tv *
webmoney\.ru *
kaspersky\.com *
5-tv\.ru *
vgtrk\.com *
1tv\.ru *
ntv\.ru *
ren\.tv *
drweb\.ru *
mk\.ru *
ria\.ru *
ok\.ru *

Misc

ip2location\.com ip2location\.com

}

5. Откуда взять ВСЕ поддомены? Когда я пытался настроить систему, то у меня они отсутствовали. Недавно нашел в сети pac для zaborona.help, откуда их можно взять.

function FindProxyForURL(url, host) { var proxyserver = 'SOCKS socks.zaborona.help:1488; DIRECT'; var domains = ["webvisor.org","yadi.sk","yandex.com","yastatic.net","mc.yandex.ru","webvisor.com","yandex.de","yaani.ru","yandex-amp.net","yandex","avto.ru","autoru.tv","yandex.com.am","yandex.kg","yandex.lt","yandex.lv","yandex.md","yandex.tj","yandex.tm","yandex.ee","yandex.co.il","yandex-launcher.com","yandexdatafactory.ru","cloud.yandex","std-cpp.ru","stdcpp.ru","yandexlauncher.com","yandex.com.ge","adfox.net","yandexlyceum.ru","yavideoad.ru","yandex.uz","ecir2013.org","clickhouse.yandex","clickhouse.tech","yastat.net","loginza.ru","mail.yandex","yandextrafik.com.tr","yandex.travel","auto.ru","yandex.jobs","iframe-toloka.com","nic.yandex","travel.yandex","www.yandex","driver.yandex","ydf-conference.com","autoi.ru","adfox.ru","yandex-school.ru","shad.yandex","yandexdatafactory.com","yandexdataschool.com","yandexdataschool.ru","rostaxi.org","metabar.ru","nota-claim.ru","notaclaim.ru","pricelabs.ru","preview-adfox.ru","z5h64q92x9.net","yandex.aero","bem.info","yadisk.cc","comparesearches.com","yate.ch","ya.cc","clck.ly","clck.ru","yandex-ad.cn","yandexadexchange.net","ruscorpora.ru","multiship.ru","yamoney.ru","mk-test.ru","mk-beta.ru","moikrug.ru","mk-stress.ru","mk-dev.ru","mk-prod.ru","yandex.com.ua","yandex.com.ru","yaprobki.ru","yandex.mobi","yandex.az","xn--d1acpjx3f.xn--p1ai","yndx.net","yandex.com.tr","yandex.kz","yandex.kg","yandex.co.il","yandex.com.ge","yandex.ee","yandex.com.am","yandex.az","yandex.by","allods.com","allods.ru","allodsteam.ru","appsmail.ru","attachmail.ru","attachmy.com","beep.car","beepcar.ru","beepcarstatic.ru","bk.ru","clouder.pics","datacloudmail.ru","dclub.ru","deliveryclub.ru","distribmail.ru","dwar.ru","fie.org","giftomaster.com","giftomatic.org","gmru.net","ic2ster.com","icqapi.com","icq.com","icqmail.com","icq.net","inbox.ru","iseeku.com","iseekyou.com","jugger.ru","list.ru","mailapps.me","mail.ua","maps.me","mediator.media","my.com","oh-uh.net","o.life","owamail.ru","parapa.ru","pifagor.io","pokespy.info","polkrf.ru","russianaicup.ru","russiancodecup.ru","russiancryptocup.com","russiancryptocup.ru","russiandesigncup.ru","russiandevcup.ru","russianmlcup.ru","seosan.io","skyforge.com","skyforge.ru","smaper.com","staticmy.com","tarantool.io","tarantool.org","terrabank.ru","terrhq.ru","territory.ru","timezero.ru","warface.com","warface.tv","xn--80abviyi.xn--p1ai","youla.io","youla.ru","vkuservideo.com","vkuservideo.net","vk.com","vk-cdn.net","vk-cdn.me","userapi.com","vkontakte.ru",".vk.com","apivk.com","vk.cc","vk.me","odnoklassniki.com.ua","odnoklassniki.ru","mycdn.me","odnoklassniki.ua","ok.ru","mradx.net","ok.me","portal.mail.ru","ad.mail.ru","imgsmail.ru","mail.ru","ya.ru","2ch.hk","kinopoisk.ru","drweb.com","kaspersky.ua",".kaspersky.","yandex.st","yastatic.net","yandex.ru","yadi.sk","yandex.fr","yandex.lt","yandex.lv","yandex.md","yandex.tj","yandex.tm","yandex.com.tr","yandex.uz","donationalerts.ru","yandex.net","yandex.com","livejournal.ru","rutube.ru",".yandex.","narod.ru","yandex.cloud","cldmail.ru","cdnmail.ru","myadx.net","yandex.ua","yastatic.net","vkuserlive.com","delivery-club.ru","scorecardresearch.com","tns-counter.ru","passport.yandex.ru"]; for(var i = 0;i<domains.length;i++) { if(shExpMatch(host, ''+domains[i]+'')) return proxyserver; } return "DIRECT"; }


6. Примечание. Для подмены DNS можно использовать более профессиональный, чем dnsmasq, сервер. Получив результат концепцию можно оформить в виде VPN ikev2 без анонса маршрутов. 
toxi22 commented 3 years ago

Вместо адресов 10.142.0.0, можно использовать, к примеру 172.16.0.0/12 или 192.168.0.0/16 ? Потому что у меня провайдер использует локалку с адресацией 10.0.0.0/8 и 100.64.0.0/10. Пробовал подобное реализовать для Tor-сервера и получается, что внутренняя сеть Tor отдает адреса сайтов из 10.0.0.0/8 сети, что соответственно у меня не работает, так как запросы улетают к провайдеру в сетку, а не возвращаются в сеть Tor