Вопрос или проблема
Я хотел бы заблокировать некоторые веб-сайты, чтобы повысить производительность и избежать отвлечений. Я нашел расширение BlockSite для браузера Brave отличным инструментом, но у него есть один фатальный недостаток — его можно очень легко отключить через панель задач вверху. Мне нужна более надежное решение.
Изначально я использовал метод, описанный здесь, но я обнаружил, что этот метод не имитирует функциональность BlockSite, которая блокирует каждую страницу на Facebook или Twitter (например), а редактирование файла /etc/hosts
блокировало только twitter.com
, а не все страницы, связанные с Twitter (я мог по-прежнему получить доступ, например, к страницам Twitter Джо Байдена или Дональда Трампа)
Каков лучший способ полностью заблокировать определенные веб-сайты на Ubuntu так, чтобы было сложно их разблокировать?
Это не тривиальная задача.
Сколько сайтов, по вашему мнению, могут отвлекать или вредить производительности? Если это всего 2 сайта, то добавление их в /etc/hosts
сработает. 20 – да, это нормально, – но мы приближаемся к тому моменту, когда поддерживать этот список станет труднее. При 200 хостах вы увидите некоторые проблемы с производительностью.
Запуск вашего сервера имен, как предложил Fox, по масштабированию технологии – но довольно сложно поддерживать большой список сайтов. Также вам нужно найти способы предотвратить пользователя от простого указания машины на другой DNS-сервер (или просто включения DNS-over-HTTPS в браузере).
Существуют готовые решения для сети компьютеров – использование маршрутизатора pihole или прокси-сервера Squid с блокировочными списками (поискать Squidguard). Но если у вас только одна машина, работающая через DHCP от домашнего ADSL, реализовать это будет сложно – вам нужно будет запустить сеанс пользователя в отдельном пространстве имён сети без доступа к интернету и подключиться через прокси, работающий где-то еще на том же хосте.
Перейдите на Github bytescout/list-of-procrastination-websites и следуйте действительно простым инструкциям. Работает для Linux и Windows. В частности, в Linux вам нужно будет редактировать /etc/hosts
вместо файла Windows c:\windows\system32\drivers\etc\hosts
. Используйте свой sudo
пароль.
Я согласен с Джастином Солмсом. Я пытался использовать что-то вроде *
, но это не сработало (www.google.com
, www.google.fr
-> www.google.*
). По причинам производительности я понимаю, может быть, есть обходной путь.
В любом случае это было бы неудобно для личного использования. Когда приходит время развлечься, приятно иметь возможность “вернуться” обратно. Я предлагаю скрипт, который должен работать для всех дистрибутивов Linux. Пока hosts
находится в /etc/
.
Этот скрипт только делает копии. Параметр init создает (с запросом, если существует) hosts.prod
(продуктивный) и hosts.div
(развлечение, это на французском, так что давайте скажем отвлечение, чтобы оставаться на английском ^^). Затем он просто перезаписывает hosts
версией div или prod.
#!/usr/bin/env bash
#
# Этот скрипт инвертирует файлы hosts.
# Чтобы находиться в продуктивном режиме или нет.
# -p: продуктивный режим
# -n: непродуктивный режим
# --init: инициализация hosts
PROD_HOSTS=/etc/hosts.prod
DIV_HOSTS=/etc/hosts.div
HOSTS=/etc/hosts
if [ "$1" == "-p" ]; then
echo "Переключение на продуктивный режим"
sudo cp $PROD_HOSTS $HOSTS -f
elif [ "$1" == "-n" ]; then
echo "Переключение на непродуктивный режим"
sudo cp $DIV_HOSTS $HOSTS -f
elif [ "$1" == "--init" ]; then
echo "Инициализация hosts"
sudo cp $HOSTS $DIV_HOSTS -i
sudo cp $HOSTS $PROD_HOSTS -i
sudo echo "# Черный список вэбсайтов" >> $PROD_HOSTS
sudo echo "127.0.0.1 www.example.org" >> $PROD_HOSTS
echo ""
echo "Чтобы обновить свой черный список: `sudo vim /etc/hosts.prod`"
echo "(`vim` или `nano`)"
echo ""
echo "/!\\ Не забудьте запустить этот скрипт после редактирования!"
echo ""
else
echo "Использование: productivity.sh [-p|-n]"
echo " -p: продуктивный режим"
echo " -n: непродуктивный режим"
echo " --init: инициализация hosts"
fi
Я думаю, это самое быстрое решение для реализации:
https://linoxide.com/tools/chomper-command-line-tool-block-website-linux/
Вы также можете использовать что-то вроде CTparental, если предпочитаете что-то с графическим интерфейсом:
https://linoxide.com/linux-how-to/ctparental-parental-control-tool-linux/
этот гид немного устарел, вам нужно будет скачать текущую версию отсюда вместо github:
Вы были на правильном пути с /etc/hosts
, работая непосредственно с разрешением имен хостов. Проблема, как вы указываете, в том, что вы не можете использовать подстановочный знак для всех поддоменов. Для этого вам нужно настроить DNS-сервер. Например, если вы используете BIND, вам сначала нужен будет файл зоны, похожий на следующий:
; /var/named/blackhole.zone
@ IN SOA localhost. localhost. (
2021121301 ; Сразу
7200 ; Обновление
120 ; Повтор
2419200 ; Истечение
3600) ; TTL по умолчанию
A 127.0.0.1
* IN A 127.0.0.1
AAAA ::1
* IN AAAA ::1
Затем вам нужно будет создать конфигурационный файл, содержащий домены, которые вы собираетесь заблокировать:
# /etc/named/blackhole.conf
zone "facebook.com" {type master; file "/var/named/blackhole.zone";};
zone "twitter.com" {type master; file "/var/named/blackhole.zone";};
Где-то в основном конфигурационном файле включите этот файл:
# основная конфигурация, вероятно, /etc/named.conf, но может варьироваться
#...
options {
listen-on { 127.0.0.1; }; # только локальный
forwarders {208.67.222.222; 208.67.220.220;}; # OpenDNS
# ...
}
include "/etc/named/blackhole.conf";
Затем, предполагая, что ваш DNS-сервер настроен на 127.0.0.1
и BIND работает, вы можете выполнить rndc reload
, чтобы занести в черный список все поддомены с подстановочным знаком.
По сути, вы настраиваете пересылающий DNS-сервер с некоторыми собственными (фактическими) авторитетными зонами, которые направляют некоторые имена хостов на localhost вместо их настоящих местоположений.
Ответ или решение
Для блокировки доступа к определенным веб-сайтам на Ubuntu существует несколько методов, каждый из которых имеет свои плюсы и минусы. Ниже представлены наиболее эффективные способы, которые позволят вам улучшить свою продуктивность, а также затруднить разблокировку нежелательных сайтов.
Метод 1: Редактирование файла /etc/hosts
Это один из самых простых способов. Он заключается в редактировании файла /etc/hosts
, чтобы перенаправить нежелательные веб-сайты на локальный адрес. Но стоит отметить, что этот метод не позволяет блокировать все поддомены.
- Откройте терминал.
- Введите команду
sudo nano /etc/hosts
для редактирования файла. - Добавьте строки, как показано ниже (где
example.com
— это доменные имена):127.0.0.1 example.com 127.0.0.1 www.example.com
- Сохраните изменения и закройте редактор.
Этот метод будет работать, но как вы упомянули, он не может блокировать все поддомены (например, subdomain.example.com
).
Метод 2: Настройка локального DNS-сервера
Если вам нужно более гибкое решение, вы можете настроить локальный DNS-сервер, например, BIND, для блокировки доступа к множеству сайтов.
- Установите BIND, введя:
sudo apt install bind9
- Создайте файл зоны для блокировки:
sudo nano /etc/bind/named.conf.local
Добавьте следующие строки:
zone "example.com" { type master; file "/etc/bind/db.example.com"; };
- Создайте файл зоны:
sudo nano /etc/bind/db.example.com
Вставьте следующее содержимое:
$TTL 604800 @ IN SOA ns.example.com. admin.example.com. ( 20230101 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS ns.example.com. @ IN A 127.0.0.1 * IN A 127.0.0.1
- Перезапустите BIND:
sudo systemctl restart bind9
Теперь все запросы к этому домену будут блокироваться, перенаправляя на ваш локальный сервер. Вы можете добавить столько доменов, сколько необходимо.
Метод 3: Использование прокси-сервера
Использование Squid и SquidGuard может быть более мощным решением для блокировки сайтов на уровне прокси.
-
Установите Squid:
sudo apt install squid
-
Установите SquidGuard:
sudo apt install squidguard
-
Настройте SquidGuard, чтобы он мог блокировать определенные сайты, редактируя файл конфигурации:
sudo nano /etc/squidguard/squidGuard.conf
Добавьте свои черные списки.
-
Перезапустите Squid:
sudo systemctl restart squid
Метод 4: Использование специального софта с интерфейсом
Если вы предпочитаете графические интерфейсы и более простые решения, вы можете рассмотреть использование программ, таких как CTparental.
- Установите CTparental:
sudo apt install ctparental
- Запустите настройку через графический интерфейс, следуя инструкциям.
Заключение
Каждый из предложенных методов имеет свои особенности и может быть реализован в зависимости от ваших потребностей. Если вам нужно что-то более надежное и трудное для обхода, рекомендуется использовать локальный DNS-сервер или решение на базе прокси. В любом случае, вы можете комбинировать разные методы для достижения наилучшего результата.