Как заблокировать доступ к определённым сайтам на Ubuntu?

Вопрос или проблема

Я хотел бы заблокировать некоторые веб-сайты, чтобы повысить производительность и избежать отвлечений. Я нашел расширение 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:

https://gitlab.com/marsat/CTparental/-/releases

Вы были на правильном пути с /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, чтобы перенаправить нежелательные веб-сайты на локальный адрес. Но стоит отметить, что этот метод не позволяет блокировать все поддомены.

  1. Откройте терминал.
  2. Введите команду sudo nano /etc/hosts для редактирования файла.
  3. Добавьте строки, как показано ниже (где example.com — это доменные имена):
    127.0.0.1 example.com
    127.0.0.1 www.example.com
  4. Сохраните изменения и закройте редактор.

Этот метод будет работать, но как вы упомянули, он не может блокировать все поддомены (например, subdomain.example.com).

Метод 2: Настройка локального DNS-сервера

Если вам нужно более гибкое решение, вы можете настроить локальный DNS-сервер, например, BIND, для блокировки доступа к множеству сайтов.

  1. Установите BIND, введя:
    sudo apt install bind9
  2. Создайте файл зоны для блокировки:
    sudo nano /etc/bind/named.conf.local

    Добавьте следующие строки:

    zone "example.com" {
       type master;
       file "/etc/bind/db.example.com";
    };
  3. Создайте файл зоны:
    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
  4. Перезапустите BIND:
    sudo systemctl restart bind9

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

Метод 3: Использование прокси-сервера

Использование Squid и SquidGuard может быть более мощным решением для блокировки сайтов на уровне прокси.

  1. Установите Squid:

    sudo apt install squid
  2. Установите SquidGuard:

    sudo apt install squidguard
  3. Настройте SquidGuard, чтобы он мог блокировать определенные сайты, редактируя файл конфигурации:

    sudo nano /etc/squidguard/squidGuard.conf

    Добавьте свои черные списки.

  4. Перезапустите Squid:

    sudo systemctl restart squid

Метод 4: Использование специального софта с интерфейсом

Если вы предпочитаете графические интерфейсы и более простые решения, вы можете рассмотреть использование программ, таких как CTparental.

  1. Установите CTparental:
    sudo apt install ctparental
  2. Запустите настройку через графический интерфейс, следуя инструкциям.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...