Разработать реализацию «ядра» фаервола, аналогичного по интерфейсу 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.0
…192.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 использован лишь в качестве примера.
Подумайте, как задавать условия. «Любой адрес» можно обозначить с помощью сетевой маски /0
, один конкретный адрес – c помощью маски /32
. Как задавать порты и протоколы?