Блокировка интернета в МОС-12 при помощи nftables
Эта статья относится только к МОС-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 inet 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 UDP для работы DNS udp dport 53 accept # Разрешаем соединения на этот же компьютер (lo-интерфейс) oif lo accept # Это правило делает reject вместо drop на все остальные соединения # на порт 80 (http) и 443 (https), в результате # браузер не будет ждать загрузки недоступных ресурсов tcp dport 80 reject tcp dport 443 reject } }
Внесите изменения в этот файл по мере необходимости
Если необходимо разрешить обнаруживать локальные сетевые ресурсы при помощи службы Avahi (например, включить ресолвинг имён из домена .local в IP-адреса), необходимо разрешить UDP-запросы на порт 5353. Подробней в статье Avahi.
Для того, чтобы изменения вступили в силу, нужно перезагрузить компьютер или перезапустить поддержку сети:
# systemctl restart nftables
В любой момент вы можете проверить действующие в настоящий момент правила при помощи команды
# nft list ruleset
Отключение блокировки интернета
Чтобы отключить блокировку, можно просто остановить и отключить автозапуск nftables
# systemctl stop nftables # systemctl disable nftables