Безграничный DNS: различия между версиями

Материал из ALT Linux Wiki
 
(не показано 118 промежуточных версий 2 участников)
Строка 1: Строка 1:
[[Файл:DNS-ban.jpg|мини|Приказ провайдерам]][[Файл:DNS-measures.jpg|мини|Уточнения к приказу]]
[[Файл:DNS-ban.jpg|мини|Приказ провайдерам]][[Файл:DNS-measures.jpg|мини|Уточнения к приказу]]
=Преамбула=
=''Преамбула'': '''без чего никак'''=
Ввиду государственных/корпоративных поползновений на остатки свободы ходить взрослым людям по просторам интернетов куда заблагорассудится, встаёт вопрос, каким образом от оных препон хоть «на минималках» отгородиться.
Ввиду государственных/корпоративных поползновений на остатки свободы ходить взрослым людям по просторам интернетов куда заблагорассудится, встаёт вопрос, каким образом от оных препон хоть «на минималках» отгородиться.


Что ж, попробуем. Решаться будет две задачи:
Что ж, попробуем. Решаться будет две задачи:
==Резолвинг==
==Резолвинг==
#<strong>dnscrypt-proxy</strong> запрашивает соответствие между человеческими и айпическими адресами у серверов, умеющих шифроваться, дабы вышесидящие над нами органы не могли манипулировать процессом.
<strong>dnscrypt-proxy</strong><ref name="Sisyphus"/> запрашивает соответствие между человеческими и айпическими адресами у серверов, умеющих шифроваться, дабы вышесидящие над нами органы не могли манипулировать процессом.
#<strong>tor</strong> производит то же самое в отношении незарегистрированной зоны <code>.onion</code>.
 
#<strong>dnsmasq/unbound</strong> кэшируют все эти запросы ради быстрого резолвинга для всех устройств в обслуживаемой сети.
<strong>tor</strong> производит то же самое в отношении незарегистрированной зоны <code>.onion</code>.
 
<strong>dnsmasq/unbound</strong> кэшируют все эти запросы ради быстрого резолвинга для всех устройств в обслуживаемой сети.


==Проксирование==
==Проксирование==
<strong>tor</strong> пропускает через себя запросы:
<strong>tor</strong> ''(двустаночник, чесслово!)'' — пропускает через себя запросы к:
#К .онион-сайтам (чего мимо тора попросту и не выйдет).
#онион-сайтам (чего мимо него и не выйдет);
#К запретным ресурсам в соответствии с…
#запретным ресурсам в соответствии с…
#:*персональным списком из браузерного плагина (<strong>FoxyProxy</strong>, <strong>SwitchyOmega</strong> и т.п. &mdash; см. [[Задний_ход_в_DarkWeb|заметку про настройки для отдельного компа]]) и/или
#:*персональным списком из браузерного плагина (<strong>FoxyProxy</strong>, <strong>SwitchyOmega</strong> и т.п. &mdash; см. [[Задний_ход_в_DarkWeb|заметку]] про настройки для персонального компа) и/или
#:*скриптом автопрокси, размещённым на внутрисетевом веб-сервере.
#:*скриптом автопрокси, размещённым на внутрисетевом веб-сервере.
<strong>obfs4</strong><ref name="Sisyphus"/> — «запутывающий» (obfuscating) прокси, добавка к <strong>tor</strong>'у.
<strong>lighttpd</strong> ''(не обязательный компонент)'' — лёгкий и простой в настройке веб-сервер  для раздачи в локалку вышеупомянутого скрипта автоопределения прокси.


=Амбула: реализация=
=''Амбула'': '''реализация'''=
Понадобятся уже упомянутые пакеты:
Понадобится установить пакеты:
<ul>
<ul>
<li><strong>tor</strong> — для преобразования «луковых» имён в IP'ы;</li>
<li><strong>tor</strong> — для подключения к сети «луковых» маршрутизаторов и преобразования «луковых» имён в IP'ы;</li>
<li><strong>torsocks</strong> — для пропуска хостов локальной сети в «луковую»;</li>
<li><strong>obfs4</strong> — для обхода РКНовских блокировок <strong>tor</strong>'а по «мостикам»;</li>
<li><strong>dnscrypt-proxy</strong> — то же самое, но для плебса: без препонов, чинимых хоть вышестоящим провайдером, хоть надзорными органами;</li>
<li><strong>dnscrypt-proxy</strong> — то же самое, но для плебса: без препонов, чинимых хоть вышестоящим провайдером, хоть надзорными органами;</li>
<li><strong>dnsmasq</strong> (на уровне организации/квартиры) или <strong>unbound</strong> (в масштабе провайдера) — для кэширования запросов к обоим вышеозначенным «шифрующимся» (эрго, довольно неспешным) резолверам.</li>
<li><strong>dnsmasq</strong> (на уровне организации/квартиры) или</li>
<li><strong>unbound</strong> (в масштабе провайдера) — для кэширования запросов к обоим вышеозначенным «шифрующимся» (эрго, довольно неспешным) резолверам.</li>
<li><strong>lighttpd</strong> (см. ниже) — для ориентирования узлов сети, к каким ресурсам черезо что ходить.</li>
</ul>
</ul>
Например (зависит от используемого дистрибутива), так:
{{cmd|# apt-get update && apt-get install -y dnscrypt-proxy dnsmasq lighttpd obfs4 tor torsocks unbound}}
==The Onion Router («луковый» маршрутизатор)==
==The Onion Router («луковый» маршрутизатор)==
{{Примечание|Здесь и далее &mdash; адреса/порты выбирайте уместные для своих реалий.}}
{{Примечание|Здесь и далее &mdash; адреса/порты выбирайте уместные для своих реалий.}}
Строка 30: Строка 42:
AutomapHostsOnResolve 1              # …адрес из которой прикреплять к IPv6-адресу каждого онион-сайта.
AutomapHostsOnResolve 1              # …адрес из которой прикреплять к IPv6-адресу каждого онион-сайта.
DNSPort              853            # Порт на петлевом интерфейсе для резолвинга .onion-имён…
DNSPort              853            # Порт на петлевом интерфейсе для резолвинга .onion-имён…
TransPort            9040           # …а этот — для перенаправления в тор-сеть запросов к таким сайтам.
TransPort            9050           # …а этот — для перенаправления в тор-сеть запросов к таким сайтам.
SocksPort            10.0.1.187:9040 # Собственный адрес:порт машины в обслуживаемой локалке, если надо проксировать запросы к недоступным напрямую ресурсам (см. примеры ниже к фильмам, книгам и т.п.).
SocksPort            10.0.1.187:9050 # Собственный адрес:порт нашего сервера в обслуживаемой локалке, если надо проксировать запросы к недоступным напрямую ресурсам (см. «Сценарий проксирования» ниже).
</source>
</source>
Про обфускацию (запутывание) для обхода блокировок см. [[Задний_ход_в_DarkWeb#Обновление_мостов_для_обфускатора|здесь]].


==«Шифрующийся» ДНС-прокси==
==«Шифрующийся» ДНС-прокси==
Строка 52: Строка 65:
</source>
</source>
==Кэширующий ДНС==
==Кэширующий ДНС==
{{Примечание|Работают <strong>оба</strong> резолвера &mdash; проверено в одном и том же контейнере поочерёдно. Просто <code>unbound</code> для конторы/квартиры избыточен без выделенного контейнера под него, а как раз <code>dnsmasq</code> зачастую уже крутится на маршрутизаторе и выступает главным дхцпшником/днс-кэшером, которому всего-то остаётся подкорректировать настройки ''(см. ниже)''.}}
===UnBound===
===UnBound===
<code>/etc/unbound.conf</code> (где искать настройки):
*<code>/etc/unbound.conf</code>, где искать настройки:
<source lang="bash">include-toplevel: "/etc/unbound.d/*.conf"</source>
*:<source lang="bash">include-toplevel: "/etc/unbound.d/*.conf"</source>
<code>/etc/unbound.d/server.conf</code> (основные параметры):
*<code>/etc/unbound.d/server.conf</code>, основные параметры:
<source lang="bash">
*:<source lang="bash">
server:
server:
     do-not-query-localhost: no
     do-not-query-localhost: no
Строка 65: Строка 79:
     local-zone: "onion." nodefault
     local-zone: "onion." nodefault
</source>
</source>
<code>/etc/unbound.d/forwards.conf</code> (куда стучаться по зонам "onion" &mdash; тор, и "." &mdash; всем прочим):
*<code>/etc/unbound.d/forwards.conf</code>, куда стучаться за зонами '''"onion"''' &mdash; тор, и '''"."''' &mdash; всеми прочими:
<source lang="bash">
*:<source lang="bash">
forward-zone:
forward-zone:
     name: "onion"
     name: "onion"
Строка 77: Строка 91:


===DNSmasq===
===DNSmasq===
В <code>/etc/dnsmasq.conf</code> раскомментировать строчку:
В {{path|/etc/dnsmasq.conf}} раскомментировать строчку:
<source lang="bash">conf-dir=/etc/dnsmasq.d/,*.conf</source>
<source lang="bash">conf-dir=/etc/dnsmasq.d/,*.conf</source>
И создать парочку файлов.
И создать парочку файлов.
 
*<code>/etc/dnsmasq.d/main.conf</code>:
<code>/etc/dnsmasq.d/main.conf</code>:
*:<source lang="bash">
<source lang="bash">
bind-interfaces
bind-interfaces
expand-hosts
expand-hosts
localise-queries
localise-queries
log-queries
log-queries
# имя интерфейса локалки ставьте своё!
# ставьте имя своего интерфейса в локалку!
interface=lan
interface=lan
</source>
</source>
<code>/etc/dnsmasq.d/dns.conf</code> (onion-имена запрашивать у тора, все остальные &mdash; у днс-криптопрокси):
*<code>/etc/dnsmasq.d/dns.conf</code> (onion-имена запрашивать у тора, все остальные &mdash; у днс-криптопрокси):
<source lang="bash">
*:<source lang="bash">
server=/onion/127.0.0.1#853
server=/onion/127.0.0.1#853
server=127.0.2.1
server=127.0.2.1
</source>
</source>
<strong>Работают оба</strong> резолвера &mdash; проверено в одном и том же контейнере поочерёдно.
Просто в «к<онто|варти>ре» <code>unbound</code> избыточен без выделенного контейнера под него, а <code>dnsmasq</code> зачастую и выступает главным дхцпшником/днс-кэшером, которому остаётся всего-то конфиг подкорректировать вышеприведёнными опциями.


==Переадресация запросов к .onion-сайтам==
==Переадресация запросов к .onion-сайтам==
Ну, онион-имена через торовский ДНС-порт теперь резолвятся. Но чтобы до них достучаться, эти стуки следует тоже пропустить через тор. Скажем, посредством нф-таблиц (примеры к ип-таблицам можете нагуглить самостоятельно их тьмы и тьмы).
Ну, онион-имена через торовский ДНС-порт теперь резолвятся. Но чтобы до них достучаться, эти стуки следует тоже пропустить через тор — скажем, посредством нф-таблиц (примеры к ип-таблицам можете нагуглить самостоятельно, их тьмы и тьмы).


Запросы машин из локалки к адресам из <strong>VirtualAddrNetwork</strong> следует перекидывать на локальный транспортный тор-порт, добавив в файл настроек <code>/etc/nftables.conf</code> (в моём случае):
Запросы машин из локалки к адресам из <strong>VirtualAddrNetwork</strong> следует перекидывать на локальный транспортный тор-порт, добавив в файл настроек <code>/etc/nftables.conf</code> (в моём случае):
Строка 107: Строка 117:
     chain prerouting {
     chain prerouting {
         type nat hook prerouting priority filter
         type nat hook prerouting priority filter
         iif "lan" ip daddr 172.16.0.0/12 tcp flags & (syn | ack) == syn redirect to 9040
         iif "lan" ip daddr 172.16.0.0/12 tcp flags & (syn | ack) == syn redirect to 9050
     }
     }
}</source>
}</source>
Строка 115: Строка 125:
     chain input {
     chain input {
         type filter hook input priority filter
         type filter hook input priority filter
         ct state new tcp dport {ssh,www,9040} tcp flags & (syn|ack) == syn accept
         ct state new tcp dport {ssh,www,9050} tcp flags & (syn|ack) == syn accept
     }
     }
}</source>
}</source>
Строка 121: Строка 131:
<source lang="bash"># sysctl -w net.ipv4.ip_forward=1</source>
<source lang="bash"># sysctl -w net.ipv4.ip_forward=1</source>


=Проверка работоспособности=
=''Тестамбула'': '''доверяй, но…'''=
==С нашего днс/тор-прокси==
==С нашего прокси==
===Запустим всё добро===
===Запустим всё добро===
<source lang="bash"># systemctl enable --now nftables tor dnscrypt-proxy lighttpd (если раздаём скрипт WPAD отсюда же) dnsmasq (или unbound)</source>
<source lang="bash"># systemctl enable --now nftables tor dnscrypt-proxy lighttpd (если раздаём скрипт WPAD отсюда же) dnsmasq (или unbound)</source>


===Глянем, кто слушает ДНС-запросы===
===Глянем, кто слушает ДНС-запросы===
<code>root@dnsproxy:~# lsof -ni :53</code>
<strong><code>root@dnsproxy:~# lsof -ni :53 -ni :853</code></strong>
<source lang="bash">
<source lang="bash">
COMMAND    PID            USER  FD  TYPE    DEVICE SIZE/OFF NODE NAME
COMMAND    PID            USER  FD  TYPE    DEVICE SIZE/OFF NODE NAME
Строка 140: Строка 150:
dnscrypt- 3512 _dnscrypt-proxy    9u  IPv4 2398895732      0t0  TCP 127.0.2.1:domain (LISTEN)
dnscrypt- 3512 _dnscrypt-proxy    9u  IPv4 2398895732      0t0  TCP 127.0.2.1:domain (LISTEN)
dnscrypt- 3512 _dnscrypt-proxy  10u  IPv4 2398895733      0t0  UDP 127.0.2.1:domain  
dnscrypt- 3512 _dnscrypt-proxy  10u  IPv4 2398895733      0t0  UDP 127.0.2.1:domain  
</source>
tor       1964           _tor    7u  IPv4 2508094076      0t0  UDP 127.0.0.1:domain-s  
<code>root@dnsproxy:~# lsof -ni :853</code>
<source lang="bash">
COMMAND  PID       USER  FD  TYPE    DEVICE SIZE/OFF NODE NAME
tor    1964       _tor    7u  IPv4 2508094076      0t0  UDP 127.0.0.1:domain-s  
</source>
</source>
===Поопрашиваем наш кэш===
===Поопрашиваем наш кэш===
<code>admin@dnsproxy:~$ host ya.ru localhost</code>
<strong><code>admin@dnsproxy:~$ host ya.ru localhost</code></strong>
<source lang="bash">
<source lang="bash">
Using domain server:
Using domain server:
Строка 158: Строка 164:
ya.ru mail is handled by 10 mx.yandex.ru.
ya.ru mail is handled by 10 mx.yandex.ru.
</source>
</source>
<code>admin@dnsproxy:~$ host google.ru 10.0.1.187</code>
<strong><code>admin@dnsproxy:~$ host google.ru 10.0.1.187</code></strong>
<source lang="bash">
<source lang="bash">
Using domain server:
Using domain server:
Строка 169: Строка 175:
google.ru mail is handled by 0 smtp.google.com.
google.ru mail is handled by 0 smtp.google.com.
</source>
</source>
<code>admin@dnsproxy:~$ host rutorzzmfflzllk5.onion</code>
<strong><code>admin@dnsproxy:~$ host rutorzzmfflzllk5.onion</code></strong>
<source lang="bash">
<source lang="bash">
rutorzzmfflzllk5.onion has address 172.30.0.165
rutorzzmfflzllk5.onion has address 172.30.0.165
Строка 175: Строка 181:
Host rutorzzmfflzllk5.onion not found: 4(NOTIMP)
Host rutorzzmfflzllk5.onion not found: 4(NOTIMP)
</source>
</source>
==С рабочей станции==
==С рабочей станции==
===Cтатический маршрут к <strong>VirtualAddrNetwork</strong>===
===Cтатический маршрут к <strong>VirtualAddrNetwork</strong>===
Если для заворота через нашу тор-машинку таковой не отдаётся 121 опцией DHCP или доменной политикой, можно прибить по месту врукопашную:
Если для заворота через нашу тор-машинку таковой не отдаётся 121 опцией DHCP или доменной политикой, можно прибить по месту врукопашную:


<code># ip r a 172.16.0.0/12 via 10.0.1.187</code>  
<strong><code># ip r a 172.16.0.0/12 via 10.0.1.187</code></strong>


Для виндоклиента:
Для виндоклиента:


<code>route add -p 172.16.0.0/12 10.0.1.187</code>
<strong><code>route add -p 172.16.0.0/12 10.0.1.187</code></strong>
 
===Опросим кэш===
===Опросим кэш===
<code>[admin@it-1 ~]$ host mail.ru</code>
<strong><code>[admin@it-1 ~]$ nslookup mail.ru</code></strong>
<source lang="bash">
<source lang="bash">
Using domain server:
Server:         10.0.1.187
Name: 10.0.1.187
Address:       10.0.1.187#53
Address: 10.0.1.187#53
Aliases:


mail.ru has address 217.69.139.202
Non-authoritative answer:
mail.ru has address 94.100.180.200
Name:    mail.ru
mail.ru has address 94.100.180.201
Address: 94.100.180.200
mail.ru has address 217.69.139.200
Name:    mail.ru
mail.ru has IPv6 address 2a00:1148:db00:0:b0b0::1
Address: 94.100.180.201
mail.ru mail is handled by 10 mxs.mail.ru.
Name:    mail.ru
Address: 217.69.139.200
Name:    mail.ru
Address: 217.69.139.202
Name:    mail.ru
Address: 2a00:1148:db00:0:b0b0::1
</source>
</source>
<code>[admin@it-1 .ssh]$ host ghwqllapkfpnufc4rjlcay2y4ycgngpgdjhl6qblasz3q4s33wsx5uyd.onion 10.0.1.187</code>
<strong><code>[admin@it-1 .ssh]$ nslookup rutordeepkpafpudl22pbbhzm4llbgncunvgcc66kax55sc4mp4kxcid.onion 10.0.1.187</code></strong>
<source lang="bash">
<source lang="bash">
Using domain server:
Server:         10.0.1.187
Name: 10.0.1.187
Address:       10.0.1.187#53
Address: 10.0.1.187#53
Aliases:


ghwqllapkfpnufc4rjlcay2y4ycgngpgdjhl6qblasz3q4s33wsx5uyd.onion has address 172.24.99.80
Non-authoritative answer:
ghwqllapkfpnufc4rjlcay2y4ycgngpgdjhl6qblasz3q4s33wsx5uyd.onion has IPv6 address fea2:9235:5ab8:aaa3:b6cf:c537:69f4:b09a
Name:    rutordeepkpafpudl22pbbhzm4llbgncunvgcc66kax55sc4mp4kxcid.onion
Host ghwqllapkfpnufc4rjlcay2y4ycgngpgdjhl6qblasz3q4s33wsx5uyd.onion not found: 2(SERVFAIL)
Address: 172.27.82.115
Name:    rutordeepkpafpudl22pbbhzm4llbgncunvgcc66kax55sc4mp4kxcid.onion
Address: fe93:82fe:e5a9:4bfb:f67f:e6f2:4d32:a62d
</source>
</source>


<strong><code>[admin@it-1 syntax]$ host flibustaongezhld6dibs2dps6vm4nvqg2kp7vgowbu76tzopgnhazqd.onion</code></strong>
<source lang="bash">
flibustaongezhld6dibs2dps6vm4nvqg2kp7vgowbu76tzopgnhazqd.onion has address 172.26.245.219
flibustaongezhld6dibs2dps6vm4nvqg2kp7vgowbu76tzopgnhazqd.onion has IPv6 address feaa:c13c:7ad9:d676:f716:2990:6943:eaf8
Host flibustaongezhld6dibs2dps6vm4nvqg2kp7vgowbu76tzopgnhazqd.onion not found: 2(SERVFAIL)
</source>
===Сходим браузером===
===Сходим браузером===
[[Файл:Onion-site.png|Онион-сайт]]
[[Файл:Onion-site.png|Онион-сайт]]
Строка 217: Строка 232:
Некоторые онион-ресурсы можно пооткрывать [https://darkweblinks.com/ отсюда].
Некоторые онион-ресурсы можно пооткрывать [https://darkweblinks.com/ отсюда].


=Постамбула: автопрокси=
=''Постамбула'': '''автопрокси'''=
К блокируемым ресурсам не обязательно ломиться через браузерный прокси-плагин с каждой машинки, коль скоро есть вариант с ява-скриптовым автопрокси на всю контору &mdash; что и сделаем.
К блокируемым ресурсам не обязательно ломиться через браузерный прокси-плагин с каждой машинки, коль скоро есть вариант с ява-скриптовым автопрокси на всю контору &mdash; каковой и задействуем.
==Веб-сервис==
==Веб-сервис==
Поднять на нашем свежезапущенном тор-днс-прокси что-то простецкое типа <code>lighttpd</code> &mdash; настройки гуглятся.
Поднять на нашем свежезапущенном тор-днс-прокси что-то простецкое типа <code>lighttpd</code> &mdash; настройки гуглятся.
==Сценарий проксирования==
==Сценарий распределения==
В корень веб-сервиса положить файлик <code>wpad.dat</code> приблизительно следующего содержания, в дальнейшем по необходимости пополняя его другими блокируемыми сайтами:
В корень веб-сервиса (к примеру, в <code>/var/www/webapps/</code>) положить файлик <code>wpad.dat</code> приблизительно следующего содержания, в дальнейшем по необходимости пополняя его другими блокируемыми сайтами:
<source lang="bash">
{|class="mw-collapsible mw-collapsed"
!<code>/var/www/webapps/wpad.dat</code>
|-
|<source lang="bash">
function FindProxyForURL(url,host){
function FindProxyForURL(url,host){
     if (shExpMatch(url,"*baza-knig.ru/*")      ||
     if(shExpMatch(url,"*baza-knig.ru/*")      ||
        shExpMatch(url,"*bookzip.ru/*")        ||
      shExpMatch(url,"*.bookafan.website/*")  ||
         shExpMatch(url,"*fantasy-worlds.org/*") ||
      shExpMatch(url,"*bookzip.ru/*")        ||
         shExpMatch(url,"*flibusta.net/*")       ||
      shExpMatch(url,"*.btmet.com/*")         ||
        shExpMatch(url,"*kinobar.me/*")        ||
      shExpMatch(url,"*citilink.ru/*")        ||
        shExpMatch(url,"*kinotazz.ru/*")        ||
      shExpMatch(url,"*fantasy-worlds.org/*") ||
        shExpMatch(url,"*.linkedin.com/*")      ||
      shExpMatch(url,"*flibusta.*/*")         ||
        shExpMatch(url,"*loveread.ec/*")        ||
      shExpMatch(url,"*gmt-max.net/*")        ||
        shExpMatch(url,"*mechanics-games.com/*")||
      shExpMatch(url,"*intoupload.net/*")     ||
        shExpMatch(url,"*nnmclub.to/*")        ||
      shExpMatch(url,"*kinobar.me/*")        ||
        shExpMatch(url,"*.onion/*")            ||
      shExpMatch(url,"*kinogo.la/*")          ||
         shExpMatch(url,"*rg-mechanics.games/*") ||
      shExpMatch(url,"*kinosvit.tv/*")        ||
        shExpMatch(url,"*.rgmechanics.info/*") ||
      shExpMatch(url,"*kinotazz.ru/*")        ||
        shExpMatch(url,"*rutor*/*")            ||
      shExpMatch(url,"*.kritka.info/*")      ||
        shExpMatch(url,"*seasonvar.ru/*")      ||
      shExpMatch(url,"*.linkedin.com/*")      ||
        shExpMatch(url,"*torlock.cc/*")        ||
      shExpMatch(url,"*loveread.ec/*")        ||
        shExpMatch(url,"*torrent*/*")          ||
      shExpMatch(url,"*mechanics-games.*/*") ||
        shExpMatch(url,"*tracker.*/*")          ||
      shExpMatch(url,"*nnmclub.to/*")        ||
         shExpMatch(url,"*.weebly.com/*")       ||
      shExpMatch(url,"*.onion/*")            ||
        shExpMatch(url,"*xatab-repack*/*"))
      shExpMatch(url,"*onion.live/*")         ||
         return "SOCKS5 10.0.1.187:9040; SOCKS 10.0.1.187:9040";
      shExpMatch(url,"*piratam.net/*")        ||
      shExpMatch(url,"*rg-mechanics.*/*")     ||
      shExpMatch(url,"*rgmechanics.*/*")     ||
      shExpMatch(url,"*rutor*/*")            ||
      shExpMatch(url,"*.santehnika1.ru/*")    ||
      shExpMatch(url,"*seasonvar.ru/*")      ||
      shExpMatch(url,"*.semyanich.com/*")    ||
      shExpMatch(url,"*serialytut.me/*")      ||
      shExpMatch(url,"*skidrowcpy.com/*")    ||
      shExpMatch(url,"*.torgamez.com/*")      ||
      shExpMatch(url,"*torlock.cc/*")        ||
      shExpMatch(url,"*.torproject.org/*")    ||
      shExpMatch(url,"*torrent*/*")          ||
      shExpMatch(url,"*tracker.*/*")          ||
      shExpMatch(url,"*.underver.se/*")      ||
      shExpMatch(url,"*.vonos.net/*")         ||
      shExpMatch(url,"*weebly.com/*")         ||
      shExpMatch(url,"*xatab-repack*/*"))
         return "SOCKS5 10.0.1.187:9050; SOCKS 10.0.1.187:9050";
     else return "DIRECT";
     else return "DIRECT";
}
}
</source>
</source>
|}


==Имя сервера==
==Имя сервера==
Для клиентов из локалки на внутреннем ДНСе сопоставить адресу нашего сервера имя/псевдоним вида <code>wpad.наш.внутренний.домен</code>.
Для клиентов из локалки на внутреннем ДНСе сопоставить адресу нашего сервера имя/псевдоним вида <code>wpad.наш.внутренний.домен</code>.


В принципе, браузер, настроенный на автоопределение прокси-сервера, уже на этом шаге подтянет приведённый сценарий по ДНС, но не помешает всё же добить настройку следующим пунктом.
Браузер, настроенный на автоопределение прокси-сервера, уже на этом шаге подтянет приведённый сценарий по ДНС (проверить действенность списка можно, прямо задав браузеру адрес <code>http://wpad.наш.внутренний.домен/wpad.dat</code> в пути к сценарию автонастройки).
 
Однако не помешает всё же добить настройку следующим пунктом.


==Раздача прокси-скрипта==
==Раздача прокси-скрипта==
Указать в <code>252 опции DHCP</code> адрес <code>http://wpad.наш.внутренний.домен/wpad.dat</code>, дабы дать знать клиентам в локалке, кто решает, что куда проксировать.
Указать в <code>252 опции DHCP</code> адрес <code>http://wpad.наш.внутренний.домен/wpad.dat</code>, дабы дать знать клиентам в локалке, кто решает, что куда проксировать.


Проверить действенность списка можно, прямо задав браузеру этот адрес в пути к сценарию автонастройки.
=Примечания=
<references>
    <ref name="Sisyphus">В Альте доступен пока только для Сизифа. Варианты обхода:
*Просто апнуть до оного контейнер (для цельной системы едва ли пригодно).
*Пересобрать пакет из сизифового <code>.srpm</code>.
    </ref>
</references>
=Обратная связь=
*[https://t.me/gbIMoBou @gbIMoBou]
*[[Участник:Дым#Заметки|Другие статьи]]
{{Category navigation|title=Системному администратору|category=Admin|sortkey={{SUBPAGENAME}}}}
{{Category navigation|title=Системному администратору|category=Admin|sortkey={{SUBPAGENAME}}}}
[[Категория:Admin]]
[[Категория:Admin]]

Текущая версия от 07:23, 1 декабря 2024

Приказ провайдерам
Уточнения к приказу

Преамбула: без чего никак

Ввиду государственных/корпоративных поползновений на остатки свободы ходить взрослым людям по просторам интернетов куда заблагорассудится, встаёт вопрос, каким образом от оных препон хоть «на минималках» отгородиться.

Что ж, попробуем. Решаться будет две задачи:

Резолвинг

dnscrypt-proxy[1] запрашивает соответствие между человеческими и айпическими адресами у серверов, умеющих шифроваться, дабы вышесидящие над нами органы не могли манипулировать процессом.

tor производит то же самое в отношении незарегистрированной зоны .onion.

dnsmasq/unbound кэшируют все эти запросы ради быстрого резолвинга для всех устройств в обслуживаемой сети.

Проксирование

tor (двустаночник, чесслово!) — пропускает через себя запросы к:

  1. онион-сайтам (чего мимо него и не выйдет);
  2. запретным ресурсам в соответствии с…
    • персональным списком из браузерного плагина (FoxyProxy, SwitchyOmega и т.п. — см. заметку про настройки для персонального компа) и/или
    • скриптом автопрокси, размещённым на внутрисетевом веб-сервере.

obfs4[1] — «запутывающий» (obfuscating) прокси, добавка к tor'у.

lighttpd (не обязательный компонент) — лёгкий и простой в настройке веб-сервер для раздачи в локалку вышеупомянутого скрипта автоопределения прокси.

Амбула: реализация

Понадобится установить пакеты:

  • tor — для подключения к сети «луковых» маршрутизаторов и преобразования «луковых» имён в IP'ы;
  • torsocks — для пропуска хостов локальной сети в «луковую»;
  • obfs4 — для обхода РКНовских блокировок tor'а по «мостикам»;
  • dnscrypt-proxy — то же самое, но для плебса: без препонов, чинимых хоть вышестоящим провайдером, хоть надзорными органами;
  • dnsmasq (на уровне организации/квартиры) или
  • unbound (в масштабе провайдера) — для кэширования запросов к обоим вышеозначенным «шифрующимся» (эрго, довольно неспешным) резолверам.
  • lighttpd (см. ниже) — для ориентирования узлов сети, к каким ресурсам черезо что ходить.

Например (зависит от используемого дистрибутива), так:

# apt-get update && apt-get install -y dnscrypt-proxy dnsmasq lighttpd obfs4 tor torsocks unbound

The Onion Router («луковый» маршрутизатор)

Примечание: Здесь и далее — адреса/порты выбирайте уместные для своих реалий.

Настроим так, чтобы он и в ДНС умел, и к ресурсам пропускал. Добавим в его конфиг /etc/tor/torrc:

VirtualAddrNetwork    172.16.0.0/12   # «Серая» сеть, не используемая на предприятии…
AutomapHostsOnResolve 1               # …адрес из которой прикреплять к IPv6-адресу каждого онион-сайта.
DNSPort               853             # Порт на петлевом интерфейсе для резолвинга .onion-имён…
TransPort             9050            # …а этот — для перенаправления в тор-сеть запросов к таким сайтам.
SocksPort             10.0.1.187:9050 # Собственный адрес:порт нашего сервера в обслуживаемой локалке, если надо проксировать запросы к недоступным напрямую ресурсам (см. «Сценарий проксирования» ниже).

Про обфускацию (запутывание) для обхода блокировок см. здесь.

«Шифрующийся» ДНС-прокси

Умолчально слушает запросы на 127.0.2.1:53 (как системд велит), мой примитивный конфиг /etc/dnscrypt-proxy.toml выглядит так:

# Empty listen_addresses to use systemd socket activation
listen_addresses = []
server_names = ['cisco', 'cisco-ipv6']
dnscrypt_servers = true
doh_servers = true
use_syslog = true
[sources]
    [sources.'public-resolvers']
    url = 'https://download.dnscrypt.info/resolvers-list/v2/public-resolvers.md'
    cache_file = 'public-resolvers.md'
    minisign_key = 'RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3'
    refresh_delay = 72
    prefix = ''

Кэширующий ДНС

Примечание: Работают оба резолвера — проверено в одном и том же контейнере поочерёдно. Просто unbound для конторы/квартиры избыточен без выделенного контейнера под него, а как раз dnsmasq зачастую уже крутится на маршрутизаторе и выступает главным дхцпшником/днс-кэшером, которому всего-то остаётся подкорректировать настройки (см. ниже).

UnBound

  • /etc/unbound.conf, где искать настройки:
    include-toplevel: "/etc/unbound.d/*.conf"
    
  • /etc/unbound.d/server.conf, основные параметры:
    server:
        do-not-query-localhost: no
        interface: 127.0.0.1
        interface: 10.0.1.187
        domain-insecure: "onion"
        private-domain: "onion"
        local-zone: "onion." nodefault
    
  • /etc/unbound.d/forwards.conf, куда стучаться за зонами "onion" — тор, и "." — всеми прочими:
    forward-zone:
        name: "onion"
        forward-addr: 127.0.0.1@853
    
    forward-zone:
        name: "."
        forward-addr: 127.0.2.1
    

DNSmasq

В /etc/dnsmasq.conf раскомментировать строчку:

conf-dir=/etc/dnsmasq.d/,*.conf

И создать парочку файлов.

  • /etc/dnsmasq.d/main.conf:
    bind-interfaces
    expand-hosts
    localise-queries
    log-queries
    # ставьте имя своего интерфейса в локалку!
    interface=lan
    
  • /etc/dnsmasq.d/dns.conf (onion-имена запрашивать у тора, все остальные — у днс-криптопрокси):
    server=/onion/127.0.0.1#853
    server=127.0.2.1
    

Переадресация запросов к .onion-сайтам

Ну, онион-имена через торовский ДНС-порт теперь резолвятся. Но чтобы до них достучаться, эти стуки следует тоже пропустить через тор — скажем, посредством нф-таблиц (примеры к ип-таблицам можете нагуглить самостоятельно, их тьмы и тьмы).

Запросы машин из локалки к адресам из VirtualAddrNetwork следует перекидывать на локальный транспортный тор-порт, добавив в файл настроек /etc/nftables.conf (в моём случае):

table ip nat {
    chain prerouting {
        type nat hook prerouting priority filter
        iif "lan" ip daddr 172.16.0.0/12 tcp flags & (syn | ack) == syn redirect to 9050
    }
}

А чтоб клиентам можно было ходить не только на .onion-сайты, но и прочие блокируемые ресурсы (а также забирать список проксирования, да и по ссх к нашему серверу подключаться), добавим ещё и это:

table inet filter {
    chain input {
        type filter hook input priority filter
        ct state new tcp dport {ssh,www,9050} tcp flags & (syn|ack) == syn accept
    }
}

Для пропуска же клиентских запросов наружу не обойтись без включения маршрутизации — в файл /etc/sysctl.d/router.conf добавить строчку net.ipv4.ip_forward = 1 и применить без перезагрузки командой:

# sysctl -w net.ipv4.ip_forward=1

Тестамбула: доверяй, но…

С нашего прокси

Запустим всё добро

# systemctl enable --now nftables tor dnscrypt-proxy lighttpd (если раздаём скрипт WPAD отсюда же) dnsmasq (или unbound)

Глянем, кто слушает ДНС-запросы

root@dnsproxy:~# lsof -ni :53 -ni :853

COMMAND    PID            USER   FD   TYPE     DEVICE SIZE/OFF NODE NAME
systemd      1            root   22u  IPv4 2398895732      0t0  TCP 127.0.2.1:domain (LISTEN)
systemd      1            root   24u  IPv4 2398895733      0t0  UDP 127.0.2.1:domain 
systemd-r 1542 systemd-resolve   17u  IPv4 2498608608      0t0  UDP 127.0.0.53:domain 
systemd-r 1542 systemd-resolve   18u  IPv4 2498608609      0t0  TCP 127.0.0.53:domain (LISTEN)
unbound   3247         unbound    3u  IPv4 2532507011      0t0  UDP 127.0.0.1:domain 
unbound   3247         unbound    4u  IPv4 2532507012      0t0  TCP 127.0.0.1:domain (LISTEN)
unbound   3247         unbound    5u  IPv4 2532507013      0t0  UDP 10.0.1.187:domain 
unbound   3247         unbound    6u  IPv4 2532507014      0t0  TCP 10.0.1.187:domain (LISTEN)
dnscrypt- 3512 _dnscrypt-proxy    9u  IPv4 2398895732      0t0  TCP 127.0.2.1:domain (LISTEN)
dnscrypt- 3512 _dnscrypt-proxy   10u  IPv4 2398895733      0t0  UDP 127.0.2.1:domain 
tor       1964            _tor    7u  IPv4 2508094076      0t0  UDP 127.0.0.1:domain-s

Поопрашиваем наш кэш

admin@dnsproxy:~$ host ya.ru localhost

Using domain server:
Name: localhost
Address: ::1#53
Aliases: 

ya.ru has address 87.250.250.242
ya.ru has IPv6 address 2a02:6b8::2:242
ya.ru mail is handled by 10 mx.yandex.ru.

admin@dnsproxy:~$ host google.ru 10.0.1.187

Using domain server:
Name: 100.0.1.187
Address: 10.0.1.187#53
Aliases: 

google.ru has address 173.194.73.94
google.ru has IPv6 address 2a00:1450:4010:c0d::5e
google.ru mail is handled by 0 smtp.google.com.

admin@dnsproxy:~$ host rutorzzmfflzllk5.onion

rutorzzmfflzllk5.onion has address 172.30.0.165
rutorzzmfflzllk5.onion has IPv6 address feb7:c904:733c:691f:d722:3a78:be39:6ba5
Host rutorzzmfflzllk5.onion not found: 4(NOTIMP)

С рабочей станции

Cтатический маршрут к VirtualAddrNetwork

Если для заворота через нашу тор-машинку таковой не отдаётся 121 опцией DHCP или доменной политикой, можно прибить по месту врукопашную:

# ip r a 172.16.0.0/12 via 10.0.1.187

Для виндоклиента:

route add -p 172.16.0.0/12 10.0.1.187

Опросим кэш

[admin@it-1 ~]$ nslookup mail.ru

Server:         10.0.1.187
Address:        10.0.1.187#53

Non-authoritative answer:
Name:    mail.ru
Address: 94.100.180.200
Name:    mail.ru
Address: 94.100.180.201
Name:    mail.ru
Address: 217.69.139.200
Name:    mail.ru
Address: 217.69.139.202
Name:    mail.ru
Address: 2a00:1148:db00:0:b0b0::1

[admin@it-1 .ssh]$ nslookup rutordeepkpafpudl22pbbhzm4llbgncunvgcc66kax55sc4mp4kxcid.onion 10.0.1.187

Server:         10.0.1.187
Address:        10.0.1.187#53

Non-authoritative answer:
Name:    rutordeepkpafpudl22pbbhzm4llbgncunvgcc66kax55sc4mp4kxcid.onion
Address: 172.27.82.115
Name:    rutordeepkpafpudl22pbbhzm4llbgncunvgcc66kax55sc4mp4kxcid.onion
Address: fe93:82fe:e5a9:4bfb:f67f:e6f2:4d32:a62d

[admin@it-1 syntax]$ host flibustaongezhld6dibs2dps6vm4nvqg2kp7vgowbu76tzopgnhazqd.onion

flibustaongezhld6dibs2dps6vm4nvqg2kp7vgowbu76tzopgnhazqd.onion has address 172.26.245.219
flibustaongezhld6dibs2dps6vm4nvqg2kp7vgowbu76tzopgnhazqd.onion has IPv6 address feaa:c13c:7ad9:d676:f716:2990:6943:eaf8
Host flibustaongezhld6dibs2dps6vm4nvqg2kp7vgowbu76tzopgnhazqd.onion not found: 2(SERVFAIL)

Сходим браузером

Онион-сайт

Некоторые онион-ресурсы можно пооткрывать отсюда.

Постамбула: автопрокси

К блокируемым ресурсам не обязательно ломиться через браузерный прокси-плагин с каждой машинки, коль скоро есть вариант с ява-скриптовым автопрокси на всю контору — каковой и задействуем.

Веб-сервис

Поднять на нашем свежезапущенном тор-днс-прокси что-то простецкое типа lighttpd — настройки гуглятся.

Сценарий распределения

В корень веб-сервиса (к примеру, в /var/www/webapps/) положить файлик wpad.dat приблизительно следующего содержания, в дальнейшем по необходимости пополняя его другими блокируемыми сайтами:

/var/www/webapps/wpad.dat
function FindProxyForURL(url,host){
    if(shExpMatch(url,"*baza-knig.ru/*")       ||
       shExpMatch(url,"*.bookafan.website/*")  ||
       shExpMatch(url,"*bookzip.ru/*")         ||
       shExpMatch(url,"*.btmet.com/*")         ||
       shExpMatch(url,"*citilink.ru/*")        ||
       shExpMatch(url,"*fantasy-worlds.org/*") ||
       shExpMatch(url,"*flibusta.*/*")         ||
       shExpMatch(url,"*gmt-max.net/*")        ||
       shExpMatch(url,"*intoupload.net/*")     ||
       shExpMatch(url,"*kinobar.me/*")         ||
       shExpMatch(url,"*kinogo.la/*")          ||
       shExpMatch(url,"*kinosvit.tv/*")        ||
       shExpMatch(url,"*kinotazz.ru/*")        ||
       shExpMatch(url,"*.kritka.info/*")       ||
       shExpMatch(url,"*.linkedin.com/*")      ||
       shExpMatch(url,"*loveread.ec/*")        ||
       shExpMatch(url,"*mechanics-games.*/*")  ||
       shExpMatch(url,"*nnmclub.to/*")         ||
       shExpMatch(url,"*.onion/*")             ||
       shExpMatch(url,"*onion.live/*")         ||
       shExpMatch(url,"*piratam.net/*")        ||
       shExpMatch(url,"*rg-mechanics.*/*")     ||
       shExpMatch(url,"*rgmechanics.*/*")      ||
       shExpMatch(url,"*rutor*/*")             ||
       shExpMatch(url,"*.santehnika1.ru/*")    ||
       shExpMatch(url,"*seasonvar.ru/*")       ||
       shExpMatch(url,"*.semyanich.com/*")     ||
       shExpMatch(url,"*serialytut.me/*")      ||
       shExpMatch(url,"*skidrowcpy.com/*")     ||
       shExpMatch(url,"*.torgamez.com/*")      ||
       shExpMatch(url,"*torlock.cc/*")         ||
       shExpMatch(url,"*.torproject.org/*")    ||
       shExpMatch(url,"*torrent*/*")           ||
       shExpMatch(url,"*tracker.*/*")          ||
       shExpMatch(url,"*.underver.se/*")       ||
       shExpMatch(url,"*.vonos.net/*")         ||
       shExpMatch(url,"*weebly.com/*")         ||
       shExpMatch(url,"*xatab-repack*/*"))
         return "SOCKS5 10.0.1.187:9050; SOCKS 10.0.1.187:9050";
    else return "DIRECT";
}

Имя сервера

Для клиентов из локалки на внутреннем ДНСе сопоставить адресу нашего сервера имя/псевдоним вида wpad.наш.внутренний.домен.

Браузер, настроенный на автоопределение прокси-сервера, уже на этом шаге подтянет приведённый сценарий по ДНС (проверить действенность списка можно, прямо задав браузеру адрес http://wpad.наш.внутренний.домен/wpad.dat в пути к сценарию автонастройки).

Однако не помешает всё же добить настройку следующим пунктом.

Раздача прокси-скрипта

Указать в 252 опции DHCP адрес http://wpad.наш.внутренний.домен/wpad.dat, дабы дать знать клиентам в локалке, кто решает, что куда проксировать.

Примечания

  1. 1,0 1,1 В Альте доступен пока только для Сизифа. Варианты обхода:
    • Просто апнуть до оного контейнер (для цельной системы едва ли пригодно).
    • Пересобрать пакет из сизифового .srpm.

Обратная связь