Задача: сформировать простейший набор правил защитного экрана маршрутизатора "MikroTik".
Предварительная проверка состояния "Firewall".
Прежде всего в обязательном порядке необходимо ознакомиться с действующим набором правил, дабы не навредить уже налаженной работе.
Просматриваем правила основной таблицы "filter", с цепями обработки входящего, транзитного и исходящего трафика:
> /ip firewall filter print
Просматриваем правила таблиц расширенной обработки (здесь мы их не затрагиваем, но для полноты картины знать все пути пакетов необходимо):
> /ip firewall nat print
> /ip firewall mangle print
> /ip firewall mangle print
У каждого правила есть порядковый номер, исчисление которого начинается с нуля. Правила отрабатываются по очереди, в порядке по возрастанию номера. Если потребуется вставить правило перед уже имеющимся - следует использовать опцию "place-before". Важно понимать, что после каждого считывания для просмотра нумерация пересчитывается, и потому порядок место вставки вдруг может оказаться неверным - пакетными такие операции быть не должны.
Задаём простейшую конфигурацию защитного экрана.
Первым правилом разрешаем прохождение входящих и транзитных пакетов в уже установленных соединениях (исключение избыточной аналитики существенно снижает нагрузку на защитный экран):
> /ip firewall filter add action=accept chain=input connection-state=established,related comment="ALLOW ESTABLISHED,RELATED inbound"
> /ip firewall filter add action=accept chain=forward connection-state=established,related comment="ALLOW ESTABLISHED,RELATED forward"
> /ip firewall filter add action=accept chain=forward connection-state=established,related comment="ALLOW ESTABLISHED,RELATED forward"
Обрубаем входящие и транзитные соединения, не укладывающиеся в логику защитного экрана:
> /ip firewall filter add action=drop chain=input connection-state=invalid comment="DROP INVALID inbound"
> /ip firewall filter add action=drop chain=forward connection-state=invalid comment="DROP INVALID forward"
> /ip firewall filter add action=drop chain=forward connection-state=invalid comment="DROP INVALID forward"
Подготовим список IP-подсетей ("bogon-сети"; RFC-1918), которые явно исключены из "зоны интернет" и запросы от их адресов не могут прийти извне на внешний сетевой интерфейс:
> /ip firewall address-list
> add address=0.0.0.0/8 disabled=no list=BOGON
> add address=10.0.0.0/8 disabled=no list=BOGON
> add address=100.64.0.0/10 disabled=no list=BOGON
> add address=127.0.0.0/8 disabled=no list=BOGON
> add address=169.254.0.0/16 disabled=no list=BOGON
> add address=172.16.0.0/12 disabled=no list=BOGON
> add address=192.0.0.0/24 disabled=no list=BOGON
> add address=192.0.2.0/24 disabled=no list=BOGON
> add address=192.88.99.0/24 disabled=no list=BOGON
> add address=192.168.0.0/16 disabled=no list=BOGON
> add address=198.18.0.0/15 disabled=no list=BOGON
> add address=198.51.100.0/24 disabled=no list=BOGON
> add address=203.0.113.0/24 disabled=no list=BOGON
> add address=224.0.0.0/4 disabled=no list=BOGON
> add address=240.0.0.0/4 disabled=no list=BOGON
> add address=0.0.0.0/8 disabled=no list=BOGON
> add address=10.0.0.0/8 disabled=no list=BOGON
> add address=100.64.0.0/10 disabled=no list=BOGON
> add address=127.0.0.0/8 disabled=no list=BOGON
> add address=169.254.0.0/16 disabled=no list=BOGON
> add address=172.16.0.0/12 disabled=no list=BOGON
> add address=192.0.0.0/24 disabled=no list=BOGON
> add address=192.0.2.0/24 disabled=no list=BOGON
> add address=192.88.99.0/24 disabled=no list=BOGON
> add address=192.168.0.0/16 disabled=no list=BOGON
> add address=198.18.0.0/15 disabled=no list=BOGON
> add address=198.51.100.0/24 disabled=no list=BOGON
> add address=203.0.113.0/24 disabled=no list=BOGON
> add address=224.0.0.0/4 disabled=no list=BOGON
> add address=240.0.0.0/4 disabled=no list=BOGON
Одним из первых правил отвергаем запросы от "bogon-сетей", поступающие через WAN-интерфейс:
> /ip firewall filter add action=drop chain=input in-interface=ether1-WAN1 src-address-list=BOGON comment="DROP BOGON"
Разрешаем входящие управляющие соединения SSH и Winbox:
> /ip firewall filter add action=accept chain=input connection-state=new dst-port=22,8291 protocol=tcp comment="ALLOW SSH and Winbox"
Разрешаем прохождение трафика протокола туннелирования GRE, терминированного на маршрутизаторе:
> /ip firewall filter add action=accept chain=input protocol=gre comment="ALLOW GRE protocol"
Разрешаем прохождение трафика протокола туннелирования IPSec-ESP, терминированного на маршрутизаторе:
> /ip firewall filter add action=accept chain=input protocol=ipsec-esp comment="ALLOW IPSec-ESP protocol"
> /ip firewall filter add action=accept chain=input dst-port=500,4500 protocol=udp comment="ALLOW IKE, IPSec-NAT (UDP)"
> /ip firewall filter add action=accept chain=input dst-port=500,4500 protocol=udp comment="ALLOW IKE, IPSec-NAT (UDP)"
Разрешаем прохождение трафика протокола туннелирования L2TP (возможно инкапсулируемого в IPSec-ESP), терминированного на маршрутизаторе:
> /ip firewall filter add action=accept chain=input dst-port=1701 protocol=udp comment="ALLOW L2TP (UDP)"
Разрешаем прохождение управляющего трафика протокола туннелирования PPTP (требуется также разрешение GRE), терминированного на маршрутизаторе:
> /ip firewall filter add action=accept chain=input dst-port=1723 protocol=tcp comment="ALLOW PPTP control (TCP)"
Разрешаем входящие ICMP-запросы:
> /ip firewall filter add action=accept chain=input protocol=icmp comment="ALLOW ICMP"
Опционально разрешаем входящие соединения к DNS-серверу (для дальнейшего DNAT):
> /ip firewall filter add action=accept chain=input dst-address=123.45.67.92 dst-port=53 protocol=tcp comment="ALLOW DNS (TCP) inbound"
> /ip firewall filter add action=accept chain=input dst-address=123.45.67.92 dst-port=53 protocol=udp comment="ALLOW DNS (UDP) inbound"
> /ip firewall filter add action=accept chain=input dst-address=123.45.67.92 dst-port=53 protocol=udp comment="ALLOW DNS (UDP) inbound"
Опционально разрешаем входящие соединения к web-серверу (для дальнейшего DNAT):
> /ip firewall filter add action=accept chain=input dst-address=123.45.67.93 dst-port=80,443 protocol=tcp comment="ALLOW HTTP,HTTPS inbound"
Опционально разрешаем входящие соединения к mail-серверу (для дальнейшего DNAT):
> /ip firewall filter add action=accept chain=input dst-address=123.45.67.93 dst-port=25,465,587,143,993,110,995 protocol=tcp comment="ALLOW SMTP,IMAP,POP3 inbound"
Опционально разрешаем SNMP-мониторинг (ограничив источник запроса опцией "src-address"):
> /ip firewall filter add action=accept chain=input src-address=123.45.67.89 protocol=udp dst-port=161,162 comment="ALLOW SNMP inbound"
Опционально разрешаем трафик, предназначенный для дальнейшего DNAT (например в RDP:3389):
> /ip firewall filter add action=accept chain=input dst-port=38390 protocol=tcp comment="ALLOW RDP inbound"
Удаляем ненужное правило, если это потребуется (где "X" - порядковый номер правила в таблице):
> /ip firewall filter print
> /ip firewall filter remove numbers=X
> /ip firewall filter remove numbers=X
Можно не удалять правило, а деактивировать его - тогда, при необходимости, его можно будет быстро включить в работу без возни с подбором параметров:
> /ip firewall filter disable numbers=X
Финализирующее запретительное правило.
Обращаю внимание, сейчас мы сделаем важный и небезопасный шаг - запретим всё, что не разрешили ранее. Трижды перепроверьте логику обработки входящего трафика и удостоверьтесь, что не зарубите себе вход на устройство, а пользователям доступ к производственным сервисам.
Завершающим правилом блокируем все новые соединения извне (через внешний интерфейс):
> /ip firewall filter add action=drop chain=input connection-state=new in-interface=ether1-WAN1 comment="DROP ALL WAN inbound"
Правила защитного экрана, как и вообще вся конфигурация в "MikroTik" сохраняются автоматически, немедленно после применения.