Блокировка рекламы

From DD-WRT Wiki

Jump to: navigation, search

Contents

[edit] Блокировка рекламы во всех сборках, кроме Micro

Этот сценарий, найденный на форумах, включит блокировку рекламы на основе доменных имен через DNS.

Возможно, что скрипт будет работать не на всех устройствах или приведет к сбою маршрутизатора, когда не хватает свободной оперативной памяти.

Просто поместите этот скрипт в автозапуск:

#!/bin/sh
logger WAN up script executing
if test -s /tmp/hosts0
then
        rm /tmp/hosts0
fi

logger Downloading http://www.mvps.org/winhelp2002/hosts.txt
wget -O - http://www.mvps.org/winhelp2002/hosts.txt | grep 0.0.0.0 |
	sed 's/[[:space:]]*#.*$//g;' |
	grep -v localhost | tr ' ' '\t' |
	tr -s '\t' | tr -d '\015' | sort -u >/tmp/hosts0
grep addn-hosts /tmp/dnsmasq.conf ||
	echo "addn-hosts=/tmp/hosts0" >>/tmp/dnsmasq.conf
logger Restarting dnsmasq
killall dnsmasq
dnsmasq --conf-file=/tmp/dnsmasq.conf

... а этот в cron:

0 12 * * * root /tmp/.rc_startup

Включите опции Dnsmasq и Local DNS в группе Dnsmasq вкладки меню Services → Services. Включение дополнительных параметров группы Dnsmasq не требуются.

Убедитесь, что cron включен.

Вы можете поочередно взять этот скрипт. Просто поместите этот скрипт в автозагрузку. Убедитесь, что cron включен. Запись cron генерируется автоматически при запуске.

# --- COPY THE TEXT BELOW TO DD-WRT / ADMINISTRATION / COMMANDS then click SAVE FIREWALL ---
BH_SCRIPT="/tmp/blocking_hosts.sh"
BH_WHITELIST="/tmp/blocking_hosts.whitelist"
logger "Download blocking hosts file and restart dnsmasq ..."
# Create whitelist. The whitelist entries will be removed from the
# hosts files, i.e. blacklist files.
cat > "$BH_WHITELIST" <<EOF
localhost\\.localdomain
local
invalid
whitelist-example\\.com
.*\\.whitelist-example\\.com
EOF
# Create download script.
cat > "$BH_SCRIPT" <<EOF
#!/bin/sh
# Function: clean_hosts_file [file ...]
clean_hosts_file() {
  # The sed script cleans up the file.
  # The awk script groups the hosts by ten items.
  sed -e '/^127.0.0.1/b replace;
          /^0.0.0.0/b replace;
          :drop;
            d; b;
          :replace;
            s/^0.0.0.0[[:space:]]*//;
            s/^127.0.0.1[[:space:]]*//;
            s/[[:space:]]*#.*\$//;
            s/[[:space:]]*\$//;
            s/[[:space:]][[:space:]]*/ /;
            /^localhost\$/b drop;
            /^[[:space:]]*\$/b drop;' \$* | \\
  awk 'BEGIN {
         # Read whitelist file.
         n_whitelist = 0
         while ( getline < "$BH_WHITELIST" ) {
           if ( \$0 == "" ) {
             break
           }
           else {
             a_whitelist[++n_whitelist] = \$0
           }
         }
         close("$BH_WHITELIST")
         # Setup record sparator.
         RS=" +"
         c = 0
       }
       {
         for ( n = 1; \$n != ""; n++ ) {
           # Check whitelist.
           whitelist_flag = 0
           for ( w = 1; w <= n_whitelist; w++ ) {
             if ( \$n ~ ( "^" a_whitelist[w] "\$" ) ) {
               whitelist_flag = 1
               break
             }
           }
           if ( whitelist_flag == 0 ) {
             hosts[++c] = \$n
             if ( c == 10 ) {
               s_hosts = "0.0.0.0"
               for ( i = 1; i <= c; i++ ) {
                 s_hosts = s_hosts " " hosts[i]
               }
               print s_hosts
               c = 0
             }
           }
         }
       }
       END {
        if ( c > 0 ) {
           s_hosts = "0.0.0.0"
           for ( i = 1; i <= c; i++ ) {
             s_hosts = s_hosts = s_hosts " " hosts[i]
           }
           print s_hosts
         }
       }'
}
# Function: wait_for_connection
wait_for_connection() {
  # Wait for an Internet connection.
  # This possibly could take a long time.
  while :; do
    ping -c 1 -w 10 www.freebsd.org > /dev/null 2>&1 && break
    sleep 10
  done
}
# Set lock file.
LOCK_FILE="/tmp/blocking_hosts.lock"
# Check lock file.
if [ ! -f "\$LOCK_FILE" ]; then
  sleep \$((\$\$ % 5 + 5))
  [ -f "\$LOCK_FILE" ] && exit 0
  echo \$\$ > "\$LOCK_FILE"
  # Start downloading files.
  HOSTS_FILE_NUMBER=1
  [ -d "/tmp/blocking_hosts" ] || mkdir "/tmp/blocking_hosts"
  for URL in "http://winhelp2002.mvps.org/hosts.txt" \\
             "http://someonewhocares.org/hosts/zero/hosts" \\
             "http://jansal.googlecode.com/svn/trunk/adblock/hosts" \\
             "http://adblock.gjtech.net/?format=hostfile" \\
             "http://www.hostsfile.org/Downloads/hosts.txt"; do
    HOSTS_FILE="/tmp/blocking_hosts/hosts\`printf '%02d' \$HOSTS_FILE_NUMBER\`"
    logger "Downloading \$URL ..."
    REPEAT=1
    while :; do
      # Wait for internet connection.
      wait_for_connection
      START_TIME=\`date +%s\`
      # Create process to download a hosts file.
      wget -O - "\$URL" 2> /dev/null > "\${HOSTS_FILE}.tmp" &
      WGET_PID=\$!
      WAIT_TIME=\$((\$REPEAT * 10 + 20))
      # Create timeout process.
      ( sleep \$WAIT_TIME; kill -TERM \$WGET_PID ) &
      TIMEOUT_PID=\$!
      wait \$WGET_PID
      CURRENT_RC=\$?
      kill -KILL \$TIMEOUT_PID
      STOP_TIME=\`date +%s\`
      if [ \$CURRENT_RC = 0 ]; then
        clean_hosts_file "\${HOSTS_FILE}.tmp" > "\$HOSTS_FILE"
        rm "\${HOSTS_FILE}.tmp"
        break
      fi
      # In the case of an error: wait the remaining time.
      TIME_SPAN=\$((\$STOP_TIME - \$START_TIME))
      WAIT_TIME=\$((\$WAIT_TIME - \$TIME_SPAN))
      [ \$WAIT_TIME -gt 0 ] && sleep \$WAIT_TIME
      # Increase the number of repeats.
      REPEAT=\$((\$REPEAT + 1))
      [ \$REPEAT = 4 ] && break
    done
    HOSTS_FILE_NUMBER=\$((\$HOSTS_FILE_NUMBER + 1))
  done
  # Inspect downloaded hosts files.
  ANY_FILE_OK=1
  DNSMASQ_PARAM=""
  for HOSTS_FILE in /tmp/blocking_hosts/hosts[0-9][0-9]; do
    if [ -s "\$HOSTS_FILE" ]; then
      ANY_FILE_OK=0
      DNSMASQ_PARAM=\${DNSMASQ_PARAM:+\$DNSMASQ_PARAM }"--addn-hosts=\$HOSTS_FILE"
    else
      rm "\$HOSTS_FILE"
    fi
  done
  if [ \$ANY_FILE_OK = 0 ]; then
    logger "Restarting dnsmasq with additional hosts file(s) ..."
    killall -TERM dnsmasq
    dnsmasq --conf-file=/tmp/dnsmasq.conf \$DNSMASQ_PARAM &
  fi
  rm "\$LOCK_FILE"
fi
EOF
# Make it executeable.
chmod 755 "$BH_SCRIPT"
# Add crontab entry.
grep -q "$BH_SCRIPT" /tmp/crontab || echo "$(($$ % 60)) 3 * * * root $BH_SCRIPT" >>/tmp/crontab
# Execute script in background.
sh "$BH_SCRIPT" &

Возможно добавить доменные имена в белый список. Доменные имена в таком списке - это регулярные выражения. Символ обратной косой черты (\) экранируется символом обратной косой черты.

Вы можете добавить другие URL-адреса в список. Смотрите: Ad-Away-Wiki. Имейте в виду: память маршрутизатора ограничена.

Скрипт работает на устройствах с 32 МБ памяти ОЗУ и НЕ работает с 16 МБ! Для работы на устройствах с 16 МБ памяти ОЗУ удалите в скрипте строку с последней ссылкой для скачивания: http://www.hostsfile.org/Downloads/hosts.txt .

Внимание! Этот скрипт имеет размер около 5 КБ. Хранить его в своем скрипте брандмауэра означает поместить его в память NVRAM маршрутизатора. Проверьте, размер свободной памяти NVRAM в панели управления Status → Router → Space Usage → NVRAM. Если памяти недостаточно, вы должны использовать одну из файловых систем JFFS или SMBFS для удаленного монтирования скрипта, а затем вызывать его из скрипта брандмауэра, хранящегося в NVRAM. При переполнении памяти NVRAM, ожидайте непредсказуемого поведения маршрутизатора.

[edit] Блокировка рекламы в сборке Micro

Сборка Micro не поддерживает файловую систему Journaling Flash File System (JFFS). Из-за этого маршрутизатор может быть настроен блокировать рекламу только временно. Файл hosts можно записать только во временную память, которая теряется при каждой перезагрузке.

Как только маршрутизатор перезагружается (из-за отключения питания или для применения новых настроек), необходимо снова выполнить описанные ниже действия, чтобы снова включить блокировку рекламы.

К сожалению, сборка Micro также не включает большинство утилит командной строки из набора BusyBox, включая функции, которые позволят маршрутизатору автоматически скачивать обновленный файл hosts из скрипта в автозагрузке (например, команду wget), поэтому вы должны сделать это вручную. Наконец, сборка Micro не поддерживает возможность удаленного управления по протоколу SSH, поэтому вы должны передать содержимое файла hosts, вставив его вручную в файл hosts маршрутизатора через окно Telnet, а не загружая его по SSH в маршрутизатор.

[edit] Инструкция

  1. Загрузите последнюю версию файла hosts, содержащего список серверов рекламы, например, с сайта MVPS.org по адресу: http://winhelp2002.mvps.org/hosts.txt
  2. Откройте скачанный текстовый файл hosts в любом текстовом редакторе, например Блокнот, TextEdit, Notepad++ или другом. Выделите весь текст в файле и скопируйте его в буфер обмена.
  3. Перейдите в веб-интерфейс панели управления вашего маршрутизатора через браузер.
  4. В панели управления перейдите на вкладку меню Services → Services.
  5. В группе параметров Dnsmasq включите праметры Dnsmasq и Local DNS. Убедитесь, что остальные параметры в группе выключены.
  6. Подключитесь к интерфейсу Telnet маршрутизатора, используя Putty или другой Telnet-клиент (через порт 23).
  7. Введите свой логин и пароль. Пароль будет таким же, как и для веб-интерфейса панели управления. Вместо имени пользователя сначала попробуйте root. Если это не работает, попробуйте использовать то же имя пользователя, что и для веб-интерфейса.
  8. В командной строке DD-WRT введите killall DNSMasq и нажмите Enter.
  9. Введите pwd и нажмите Enter. Вы должны вернуться в каталог /tmp/root. Введите cd .. и нажмите Enter.
  10. В следующем приглашении введите cat > hosts и нажмите Enter.
  11. Вставьте весь текст из буфера обмена, который вы скопировали ранее из файла hosts.txt (например, в Putty, поместите курсор мыши в нижней части окна Telnet и щелкните правой кнопкой мыши, чтобы вставить).
  12. Примерно через минуту после вставки / передачи текста экран перестанет прокручиваться. Когда это произойдет, завершите файл комбинацией клавиш Ctrl+D.
  13. Введите dnsmasq --conf-file=/tmp/dnsmasq.conf --addn-hosts=/tmp/hosts и нажмите Enter.
  14. Теперь вы закончили. Введите exit и нажмите Enter.
  15. Протестируйте новую конфигурацию. Используйте компьютер или другое устройство, чтобы использовать локальные команды ping или tracert на обычных сайтах (например, google.ru) и заблокированных рекламных сайтах, которые вы добавили в файл hosts. Обычные сайты должны быть доступны и отображать более высокое время при проверке связи, чем заблокированные рекламные сайты из файла hosts (например, 12 мс против менее 1 мс). Команда tracert (или traceroute) должна показывать более длинный путь к обычным сайту, чем к заблокированным рекламным (который должен быть ограничен только одним или двумя прыжками).
  16. Снова, повторите все эти шаги, если ваш маршрутизатор был перезагружен по какой-либо причине.