Блокувальник реклами для будинку на коліні

Історія
Ненажерливий Bind9
Довелося мені пару років тому покинути свій рідний будинок і переїхати в інше місто. У результаті свій самосборный медіа-центр довелося залишити, а на новому місці купити телеприставку AuraHD Plus. Досить не поганий девайс за свої гроші, особливо якщо врахувати, що в ньому вбудовані додатки для доступу до сервісів з фільмами і т. п.
Все б нічого, але реклама там крутиться на кожен чих. Довелося винаходити, як же її "порізати". Перша думка була — підняти свій DNS-сервер і відправляти всі неугодні домени /dev/null на 127.0.0.1. До цього моменту мій домашній серверок повернувся до мене і зайняв своє почесне місце на шафі в якості NAS сервера.
Сказано — зроблено. Піднято Bind9, прописані конфіги для декількох доменів, все відмінно. Летимо.
Через пару тижнів прийшла думка в голову, а чому б не використовувати цей метод для фільтрації реклами для всіх пристроїв будинку? Справа не хитра ж.
Пошук списків з рекламними доменами привів мене до кількох урлам і я взявся їх парсити. Десь на просторах Хабра була стаття, яка допомогла мені з парсингом і написанням сценаріїв для генерації конфіги для Bind9 (спасибі автору, але я не зміг знайти посилання, нехай мене простить).
Все зроблено і прийшов час запускати Bind9. Старт і все відмінно. Крім одного. Цей ненажерливий монстр з'їв всю оперативку і попросив своп. 5 гігабайт пам'яті на 400 тисяч доменів!
По-мучачи таким чином свій бідний на сервер Intel Atom я вирішив, що це не справа.
Міграція на PowerDNS
Погуглити і повивчавши інші варіанти, я прийшов до висновку, що Bind9 не зовсім те, що потрібно. Потрібен більш легкий ресурсів DNS сервер, який зміг би розшукувати таку кількість доменів.
PowerDNS підійшов як не можна до речі, оскільки він вміє сам читати конфіги Bind9 і використовувати їх в роботі. Поставив, налаштував (власне в цьому немає ніякої складності) backend Bind9 запустив.
Результат перевершив всі очікування — 700 MB споживаної пам'яті після 5 гігабайт! Чи це не мрія? Особливо при наявності всього 4 GB в сервері. :)
Кілька місяців так все і пропрацювало, поки я не задумався, що конфіги Bind9 це звичайно добре, але старт PowerDNS якийсь ну зовсім повільний. Час на "всмоктування" всіх доменів до непристойності велика і варто якось оптимізувати цей процес.
З оптимізації залишалося влити тільки всі ці домени з рекламою в MySQL. Це дало б можливість більш гнучко управляти списком доменів, додавати, видаляти, підтримувати свої внутрішні домени.
Закатали рукави і взялися. Виявилося все досить просто — zone2sql вирішує всі проблеми :) Залишалося загорнути все це в доккер і підняти. Зробив досить швидко і без особливих проблем.
Так воно летить уже з півроку вдома і радує. Але сьогодні вийшла стаття на Хабре про блокировщике реклами для смартфонів Samsung і мені запропонували в коментарях видати моє поділився у відкритий доступ.
Що ж, ділюся.
Залежно
docker
Оскільки все це крутиться всередині контейнерів docker, то ця штука нам 100% знадобиться. Всі дії відносяться до Ubuntu Linux, оскільки саме його я використовую вдома і на роботі.
вона Встановлюється згідно документації досить просто:
curl -sSL https://get.docker.com/ | sh

Після завершення роботи скрипта docker буде готовий і ним можна користуватися.
Якщо ви віддаєте перевагу інший метод установки, то завжди можна звернутися до документації та вибрати те, що вам по душі.
docker-compose
Docker Compose призначений для планування і організації процесів у контейнерах Docker (запуску, відключення, створення межконтейнерных з'єднань і томів, тощо).
Установка не складніше самого докера:
curl -L "https://github.com/docker/compose/releases/download/1.8.1/docker-compose-$(uname -s)-$(uname -m)" > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

Запуск власного фільтра реклами
Клонируем репозиторій
Логічне дію і не потребує, напевно, у поясненнях, навіщо це робити. :)
sudo mkdir /opt/docker
sudo chown <user> /opt/docker
git clone https://github.com/DmitriyLyalyuev/powerdns-no-ads /opt/docker/pdns
cd /opt/docker/pdns

Створюємо базу даних
docker-compose up -d mysql

Користувач бази даних
Для доступу до консолі MySQL сервера потрібно виконати:
docker exec -ti pdns_mysql_1 mysql -u root -p

за промовчанням Пароль для користувача root — 12345.
Створюємо користувача і базу:
CREATE USER 'powerdns_user'@'%' IDENTIFIED BY 'powerdns';
GRANT ALL PRIVILEGES ON powerdns.* TO 'powerdns_user'@'%';
CREATE DATABASE powerdns;
exit

Стартуємо DNS сервер
docker-compose up -d

Оновлення списків рекламних доменів
Для оновлення списків запускаємо:
docker exec -ti pdns_pdns_1 bash
cd /etc/powerdns/bind
./getnewlist.sh && ./import.sh && ./clean.sh
exit

White listing
Список для виключення доменів міститься в початку файла /opt/docker/pdns/powerdns-server/bind/getnewlist.sh.
Користуйтеся, експериментуйте і давайте зробимо інтернет чистіше. Хоча б у себе вдома. ;)
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.