Блокировка интернета в МОС-12 при помощи nftables

Материал из IT в школе
Перейти к навигацииПерейти к поиску


Эта статья относится только к МОС-12 и неприменима к МОС-10.

Типичной задачей при проведении олимпиад, тестирований, экзаменов и т.д. является ограничение доступа в интернет, оставив доступ к одному или нескольким сайтам. В системе МОС-12 для этого используется служба nftables, в отличие от МОС-10, где используется iptables.

Достоинства использования nftables на рабочих станциях:

  • Готовое решение, не требует установки дополнительного ПО.
  • Не требует наличия маршрутизатора, прокси-сервера и т.д, может быть реализовано в любом компьютерном классе.

Недостатки такого подхода:

  • Фильтрация производится на каждом компьютере, поэтому требуется настройка каждого компьютера (но может быть выполнена скриптами с использованием ssh).
  • Фильтрация производится по IP-адресу, поэтому если разрешается доступ к какому-либо сайту, то будет открыт и доступ ко всем сайтам на том же IP-адресе.
  • Если у сайта изменился IP-адрес, то необходимо обновить правило фильтрации.

Запуск службы

Служба nftables по умолчанию отключена. Она запускается командой

# systemctl start nftables

Чтобы служба запускалась автоматически при старте компьютера выполните команду

# systemctl enable nftables

Конфигурационные файлы

Основным конфигурационным файлом службы является /etc/sysconfig/nftables.conf. По умолчанию он содержит несколько закомментированных строк с директивой include, подключающей другие конфигурационные файлы.

Вы можете вписать приведённые ниже настройки в этот файл или создать отдельный файл, подключаемый из файла nftables.conf при помощи инструкции include.

Чтобы применить новые настройки после изменения конфигурации нужно перезапустить службу:

# systemctl restart nftables

Настройка блокировки интернета

Допустим, мы хотим применить следующие правила.

  • Ограничить доступ к сети интернет только одним сайтом, например, olympiads.ru
  • Также необходимо обеспечить работу службы DNS, чтобы браузер и система могли определить IP-адрес данного сайта. DNS использует порт 53.
  • Снаружи оставим доступ к данному компьютеру по SSH, чтобы сохранить возможность удалённого администрирования. SSH использует порт 22.
  • Также оставим возможность использования протокола ICMP для работы ping, например, чтобы можно было "пинговать" наш компьютер.
  • Разрешим сетевые соединения с этим же компьютером (на loopback-интерфейс), что нужно для работы некоторых приложений.

Определим адрес сайта olympiads.ru при помощи команды host. Обратите внимание, у одного доменного имени может быть несколько IP-адресов (как, например, у google.com), тогда нужно будет добавить все эти IP-адреса в конфиг.

# host olympiads.ru 
olympiads.ru has address 194.58.88.173 
olympiads.ru mail is handled by 10 mf1.nic.ru.

Запишем в файл /etc/sysconfig/nftables.conf следующий текст.

# Эта команда сбрасывает все правила, иначе новые правила будут добавляться к ранее установленным
flush ruleset

table ip filter {
    chain input {
        # Правила обработки входящих пакетов
        # По умолчанию ставим правило drop для пакетов
        type filter hook input priority 0; policy drop;

        # Принимаем пакеты всех установленных соединений
        ct state established,related accept

        # Принимаем пакеты на 22 порт (для управления компьютером по ssh)
        tcp dport 22 accept

        # Принимаем входящий ping
        icmp type echo-request accept

        # Принимаем все пакеты с этого компьютера (на lo-интерфейс)
        iif lo accept
    }

    chain output {
        # Правила обработки исходящих пакетов
        # По умолчанию ставим правило drop для пакетов
        type filter hook output priority 0; policy drop;

        # Разрешаем все установленные соединения
        ct state established,related accept

        # Разрешаем соединения на указанный адрес. Добавляйте аналогичные строки с другими адресами при необходимости
        ip daddr 194.58.88.173 accept

        # Разрешаем соединения на порт 53 для работы DNS
        tcp dport 53 accept
        udp dport 53 accept

        # Разрешаем соединения на этот же компьютер (lo-интерфейс)
        oif lo accept
    }
}

Внесите изменения в этот файл по мере необходимости

Если необходимо разрешить обнаруживать локальные сетевые ресурсы при помощи службы Avahi (например, включить ресолвинг имён из домена .local в IP-адреса), необходимо разрешить UDP-запросы на порт 5353. Подробней в статье Avahi.

Для того, чтобы изменения вступили в силу, нужно перезагрузить компьютер или перезапустить поддержку сети:

# systemctl restart nftables

В любой момент вы можете проверить действующие в настоящий момент правила при помощи команды

# nft list ruleset

Отключение блокировки интернета

Чтобы отключить блокировку, можно просто остановить и отключить автозапуск nftables

# systemctl stop nftables
# systemctl disable nftables