Блокировка рекламы с помощью DNSCrypt + скрипт конвертации файла hosts.

Sorcus

Sorcus. A New Beginning.
Регистрация
10 Июл 2011
Сообщения
513
Реакции
1.002
Выкладываю скрипт для конвертации hosts файла в файл для DNSCrypt (Для просмотра ссылки Войди или Зарегистрируйся).

Создаем файл convert.rb с содержимым из первого спойлера, рядом клядем файл extend.list содержащий доп. домены (например домены, которые не были в списке hosts), создаем файл exclude.list с доменами, которые мы хотим исключить (не будут добавлены в файл domains.list) и запускаем командой:
Код:
ruby ./convert.rb
Код:
require 'net/http'

domains_list = File.new('./domains.list', 'w')
extend_list = File.open('./extend.list', 'r')
exclude_list = File.open('./exclude.list', 'r')

string = Net::HTTP.get(URI('https://raw.githubusercontent.com/StevenBlack/hosts/master/alternates/gambling-porn-social/hosts'))

domains = Array.new
exclude_array = Array.new

# Добавляем найденные домены в массив domains
string.each_line do |line|
   next unless line =~ /^0/
   domains << line.gsub(/[\d|\.]{0,}\s([^\s]{0,})/, '\1')
end

# Добавляем домены из списка extend.list в массив domains
extend_list.to_a.each do |value|
   domains << value.strip
end

# Убираем перенос строки
exclude_list.to_a.each do |value|
   exclude_array << value.strip
end

# Удаляем из массива домены, указанные в exclude.list
domains = domains - exclude_array

# Записываем домены в файл
domains_list.write(domains.uniq.join("\n"))
Код:
c.luxup.ru
show.ctrmanager.com
*runetki.*

Для тех, у кого линукс, пример запуска dnscrypt со списком правил:
Код:
/bin/dnscrypt-proxy --resolver-name=dnscrypt.eu-dk-ipv6 --ephemeral-keys --local-address='[::1]:53' --plugin=libdcplugin_example_ldns_blocking.so,--domains=/etc/domains.list --daemo

--resolver-name - можно взять Для просмотра ссылки Войди или Зарегистрируйся, в колонке 'Name'.
--local-address - оставить как есть для IPv6, либо вписать '127.0.0.1:53' для IPv4
--domains - прописать путь к файлу с доменами.

P.S. DNSCrypt должен быть скомпилирован с плагинами, иначе не будет работать.
Ссылка, используемая в скрипте взята здесь > Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование:
Браво! Отличную темку поднял @Sorcus!
Как раз недавно думал, как бы к безопасным семейным и детским DNS было бы не плохо дополнительно гасить необходимо запрещенный контент в разное время, например с переадресацией на фейковую страницу в вк, что ведуться технические работы, а вот про старый добрый hosts я даже и не подумал, т.к. уходил в сложные теоритические методы.
Теперь, под это дело в личную коллекцию можно собирать списки рекламно-обменных хостов, соцсетей и игровых серверов.

Как вариант, можно использовать на разного рода производствах и с хорошей пользой в домашних условиях, затыкая мощно хосты сотрудникам в первом случае и детям в домашних условиях, во втором случае.
Кронт-табы и разрешенные тайминги сделают свое дело. Благо рельсы можно всунуть даже в смартфоны. Хитрые детки вырубают wi-fi и идут через мобильную сеть куда им вздумается уже независимо от домашних роутеров. Прямо бесило до огня белого цвета.
Интересно, наверное, андроид и ios придется рутовать?!.
 
В связи с последним апдейтом DNSCrypt выкладываю новую версию конвертера hosts.
Код:
require 'net/http'

hosts_file = Net::HTTP.get(URI('https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts'))

domains = Array.new
white_domains = Array.new
black_domains = Array.new
blocked_domains = Array.new

# Парсим hosts
hosts_file.each_line do |line|
        next if line =~ /^\#/
        next if line =~ /^\n/
        next unless line =~ /^0/
        black_domains << line.strip.gsub(/^[^\s]{0,}\s(.*)/, '\1')
end

# Парсим black.list
File.open('./black.list', 'r').each_line do |line|
        next if line =~ /^\#/
        next if line =~ /^\n/
        black_domains << line.strip
end

# Парсим white.list
File.open('./white.list', 'r').each_line do |line|
        next if line =~ /^\#/
        next if line =~ /^\n/
        white_domains << line.strip
end

# Парсим dnscrypt.log
File.open('/var/log/dnscrypt.log', 'r').each_line do |line|
        domains << line.strip.gsub(/^[\w\:\s]{20,25}\s([^\s]{0,}).*/, '\1')
end

# Парсим dnscrypt.blocked.log
File.open('/var/log/dnscrypt.blocked.log', 'r').each_line do |line|
        blocked_domains << line.strip.gsub(/^[\w\:\s]{20,25}\s([^\s]{0,}).*/, '\1')
end

# Убираем из black_domains домены, находящиеся в white_domains
black_domains = black_domains.uniq - white_domains.uniq

# Показываем кол-во заблокированных доменов
puts "Black domains count: #{black_domains.uniq.count}"

# Записываем домены из black_domains в /etc/domains.list
File.new('./.domains.list.tmp', 'w').write(black_domains.sort.join("\n"))
system("sudo mv ./.domains.list.tmp /etc/domains.list")

# Записываем список посещенных доменов (исключая заблокированные) в domains.list
domains = domains.uniq - blocked_domains.uniq
File.new('./domains.list', 'w').write(domains.sort.join("\n"))

# Перезапускаем сеть
# Способ перезапуска сети может отличаться
system("sudo systemctl restart wireguard")
В hosts_file можно добавить любой hosts файл из списка, находящегося по адресу Для просмотра ссылки Войди или Зарегистрируйся
По-умолчанию используется список (adware + malware).
./black.list - содержит список доменов, которые не включены в hosts файл.
./white.list - содержит список доменов, которые не должны быть заблокированы.
/etc/domains.list - содержит список уникальных доменов, полученных конкатинацией файлов hosts и black.list
/var/log/dnscrypt.log - список все доменов, которые когда либо резольвились через DNSCrypt.
/var/log/dnscrypt.blocked.log - список доменов, которые были заблокированы с помощью списка /etc/domains.list
Команда для запуска DNSCrypt:
Код:
/bin/dnscrypt-proxy --resolver-name=dnscrypt.eu-dk-ipv6 --ephemeral-keys --local-address='[::1]:53' --plugin=libdcplugin_example_logging.so,/var/log/dnscrypt.
log --plugin=libdcplugin_example_ldns_blocking.so,--domains=/etc/domains.list,--logfile=/var/log/dnscrypt.blocked.log --daemonize
--resolver-name - можно взять Для просмотра ссылки Войди или Зарегистрируйся, в колонке 'Name'.
--local-address - оставить как есть для IPv6, либо вписать '127.0.0.1:53' для IPv4
--domains - прописать путь к файлу с доменами.
DNSCrypt по-умолчанию компилируется с плагинами, но для блокировки по доменам требуется наличие ldns.
Если будут вопросы - обращайтесь :glob:
 
Назад
Сверху