Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?

Исходные данные: роутер имеет адрес 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|*.b32)\")) {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

This comment has been minimized.

Copy link
Owner Author

@dartraiden dartraiden commented Oct 16, 2019

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.