Базовая защитная конфигурация Firewall
Firewall MikroTik — полное руководство
Firewall в RouterOS — это первая линия защиты вашего маршрутизатора и сети. В этом руководстве разберём архитектуру цепочек, построим защиту от brute-force атак и настроим правила для типового офиса.
Архитектура Firewall в RouterOS
RouterOS использует три основные цепочки:
- input — трафик, направленный на сам роутер (Winbox, SSH, DNS, ping)
- forward — трафик, проходящий через роутер (из LAN в интернет и обратно)
- output — трафик, исходящий от самого роутера (обновления, NTP, DNS-запросы)
Правила проверяются сверху вниз. Первое совпавшее правило применяется, остальные игнорируются. Порядок критически важен.
Состояния соединений (Connection Tracking)
RouterOS отслеживает состояние каждого соединения:
- established — соединение уже установлено, пакеты идут в обе стороны
- related — связанное соединение (например, FTP data после FTP control)
- new — первый пакет нового соединения
- invalid — пакеты не принадлежащие ни одному известному соединению
Базовый принцип: разрешить established/related, отбросить invalid, контролировать new.
Input chain — защита роутера
[admin@MikroTik] >/ip firewall filter # Разрешить установленные и связанные соединения add chain=input connection-state=established,related action=accept \ comment="Established/Related" # Отбросить невалидные пакеты add chain=input connection-state=invalid action=drop \ comment="Drop invalid" # Разрешить ICMP (ping) с ограничением add chain=input protocol=icmp action=accept \ comment="Allow ICMP" # Разрешить всё из локальной сети add chain=input in-interface-list=LAN action=accept \ comment="Allow from LAN" # Отбросить всё остальное (из WAN) add chain=input action=drop \ comment="Drop all other input"
Forward chain — контроль транзитного трафика
[admin@MikroTik] ># Разрешить установленные add chain=forward connection-state=established,related action=accept # Отбросить невалидные add chain=forward connection-state=invalid action=drop # Разрешить из LAN в интернет add chain=forward in-interface-list=LAN out-interface-list=WAN action=accept \ comment="LAN to WAN" # Разрешить из LAN в LAN (между VLAN, если есть) add chain=forward in-interface-list=LAN out-interface-list=LAN action=accept \ comment="LAN to LAN" # Отбросить всё остальное add chain=forward action=drop \ comment="Drop all other forward"
Защита от brute-force атак
Злоумышленники перебирают пароли SSH и Winbox. Автоматическая блокировка после нескольких неудачных попыток:
[admin@MikroTik] ># Блокировка IP из blacklist add chain=input src-address-list=blacklist action=drop \ comment="Drop blacklisted" # Детекция: 3 попытки за 1 минуту → блокировка на 1 день add chain=input protocol=tcp dst-port=8291,22 \ connection-state=new src-address-list=ssh_stage3 action=add-src-to-address-list \ address-list=blacklist address-list-timeout=1d add chain=input protocol=tcp dst-port=8291,22 \ connection-state=new src-address-list=ssh_stage2 action=add-src-to-address-list \ address-list=ssh_stage3 address-list-timeout=1m add chain=input protocol=tcp dst-port=8291,22 \ connection-state=new src-address-list=ssh_stage1 action=add-src-to-address-list \ address-list=ssh_stage2 address-list-timeout=1m add chain=input protocol=tcp dst-port=8291,22 \ connection-state=new action=add-src-to-address-list \ address-list=ssh_stage1 address-list-timeout=1m
Порт 8291 — Winbox, 22 — SSH. После 3 попыток подключения за минуту IP блокируется на сутки.
Защита от сканирования портов
[admin@MikroTik] >add chain=input protocol=tcp tcp-flags=fin,syn action=drop \ comment="Drop FIN+SYN (scan)" add chain=input protocol=tcp tcp-flags=fin,rst action=drop \ comment="Drop FIN+RST (scan)" add chain=input protocol=tcp tcp-flags=syn,rst action=drop \ comment="Drop SYN+RST (scan)" add chain=input protocol=tcp tcp-flags=fin,psh,urg,!syn,!rst,!ack action=drop \ comment="Drop XMAS scan" add chain=input protocol=tcp tcp-flags=!fin,!syn,!rst,!ack action=drop \ comment="Drop NULL scan"
RAW таблица — защита от DDoS
RAW-правила обрабатываются до Connection Tracking, что снижает нагрузку на CPU при DDoS:
[admin@MikroTik] >/ip firewall raw add chain=prerouting in-interface-list=WAN \ connection-state=invalid action=drop \ comment="RAW: Drop invalid from WAN" add chain=prerouting protocol=tcp tcp-flags=syn \ in-interface-list=WAN connection-state=new \ action=jump jump-target=SYN-flood add chain=SYN-flood limit=100,5:packet action=return add chain=SYN-flood action=drop \ comment="RAW: SYN flood protection"
Проброс портов (dst-nat)
Пример: проброс порта 80 на внутренний веб-сервер 192.168.88.100:
[admin@MikroTik] >/ip firewall nat add chain=dstnat protocol=tcp dst-port=80 \ in-interface=ether1 action=dst-nat to-addresses=192.168.88.100 /ip firewall filter add chain=forward protocol=tcp dst-port=80 \ dst-address=192.168.88.100 action=accept \ comment="Allow forwarded HTTP" \ place-before=*[find comment="Drop all other forward"]
Правило filter нужно поставить выше финального drop в forward chain.
Address Lists — группировка IP-адресов
Address Lists позволяют управлять группами IP без изменения правил:
[admin@MikroTik] ># Создать список доверенных IP /ip firewall address-list add list=trusted address=192.168.88.0/24 add list=trusted address=10.0.0.0/24 # Использовать в правилах /ip firewall filter add chain=input src-address-list=trusted action=accept
Просмотр и диагностика
[admin@MikroTik] ># Список правил со счётчиками /ip firewall filter print stats # Заблокированные IP /ip firewall address-list print where list=blacklist # Connection Tracking /ip firewall connection print # Текущие соединения к роутеру /ip firewall connection print where dst-address~":8291"
Типичные ошибки
- Правило drop стоит выше accept — порядок правил критичен, drop в начале заблокирует всё
- Забыли разрешить established/related — каждая цепочка должна начинаться с accept established,related
- Заблокировали себе доступ — всегда разрешайте input из LAN перед финальным drop
- NAT без forward — проброс порта в NAT не работает без разрешающего правила в forward
- allow-remote-requests без firewall — DNS на роутере доступен из WAN, используется для DNS amplification атак
/ip firewall filter
# Разрешить установленные и связанные соединения
add chain=input connection-state=established,related action=accept \
comment="Established/Related"
# Отбросить невалидные пакеты
add chain=input connection-state=invalid action=drop \
comment="Drop invalid"
# Разрешить ICMP (ping) с ограничением
add chain=input protocol=icmp action=accept \
comment="Allow ICMP"
# Разрешить всё из локальной сети
add chain=input in-interface-list=LAN action=accept \
comment="Allow from LAN"
# Отбросить всё остальное (из WAN)
add chain=input action=drop \
comment="Drop all other input"
# Разрешить установленные
add chain=forward connection-state=established,related action=accept
# Отбросить невалидные
add chain=forward connection-state=invalid action=drop
# Разрешить из LAN в интернет
add chain=forward in-interface-list=LAN out-interface-list=WAN action=accept \
comment="LAN to WAN"
# Разрешить из LAN в LAN (между VLAN, если есть)
add chain=forward in-interface-list=LAN out-interface-list=LAN action=accept \
comment="LAN to LAN"
# Отбросить всё остальное
add chain=forward action=drop \
comment="Drop all other forward"
# Блокировка IP из blacklist
add chain=input src-address-list=blacklist action=drop \
comment="Drop blacklisted"
# Детекция: 3 попытки за 1 минуту → блокировка на 1 день
add chain=input protocol=tcp dst-port=8291,22 \
connection-state=new src-address-list=ssh_stage3 action=add-src-to-address-list \
address-list=blacklist address-list-timeout=1d
add chain=input protocol=tcp dst-port=8291,22 \
connection-state=new src-address-list=ssh_stage2 action=add-src-to-address-list \
address-list=ssh_stage3 address-list-timeout=1m
add chain=input protocol=tcp dst-port=8291,22 \
connection-state=new src-address-list=ssh_stage1 action=add-src-to-address-list \
address-list=ssh_stage2 address-list-timeout=1m
add chain=input protocol=tcp dst-port=8291,22 \
connection-state=new action=add-src-to-address-list \
address-list=ssh_stage1 address-list-timeout=1m
add chain=input protocol=tcp tcp-flags=fin,syn action=drop \
comment="Drop FIN+SYN (scan)"
add chain=input protocol=tcp tcp-flags=fin,rst action=drop \
comment="Drop FIN+RST (scan)"
add chain=input protocol=tcp tcp-flags=syn,rst action=drop \
comment="Drop SYN+RST (scan)"
add chain=input protocol=tcp tcp-flags=fin,psh,urg,!syn,!rst,!ack action=drop \
comment="Drop XMAS scan"
add chain=input protocol=tcp tcp-flags=!fin,!syn,!rst,!ack action=drop \
comment="Drop NULL scan"
/ip firewall raw
add chain=prerouting in-interface-list=WAN \
connection-state=invalid action=drop \
comment="RAW: Drop invalid from WAN"
add chain=prerouting protocol=tcp tcp-flags=syn \
in-interface-list=WAN connection-state=new \
action=jump jump-target=SYN-flood
add chain=SYN-flood limit=100,5:packet action=return
add chain=SYN-flood action=drop \
comment="RAW: SYN flood protection"
/ip firewall nat add chain=dstnat protocol=tcp dst-port=80 \
in-interface=ether1 action=dst-nat to-addresses=192.168.88.100
/ip firewall filter add chain=forward protocol=tcp dst-port=80 \
dst-address=192.168.88.100 action=accept \
comment="Allow forwarded HTTP" \
place-before=*[find comment="Drop all other forward"]
# Создать список доверенных IP
/ip firewall address-list
add list=trusted address=192.168.88.0/24
add list=trusted address=10.0.0.0/24
# Использовать в правилах
/ip firewall filter add chain=input src-address-list=trusted action=accept
# Список правил со счётчиками
/ip firewall filter print stats
# Заблокированные IP
/ip firewall address-list print where list=blacklist
# Connection Tracking
/ip firewall connection print
# Текущие соединения к роутеру
/ip firewall connection print where dst-address~":8291"