Безграничный DNS
Преамбула: без чего никак
Ввиду государственных/корпоративных поползновений на остатки свободы ходить взрослым людям по просторам интернетов куда заблагорассудится, встаёт вопрос, каким образом от оных препон хоть «на минималках» отгородиться.
Что ж, попробуем. Решаться будет две задачи:
Резолвинг
dnscrypt-proxy[1] запрашивает соответствие между человеческими и айпическими адресами у серверов, умеющих шифроваться, дабы вышесидящие над нами органы не могли манипулировать процессом.
tor производит то же самое в отношении незарегистрированной зоны .onion
.
dnsmasq/unbound кэшируют все эти запросы ради быстрого резолвинга для всех устройств в обслуживаемой сети.
Проксирование
tor (двустаночник, чесслово!) — пропускает через себя запросы к:
- онион-сайтам (чего мимо него и не выйдет);
- запретным ресурсам в соответствии с…
- персональным списком из браузерного плагина (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
/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
, дабы дать знать клиентам в локалке, кто решает, что куда проксировать.