ToR + DoH
tor-net tuxtorpass
Обход блокировок через TOR + DoH Если на маршрутизаторе настроены DOH или DOT серверы и отключены DNS серверы провайдера, то не нужно трогать /opt/bin/unblock_ipset.sh и установка dnsmasq вообще не требуется. Всё будет работать через прошивочные DOH и DOT. Инструкцию можно упростить: не устанавливать пакет dnsmasq-full и не выполнять пункты
6, 10 и 12, а скрипт из п.
7 сделать таким:
#!/bin/sh
ipset flush unblock
/opt/bin/unblock_ipset.sh &
И всё продолжит работать если добавить DNS-серверы (только не провайдера, а, например, 8.8.8.8) для устройств, к которым не применен интернет-фильтр, когда по каким-то причинам надо отключить DOH/DOT.
Выборочный обход блокировок
https://habr.com/ru/post/428992/ 1. Установка необходимого ПО на маршрутизаторе opkg update
opkg install mc tor tor-geoip bind-dig cron dnsmasq-full ipset iptables
mc — файловый менеджер Midnight Commander. Он нужен лишь из-за удобного редактора mcedit. Если вы привыкли пользоваться другим текстовым редактором, то mc можно не устанавливать.
tor — сервис Tor.
tor-geoip — база гео-IP для Tor.
bind-dig — DNS-клиент (аналог nslookup и host).
cron — планировщик заданий.
dnsmasq-full — DNS-сервер.
ipset и iptables — консольные утилиты ipset и iptables (возможно, они уже есть в системе и не нужны, я добавил их для подстраховки).
2. Инициализация ipset, создание множества IP-адресов unblock (100-ipset.sh) Проверьте, что в системе вашего маршрутизатора есть поддержка множества hash:net (как оказалась, не во всех маршрутизаторах Keenetic она есть):
ipset create test hash:net Если команда никаких ошибок и сообщений не выдала, значит поддержка есть, и просто следуйте инструкции дальше. В противном случае (есть ошибка) в следующем скрипте вам нужно заменить
hash:net на hash:ip. При этом вы потеряете возможность разблокировки по диапазону и CIDR.
Создайте пустое множество адресов с именем unblock при загрузке маршрутизатора. Для этого создайте файл /opt/etc/ndm/fs.d/100-ipset.sh:
mcedit /opt/etc/ndm/fs.d/100-ipset.sh
Вставьте (Shift+Insert) содержимое:
#!/bin/sh
[ "$1" != "start" ] && exit 0
ipset create unblock hash:
net -exist
exit 0
Чтобы вставить из буфера, используйте Shift+Insert, сохранить - F2, выйти - F10.
Дайте права на исполнение:
chmod +x /opt/etc/ndm/fs.d/100-ipset.sh
3. Настройка Tor Удалите содержимое конфигурационного файла Tor:
cat /dev/null > /opt/etc/tor/torrc
Откройте файл конфигурации Tor:
mcedit /opt/etc/tor/torrc
Вставьте (Shift+Insert) содержимое:
User root
PidFile /opt/var/run/tor.pid
ExcludeExitNodes {RU},{UA},{AM},{KG},{BY}
StrictNodes 1
TransPort 192.168.0.1:9141
ExitRelay 0
ExitPolicy reject *:*
ExitPolicy reject6 *:*
GeoIPFile /opt/share/tor/geoip
GeoIPv6File /opt/share/tor/geoip6
DataDirectory /opt/var/lib/tor
TrackHostExits .google.com .file-space.org .ginstrength.ru .s2file-space.org .disk-space.ru .ska4ay.com .youtube.com .softbro.ru .yandex.ru .mail.ru
ExcludeSingleHopRelay 0.
Замените при необходимости 192.168.0.1 на внутренний адрес вашего маршрутизатора (LAN). Краткое описание конфигурации:
Исключить выходные узлы: Россия, Украина, Армения Киргизия, Беларусь.
Повесить «прозрачный» прокси на адрес 192.168.0.1, порт 9141.
Запретить быть точкой выхода.
4. Список доменов (и не только) для обхода блокировки (unblock.txt) unblock.txt — простой список для разблокировки. Вы можете разблокировать домен, IP-адрес, диапазон или CIDR. Одна строка — один элемент. Пустые строки (в том числе с пробелами и табуляциями) игнорируются. Можно использовать символ # в начале строки для игнорирования.
Создайте файл /opt/etc/unblock.txt:
mcedit /opt/etc/unblock.txt
Каждая строка может содержать доменное имя, IP-адрес, диапазон или CIDR. Можно использовать символ # для комментирования строк.
5. Скрипт для заполнения множества unblock IP-адресами заданного списка доменов (unblock_ipset.sh) Создайте скрипт /opt/bin/unblock_ipset.sh:
mcedit /opt/bin/unblock_ipset.sh
Вставьте (Shift+Insert) содержимое:
#!/bin/sh
until ADDRS=$(dig +short google.com @localhost) && [ -n "$ADDRS" ] > /dev/null 2>&1; do sleep 5; done
while read line || [ -n "$line" ]; do
[ -z "$line" ] && continue
[ "${line:0:1}" = "#" ] && continue
cidr=$(echo $line | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/[0-9]{1,2}')
if [ ! -z "$cidr" ]; then
ipset -exist add unblock $cidr
continue fi
range=$(echo $line | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}-[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}') if [ ! -z "$range" ]; then
ipset -exist add unblock $range
continue fi
addr=$(echo $line | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}') if [ ! -z "$addr" ]; then
ipset -exist add unblock $addr
continue fi
dig +short $line @localhost | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | awk '{system("ipset -exist add unblock "$1)}'
done < /opt/etc/unblock.txt
Дайте права на исполнение:
chmod +x /opt/bin/unblock_ipset.sh
Скрипт достаточно простой, вот суть его работы… Ждём, когда заработает резолвинг домена google.com (если этого не сделать, то при загрузке маршрутизатора не будет заполнено множество unblock, т.к. маршрутизатор будет находиться ещё в процессе инициализации). Читаем строки в файле unblock.txt. У прочитанных строк автоматически удалены пробелы и табуляция в начале и в конце. Пропускаем пустые строки. Пропускаем строки, которые начинают на символ #. Ищем в строке CIDR. Если CIDR найден, то добавляем его в unblock. Ищем в строке диапазон. Если он найден, то добавляем его в unblock. Ищем в строке IP-адрес. Если IP найден, то добавляем его в unblock. Резолвим строку через dig. Все IP-адреса результата добавляем в unblock.
6. Скрипт для формирования дополнительного конфигурационного файла dnsmasq из заданного списка доменов (unblock_dnsmasq.sh) Создайте скрипт /opt/bin/unblock_dnsmasq.sh:
mcedit /opt/bin/unblock_dnsmasq.sh
Вставьте (Shift+Insert) содержимое:
#!/bin/sh
cat /dev/null > /opt/etc/unblock.dnsmasq
while read line || [ -n "$line" ]; do
[ -z "$line" ] && continue
[ "${line:0:1}" = "#" ] && continue
echo $line | grep -Eq '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' && continue
echo "ipset=/$line/unblock" >> /opt/etc/unblock.dnsmasq
done < /opt/etc/unblock.txt
Дайте права на исполнение:
chmod +x /opt/bin/unblock_dnsmasq.sh
Скрипт достаточно простой. Последовательно читаем строки из /opt/etc/unblock.txt. У прочитанных строк автоматически удалены пробелы и табуляция в начале и в конце. Пропускаем пустые строки. Пропускаем строки, которые начинают на #. Пропускаем строки, которые содержат IP-адрес (IP или CIDR), т.е. нас интересуют только строки с именами доменов. В файл /opt/etc/unblock.dnsmasq вносим строки вида «ipset=/доменное_имя/unblock». Это означает, что после определения IP-адресов конкретного домена они будут автоматически добавлены во множество unblock.
Обязательно запустите скрипт для генерация файла unblock.dnsmasq:
unblock_dnsmasq.sh
Проверьте, что файл unblock.dnsmasq создался:
cat /opt/etc/unblock.dnsmasq
7. Скрипт ручного принудительного обновления системы после редактирования списка доменов (unblock_update.sh) Создайте скрипт /opt/bin/unblock_update.sh:
mcedit /opt/bin/unblock_update.sh
Вставьте (Shift+Insert) содержимое:
#!/bin/sh
ipset flush unblock
/opt/bin/unblock_dnsmasq.sh
/opt/etc/init.d/S56dnsmasq restart
/opt/bin/unblock_ipset.sh &
Дайте права на исполнение:
chmod +x /opt/bin/unblock_update.sh
8. Скрипт автоматического заполнения множества unblock при загрузке маршрутизатора (S99unblock) Создайте скрипт /opt/etc/init.d/S99unblock:
mcedit /opt/etc/init.d/S99unblock
Вставьте (Shift+Insert) содержимое:
#!/bin/sh
[ "$1" != "start" ] && exit 0
/opt/bin/unblock_ipset.sh &
Дайте права на исполнение:
chmod +x /opt/etc/init.d/S99unblock
9. Перенаправление пакетов с адресатами из unblock в Tor (100-redirect.sh) Для этого создайте файл /opt/etc/ndm/netfilter.d/100-redirect.sh:
mcedit /opt/etc/ndm/netfilter.d/100-redirect.sh
Вставьте (Shift+Insert) содержимое:
#!/bin/sh
[ "$type" == "ip6tables" ] && exit 0
if [ -z "$(iptables-save 2>/dev/null | grep unblock)" ]; then
ipset create unblock hash:net -exist
iptables -w -t nat -A PREROUTING -i br0 -p tcp -m set --match-set unblock dst -j REDIRECT --to-port 9141 fi
exit 0
Если вы в шаге 2 использовали hash:ip, а не hash:net, то замените hash:net на hash:ip. Фактически мы дополнительно дублируем функцию создания множества unblock из 2 шага. Это нужно для подстраховки, если скрипты из fs.d ещё не начали запускаться, а скрипты netfilter.d уже запускаются. Ничего страшного, если unblock уже было создано ранее, команда просто будет проигнорирована.
В этот же файл вы можете добавить (это необязательно) перенаправление всех запросов на внешний порт 53 на себя. Это нужно, чтобы клиенты в локальной сети не использовали сторонние DNS-сервисы. Запросы будут идти через штатный DNS-сервер. Перед последним exit добавьте:
if [ -z "$(iptables-save 2>/dev/null | grep "udp \-\-dport 53 \-j DNAT")" ]; then
iptables -w -t nat -I PREROUTING -i br0 -p udp --dport 53 -j DNAT --to 192.168.0.1 fi
if [ -z "$(iptables-save 2>/dev/null | grep "tcp \-\-dport 53 \-j DNAT")" ]; then
iptables -w -t nat -I PREROUTING -i br0 -p tcp --dport 53 -j DNAT --to 192.168.0.1 fi
Замените при необходимости 192.168.0.1 на внутренний адрес вашего маршрутизатора (LAN).
Дайте права на исполнение:
chmod +x /opt/etc/ndm/netfilter.d/100-redirect.sh
10. Настройка dnsmasq и подключение дополнительного конфигурационного файла к dnsmasq Удалите содержимое конфигурационного файла dnsmasq:
cat /dev/null > /opt/etc/dnsmasq.conf
Откройте файл конфигурации dnsmasq:
mcedit /opt/etc/dnsmasq.conf
Вставьте (Shift+Insert) содержимое:
user=nobody
bogus-priv
no-negcache
clear-on-reload
bind-dynamic
listen-address=192.168.0.1
listen-address=127.0.0.1
min-port=4096
cache-size=1536
expand-hosts
log-async
conf-file=/opt/etc/unblock.dnsmasq
server=8.8.8.8
Замените при необходимости 192.168.0.1 на внутренний адрес вашего маршрутизатора (LAN).
11. Добавление задачи в cron для периодического обновления содержимого множества unblock Это дополнительная страховка на тот случай, если программы/устройства используют свой собственный метод резолвинга, а IP-адрес домена изменился. Всё, что нужно сделать, это с желаемой периодичностью запускать скрипт unblock_ipset.sh. Для примера будем запускать каждый день в 6 утра.
Откройте в редакторе файл /opt/etc/crontab:
mcedit /opt/etc/crontab
Добавьте в конце:
00 06 * * * root /opt/bin/unblock_ipset.sh
При желании вы можете закомментировать все остальные шаблонные задачи. В
от, как будет выглядеть ваш файл crontab: 12. Отключение штатного DNS-сервера и перезагрузка маршрутизатора Подключитесь к CLI маршрутизатора Keenetic (порт 23 для Telnet и 22 для SSH, если в системе добавлен компонент «Сервер SSH»).
Выполните команду:
opkg dns-override
system configuration save
system reboot
Встроенный в прошивку DNS-сервер будет выключен, и вместо него будет использоваться dnsmasq из состава Entware. Маршрутизатор при загрузке проверяет, подмонтирована ли папка opt (есть ли флешка/диск с Entware). Если есть, то штатный DNS-сервер не используется. Если нет, используется. Т.е. вынув флешку и перезагрузив маршрутизатор, у вас всё будет работать, как и раньше (перед настройкой).
После перезагрузки откройте в браузере сайт check.torproject.org (он должен быть добавлен в unblock.txt). Если вы всё сделали верно, то вы увидите надпись «Congratulations. This browser is configured to use Tor.»:
Содержание