Список основных портов для TCP/UDP
UDP - 53, 123 лучше через forward не выпускать. Для локалки должен быть свой DNS и NTP
- 53 - DNS
- 123 - NTP
- 443 - QUIC protocol
TCP
- 80, 443 - HTTP/HTTPS
- 25, 110, 143, 465, 587, 995, 993,- MAIL
- 3389 - Remote Desktop Protocol (RDP)
# Просмотр правил отдельных цепочек input or forward
- Код: выделить все
/ip firewall filter print where chain=input
/ip firewall filter print where chain=forward
/ip firewall nat print
Удаление правил
- Код: выделить все
/ip firewall filter remove [find dynamic=no]
/ip firewall nat remove [find dynamic=no]
/ip firewall raw remove [find dynamic=no]
/ip firewall mangle remove [find dynamic=no]
/ip firewall address-list remove [find dynamic=no]
/ip firewall layer7-protocol remove [find dynamic=no]
/ip firewall connection remove [find dynamic=no]
Состояния пакетов
Существуют четыре состояния пакетов:
- new — новый пакет, не принадлежащий ни одному из известных потоков. Это может быть первый пакет для коннекта к серверу RDP, или первый пакет в потоке WinBox, или запрос к DNS. Система запоминает Source IP, Source Port, Destination IP, Destination Port и некоторые другие параметры и записывает эти данные в таблицу. Следующий пакет с такими же данными будет относиться к записанному потоку;
- established — пакет, принадлежащий существующему потоку. То есть пакет, у которого Source IP, Source Port, Destination IP, Destination Port подходят под одну из записей таблицы ConnTrack (или обратный пакет);
- related — пакет, порожденный другим потоком. Некоторые протоколы, такие как FTP, SIP, PPTP, используют для работы несколько потоков. Например, управляющие команды FTP ходят по порту TCP 21, но данные передаются с порта TCP 20. При попытке получения или отправки данных на FTP в потоке на порт 21 сервер сообщает: «А сейчас я открою 20-й порт, и ты забирай данные с него», после этого клиент посылает пакет на 20-й порт сервера. Этот пакет будет считаться related, так как он порожден потоком 21-го порта;
- invalid — все, что не относится к перечисленным выше состояниям. Пример: сессия корректно закрылась, но из-за ошибок маршрутизации часть пакетов из середины сессии улетела другим путем. Когда они пришли, их сессия уже закрыта и роутер о них ничего не знает. Они не new и не относятся к существующим соединениям, поэтому считаем их invalid.
Пример базовой настройки firewall с пользовательскими цепочками
В данном варианте используется конфигурация из 19 правил, 5 адресных списков, так же используются следующие пользовательские цепочки:
- FWD — Разрешающая цепочка, проходящего трафика через роутер, принадлежащего активным соединениям Established/Related и отбрасывание трафика Invalid
- FWD_ALLOW — Разрешающая цепочка, проходящего трафика по отдельным портам через роутер, который только собирается устанавливать соединение
- WAN_INPUT — Разрешающая цепочка, адресованного роутеру трафика, принадлежащего активным соединениям Established/Related и отбрасывание трафика Invalid
- WAN_INPUT_ALLOW — Разрешающая цепочка, адресованного роутеру трафика по отдельным портам, который только собирается устанавливать соединение
- Код: выделить все
/ip firewall address-list
add address=10.10.10.0/24 list=LAN_NET
add address=195.0.1.3 list=admin
add address=195.0.1.0/24 list=WAN_NET
add address=195.0.1.14 list=WAN_IP
add address=10.10.10.254 list=LAN_IP
/ip firewall connection tracking
set tcp-established-timeout=1h
/ip firewall filter
add action=jump chain=forward comment="FWD for State Established/Related" connection-state=established,related \
jump-target=FWD
add action=jump chain=forward comment="FWD_ALLOW For State NEW" connection-state=new jump-target=FWD_ALLOW
add action=jump chain=input comment="WAN_INPUT For State Established/Related" connection-state=established,related \
in-interface-list=WAN_IF jump-target=WAN_INPUT
add action=jump chain=input comment="WAN_INPUT For State Invalid" connection-state=invalid disabled=yes \
in-interface-list=WAN_IF jump-target=WAN_INPUT
add action=jump chain=input comment="WAN_INPUT_ALLOW For State NEW" connection-state=new in-interface-list=WAN_IF \
jump-target=WAN_INPUT_ALLOW
add action=accept chain=FWD comment="Allow Established/Related Connections" connection-state=established,related \
in-interface-list=LAN_IF out-interface-list=WAN_IF
add action=drop chain=FWD comment="Drop Invalid Forward" connection-state=invalid in-interface-list=WAN_IF
add action=return chain=FWD
add action=accept chain=FWD_ALLOW comment="Allow HTTP & HTTPS from LAN" connection-state=new dst-port=80,443 \
in-interface-list=LAN_IF out-interface-list=WAN_IF protocol=tcp
add action=accept chain=FWD_ALLOW comment="Allow QUIC traffic from LAN" connection-state=new dst-port=443 \
in-interface-list=LAN_IF out-interface-list=WAN_IF protocol=udp
add action=drop chain=FWD_ALLOW comment="Drop All Forward from LAN to WAN" in-interface-list=LAN_IF \
out-interface-list=WAN_IF
add action=drop chain=FWD_ALLOW comment="Drop All Forward (not sourced NAT)" connection-nat-state=!dstnat
add action=drop chain=FWD_ALLOW comment="Drop New Connections from WAN to LAN" connection-nat-state=!dstnat \
connection-state=new
add action=accept chain=WAN_INPUT comment="Allow Established/Related Connections" connection-state=\
established,related in-interface-list=WAN_IF
add action=drop chain=WAN_INPUT comment="Drop Invalid Input" connection-state=invalid in-interface-list=WAN_IF
add action=return chain=WAN_INPUT
add action=accept chain=WAN_INPUT_ALLOW comment="Allow SSH/WinBox Admin Access" dst-port=22,8291 in-interface-list=\
WAN_IF protocol=tcp src-address-list=admin
add action=add-src-to-address-list address-list="dns flood" address-list-timeout=1h chain=WAN_INPUT_ALLOW comment=\
"Rate Limit DNS Requests from WAN" connection-state=new dst-port=53 in-interface-list=WAN_IF protocol=udp \
src-address-list=!LAN_NET
add action=drop chain=WAN_INPUT_ALLOW comment="Drop excessive DNS Requests from WAN" connection-state=new dst-port=53 \
in-interface-list=WAN_IF protocol=udp src-address-list="dns flood"
add action=accept chain=WAN_INPUT_ALLOW comment="ICMP Rate Limit to 128 bytes" connection-rate=0-128k \
in-interface-list=WAN_IF packet-size=0-128 protocol=icmp
add action=drop chain=WAN_INPUT_ALLOW comment="Drop All Other Input" in-interface-list=WAN_IF src-address-list=\
!LAN_NET
Найти подходящую цепочку и обработать с помощью её правил трафика значительно проще чем прогонять весь трафик через множество правил. Сначала обрабатываем транзитный трафик. Поскольку в нём львиная доля будет принадлежать установленным соединениям, то и разрешаем его не отходя от кассы, а заодно убиваем некорректный трафик, и возвращаемся обратно в цепочку forward. Далее проваливаемся в цепочку FWD_ALLOW для разрешения трафика с состоянием NEW, в конце убиваем весь не попавший под правила трафик.
Такие же действия проделываем с цепочками относящимися к input
Отключаем ненужные нам service-port
- Код: выделить все
/ip firewall service-port
set tftp disabled=yes
set h323 disabled=yes
set sip disabled=yes
set pptp disabled=yes
SRC-NAT
Теперь настроем трансляцию сетевых адресов nat. Поскольку на внешнем интерфейсе статический IP, то нет необходимости организовывать nat с помощью masquerade, а следовательно правильным выбором в данной ситуации будет src-nat.
- Код: выделить все
/ip firewall nat
add action=src-nat chain=srcnat out-interface-list=WAN_IF src-address-list=LAN_NET to-addresses=195.0.1.14
Сокращаем время жизни соединений
Проверяем текущие значения параметров connection tracking:
- Код: выделить все
/ip firewall/connection/tracking/print
Нас интересует значение параметра tcp-established-timeout которое по умолчанию равно 24 часа. Сокращаем время жизни соединений до 1 часа:
- Код: выделить все
/ip firewall/connection/tracking/set tcp-established-timeout=1h