Блок задач

4. Один класс

Темы
Сложность 5

Задача «Фаервол»

Разработать реализацию «ядра» фаервола, аналогичного по интерфейсу UFW.

На вход фаервола поступает сетевой пакет, состоящий из следующих элементов:

  • Протокол. 8-битное число. В рамках задачи можно ограничиться протоколами TCP, UDP и ICMP.
  • Адрес источника. 32-битное число.
  • Адрес приёмника. По формату аналогичен адресу источника.
  • Порт источника. 16-битное число. Определено для протоколов TCP и UDP.
  • Порт приёмника. По формату аналогичен порту источника.

Фаервол, основываясь на заданной таблице правил, принимает решение: пропустить пакет или отбросить его.

Каждое правило состоит из условий и результата: разрешить или запретить. Фаервол, получив пакет, ищет первое правило, условиям которого будет соответствовать пакет, и принимает решение на основе результата, заданного в правиле.

Правило может содержать одно или более условий, налагаемых на различные элементы пакета, описанные выше. Для проверки адресов используются т.н. маски подсети.

Примеры возможных правил в синтаксисе UFW

allow 53

Разрешает пакеты протокола TCP и UDP с портом приёмника 53.

deny 53/tcp

Запрещает пакеты протокола TCP с портом приёмника 53.

allow from 207.46.232.182

Разрешает все пакеты с адреса 207.46.232.182.

allow from 192.168.1.0/24

Разрешает все пакеты с адресов, удовлетворяющих маске 255.255.255.0. Всего таких адресов 256: 192.168.1.0192.168.1.255.

deny from 192.168.0.1 to any port 22
deny from 192.168.0.7 to any port 22
allow from 192.168.0.0/24 to any port 22 proto tcp

Эти три правила разрешают пакеты с адресов 192.168.0.x (за исключением 192.168.0.1 и 192.168.0.7) по порту приёмника 22 (протокол TCP).

В задание не входит реализация парсера языка правил, формат UFW использован лишь в качестве примера.

Требования к классу

Интерфейс класса Firewall:

  • Добавить правило. Вход: набор условий, результат (разрешить/запретить). Выход: индекс правила в таблице.
  • Удалить правило. Вход: индекс правила.
  • Очистить все правила.
  • Установить режим по умолчанию. Вход: разрешить/запретить. Данный режим используется тогда, когда к пакету не подошло ни одно правило.
  • Проверить пакет. Вход: сетевой пакет. Выход: разрешить/запретить. Использует таблицу и режим по умолчанию, если ни одно из правил таблицы не подошло.

Подумайте, как задавать условия. «Любой адрес» можно обозначить с помощью сетевой маски /0, один конкретный адрес – c помощью маски /32. Как задавать порты и протоколы?