Skip to content

Instantly share code, notes, and snippets.

@dartraiden
Last active February 19, 2024 12:22
Show Gist options
  • Star 21 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save dartraiden/d60825f1b3c8956f44c7b62a4d52f966 to your computer and use it in GitHub Desktop.
Save dartraiden/d60825f1b3c8956f44c7b62a4d52f966 to your computer and use it in GitHub Desktop.

Исходные данные: роутер имеет адрес 192.168.1.1, tor и i2pd подняты на 192.168.1.10 (если роутер достаточно мощный, можно поднять их прямо на нём, соответственно скорректировав адреса)

В LEDE для загрузки списка заблокированных доменов проще всего использовать поставляемую по умолчанию утилиту uclient-fetch. Необходимо лишь добавить ей поддержку SSL:

opkg update
opkg install libustream-mbedtls

Впрочем, вы можете использовать wget или curl, если предпочитаете. Особенности wget см. ниже.

В OpenWrt какие-то проблемы с поддержкой SSL в uclient-fetch, поэтому предпочтительнее wget. Обратите внимание, что, как в OpenWrt, так в и LEDE, встроенный в BusyBox wget не подходит, поскольку не поддерживает SSL. Необходимо поставить полноценный wget из репозиториев + корневые сертификаты:

opkg update
opkg install wget ca-certificates

Необходимые настройки Tor:

SocksPort 0.0.0.0:9050 # чтобы socks-прокси был доступен другим машинам
SocksPolicy accept 192.168.0.0/16:* # разрешаем подключение к нему из локальной сети
SocksPolicy reject *:* # и запрещаем подключение из всех остальных мест
ExitRelay 0 # чтобы наш узел не был выходным
ExcludeExitNodes {am}, {az}, {by}, {ee}, {ge}, {kg}, {kz}, {lt}, {ly}, {md}, {ru}, {tj}, {tm}, {ua}, {uz} # чтобы исключить использование выходных узлов, расположенных в странах с государственной цензурой

Настройки i2pd:

[socksproxy]
enabled = true
address = 192.168.1.10
port = 4447

Скрипт и вспомогательные файлы будут размещены в /etc/wpad, временные файлы — в /tmp, чтобы лишний раз не изнашивать флеш-память устройства.

/etc/wpad/generate.sh: (сначала я написал свою реализацию, потом обнаружил, что всё уже сделано здесь, поэтому позаимствовал «более лучший» код):

#!/bin/sh

# Резервная копия текущего файла автонастройки
cp /www/wpad.dat /etc/wpad/wpad.dat.bak

# Получаем список доменов, заблокированных в РФ, а также список доменов, которые добровольно ограничивают доступ к некоторым страницам с российских IP-адресов
uclient-fetch -O - "https://api.antizapret.info/group.php?data=domain" | awk '{if ($1 != "") {print "\""$1"\","}}' > /tmp/domains
uclient-fetch -O - "https://bitbucket.org/ValdikSS/antizapret/raw/master/customhosts_hosts.txt" | awk '{if ($1 != "") {print "\""$1"\","}}' >> /tmp/domains
# Если вы собираетесь использовать wget, то
# wget -qO- "https://api.antizapret.info/group.php?data=domain" | awk '{if ($1 != "") {print "\""$1"\","}}' > /tmp/domains
# wget -qO- "https://bitbucket.org/ValdikSS/antizapret/raw/master/customhosts_hosts.txt" | awk '{if ($1 != "") {print "\""$1"\","}}' >> /tmp/domains
# Если вы собираетесь использовать curl, то
# curl -s -L "https://api.antizapret.info/group.php?data=domain" | awk '{if ($1 != "") {print "\""$1"\","}}' > /tmp/domains
# curl -s -L "https://bitbucket.org/ValdikSS/antizapret/raw/master/customhosts_hosts.txt" | awk '{if ($1 != "") {print "\""$1"\","}}' >> /tmp/domains

# Добавляем домены из чёрного списка, если он не пуст
if [ -s "/etc/wpad/domains.blacklist" ]
then
	awk '{if ($1 != "") {print "\""$1"\","}}' /etc/wpad/domains.blacklist >> /tmp/domains
fi

echo "// Generated on $(date)

var domains = [" > /www/wpad.dat
cat /tmp/domains >> /www/wpad.dat
echo "];

function FindProxyForURL(url, host) {
	host = host.replace(/(.+)\.([^.]+\.[^.]+\.[^.]+$)/, \"\$2\");
	for (var i = 0; i < domains.length; i++) {if (host === domains[i]) {return \"SOCKS 192.168.1.10:9050\";}}
	if (shExpMatch(host, \"*.onion\")) {return \"SOCKS 192.168.1.10:9050\";}
	else if (shExpMatch(host, \"*.i2p\")) {return \"SOCKS 192.168.1.10:4447\";}
	else {return \"DIRECT\";}
}" >> /www/wpad.dat
rm /tmp/domains

/etc/wpad/domains.blacklist: сюда добавляем (в столбик) любые сайты, которые вы хотите посещать через Tor.

Делаем скрипт исполняемым:

chmod +x /etc/wpad/generate.sh

Настраиваем запуск скрипта ежедневно в 6 утра:

echo "0 6 * * * /etc/wpad/generate.sh" >> /etc/crontabs/root

Готовый файл автонастройки прокси будет лежать в /www/wpad.dat и при настройках веб-сервера по умолчанию доступен по http://192.168.1.1/wpad.dat

Осталось прописать в настольных и мобильных браузерах использование http://192.168.1.1/wpad.dat в качестве автонастройки прокси (PAC). В настольных и мобильных Firefox для этого достаточно изменить три настройки в about:config:

network.proxy.type 2
network.proxy.socks_remote_dns true
network.proxy.autoconfig_url http://192.168.1.1/wpad.dat

Инструкции для других браузеров и мобильных ОС можно найти здесь.

После этого на сайты из Реестра + на сайты из domains.blacklist + на все сайты в домене .onion браузер будет ходить через Tor, а на сайты .i2p и .b32 (Base32 hostnames) — через I2P.

Можно автоматически выдавать настройки прокси клиентам, чтобы не приходилось вручную настраивать браузеры. DHCP для этой цели использовать не рекомендуется, поскольку Mac OS и Firefox (до версии 63) проигнорируют соответствующую директиву. Лучше воспользоваться DNS-сервером (в OpenWrt/LEDE это dnsmasq). Для этого нужно добавить в файл /etc/config/dhcp следующую секцию:

config 'domain'
    option 'name' 'wpad'
    option 'ip' '192.168.1.1'

Кроме того, возможно, потребуется указать веб-серверу, что файлы .dat должны отдаваться с MIME-типом application/x-ns-proxy-autoconfig. Предустановленный в OpenWrt/LEDE веб-сервер uhttpd, уже поддерживает необходимые MIME-типы для файлов .pac и wpad.dat.

Обратите внимание, что автоматическое определение настроек сети вообще небезопасно и лучше его отключить во всех браузерах, при этом, жёстко задав в настройках браузеров путь к wpad.dat.

Если вы настраивали uhttpd (предустановленный в OpenWrt/LEDE веб-сервер) на работу по протоколу https (при этом используется самоподписанный сертификат) и указали браузерам брать файл автонастройки с https://192.168.1.1/wpad.dat, то необходимо сперва добавить ваш самоподписанный сертификат в доверенные в каждом браузере. Либо убедиться, что веб-сервер может отдавать файлы по незащищённому http:

  • в файле /etc/config/uhttpd должна присутствовать опция list listen_http
  • опция redirect_https должна иметь значение '0'

В случае успешной настройки (не забудьте перезагрузить роутер для применения изменений), файл автоматической настройки сети должен быть доступен по адресу http://wpad/wpad.dat.

@dartraiden
Copy link
Author

dartraiden commented Oct 16, 2019

Если нужен выборочный обход блокировок (только сайты, которые требуются лично вам), то читаем тут.

@rusnino
Copy link

rusnino commented Jul 24, 2022

Привет. Что сейчас может быть использовано вместо https://api.antizapret.info ?

Edit: я посмотрел в репо Antizapret, они уже сами забирают таблицу из другого места в скрипте doall.sh, curl --compress -o list_cp1251.xml https://raw.githubusercontent.com/zapret-info/z-i/master/dump.csv

В общем, эту инструкцию адаптировать бы к современным реалиям. Если у меня самого что-то получится, я напишу.

@giantplaceholder
Copy link

Если нужен выборочный обход блокировок (только сайты, которые требуются лично вам), то читаем тут.

А не сохранилось ли копии? С 4pda всё похерили с недавней чисткой, в веб-архиве пусто.

@dartraiden
Copy link
Author

Архив Интернета спасёт гиганта мысли.

@giantplaceholder
Copy link

Архив Интернета спасёт гиганта мысли.

А это не совсем тот мануал -- речь про обход через Tor. Оно очень удобно было для того чтобы заворачивать в него эндпойнты, скажем, DoH и прочих TMDB. Изначальный пост был тут: https://4pda.ru/forum/index.php?showtopic=911457&view=findpost&p=89883489

@dartraiden
Copy link
Author

dartraiden commented Feb 19, 2024

А luci-app-pbr не поможет? Оно же создано натурально для того, чтобы гнать трафик до определенных адресов/доменов/подсетей через выбранный интерфейс.

@giantplaceholder
Copy link

А luci-app-pbr не поможет? Оно же создано натурально для того, чтобы гнать трафик до определенных адресов/доменов/подсетей через выбранный интерфейс.

Tor не поднимает своего интерфейса, он поднимает порт, вот в чем дело.

@dartraiden
Copy link
Author

dartraiden commented Feb 19, 2024

Ну, тор оно как-то поддерживает.

Tor tunnels supported in nft mode only (interface name must match tor).

https://docs.openwrt.melmac.net/pbr/#GatewaysTunnels

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment