Поиск по тегу #rextended firewall raw rules Добавлено 2021-07-06: по сравнению с версией 2014 года я добавил много нового. Пока не закончил, добавляю ещё, когда есть время. РАБОТА В ПРОЦЕССЕ. Буду признателен за любые предложения и, конечно, за позитивные комментарии, если такие будут... Спасибо BartoszP, я обновляю правила, когда могу
Если в файрволе поставить одно правило по умолчанию: add action=drop connection-state=invalid, это на самом деле не блокирует никакие вредоносные соединения или пакеты. Правило drop invalid просто сбрасывает любой пакет или соединение, если не найдено соответствия в “connection tracking”. Следующие правила, наоборот, блокируют все поддельные или некорректные пакеты.
Эти правила основаны на том, как TCP и UDP пакеты должны быть оформлены, чтобы соответствовать RFC. Любые комментарии типа «UDP порт 0 используется некоторыми балансировщиками нагрузки» не важны, они не следуют RFC и не используются MikroTik.
boen_robot объясняет подробнее:
Эти правила должны быть установлены в “/firewall raw”, чтобы они не мешали работе обычных стандартных правил “/firewall filter”.
Внимание: эти правила не заменяют, а должны использоваться как минимум вместе с дефолтными правилами “/firewall filter”.
/ip firewall raw
add action=drop chain=prerouting comment="TCP invalid combination of flags attack (7 rules)" protocol=tcp tcp-flags=!fin,!syn,!rst,!ack
add action=drop chain=prerouting protocol=tcp tcp-flags=fin,syn
add action=drop chain=prerouting protocol=tcp tcp-flags=fin,rst
add action=drop chain=prerouting protocol=tcp tcp-flags=fin,!ack
add action=drop chain=prerouting protocol=tcp tcp-flags=fin,urg
add action=drop chain=prerouting protocol=tcp tcp-flags=syn,rst
add action=drop chain=prerouting protocol=tcp tcp-flags=rst,urg
add action=drop chain=prerouting comment="TCP Port 0 attack (2 rules)" protocol=tcp src-port=0
add action=drop chain=prerouting dst-port=0 protocol=tcp
add action=drop chain=prerouting comment="UDP Port 0 attack (2 rules)" protocol=udp src-port=0
add action=drop chain=prerouting dst-port=0 protocol=udp
Почему “drop” лучше, чем тратить CPU и создавать бесполезный трафик с “reject”?
Ещё раз спасибо boen_robot за объяснение:
SYN-фрагментированная атака
/ip firewall raw
add action=drop chain=prerouting comment="SYN fragmented attack" fragment=yes protocol=tcp tcp-flags=syn
Защищённая зона (против Teardrop Attack и других)
Некоторые виды атак используют фрагментацию IP-пакетов. Но фрагментация пакетов может быть нужна и легитимна. Чтобы создать «защищённые зоны» от фрагментированных IP-атак, можно использовать одно или оба варианта:
Создать список интерфейсов, которые нужно защитить:
/interface list
add name=fragment_protected_interface
/ip firewall raw
add action=drop chain=prerouting comment="Fragment attack Interface Protection" fragment=yes in-interface-list=fragment_protected_interface
Создать список адресов IP, которые нужно защитить:
/ip firewall address-list
add address=2.3.4.5 list=fragment_protected_IP
/ip firewall raw
add action=drop chain=prerouting comment="Fragment attack IP Protection" fragment=yes dst-address-list=fragment_protected_IP
Атаки с IP-опциями
Атаки, использующие редко применяемые (или неправильно используемые) IPv4 флаговые опции.
/ip firewall raw
add action=drop chain=prerouting comment="IP option loose-source-routing" ipv4-options=loose-source-routing
add action=drop chain=prerouting comment="IP option strict-source-routing" ipv4-options=strict-source-routing
add action=drop chain=prerouting comment="IP option record-route" ipv4-options=record-route
add action=drop chain=prerouting comment="IP option router-alert" ipv4-options=router-alert
add action=drop chain=prerouting comment="IP option timestamp" ipv4-options=timestamp
add action=drop chain=prerouting comment="IP options left, except IP Stream used by the IGMP protocol" ipv4-options=any protocol=!igmp
Защита от IP-спуфинга (предотвращение LAND Attack и других)
Все провайдеры должны это делать, и тогда 95% DDoS-атак просто не существовали бы...
В стандартной конфигурации есть два списка интерфейсов — для WAN и LAN:
/interface list
add name=WAN
add name=LAN
Определяем один или несколько списков IP-адресов, используемых на локальной стороне сети (может включать и публичные IP):
/ip firewall address-list
add address=192.168.88.0/24 list=IP_used_on_LAN
Мы не ожидаем входящие внутренние IP с WAN или с LAN, которые не включены в IP_used_on_LAN
/ip firewall raw
add action=drop chain=prerouting comment="IP Spoofing protection from WAN" in-interface-list=WAN src-address-list=IP_used_on_LAN
add action=drop chain=prerouting comment="IP Spoofing protection from LAN" in-interface-list=LAN src-address-list=!IP_used_on_LAN \
src-address=!0.0.0.0 dst-address=!255.255.255.255
src-address=!0.0.0.0 и dst-address=!255.255.255.255 нужны, чтобы не блокировать сервисы в LAN, например DHCP-сервер (src 0.0.0.0 → dst 255.255.255.255).
Неиспользуемые протоколы
Удалить неприсвоенные протоколы сложно, потому что в поле protocol можно указать только одно число, а не диапазон.
Протоколы с номерами от 144 до 255 не назначены
Но на практике не все эти 144 протокола используются, или в 95% случаев — только ICMP (1), TCP (6) и UDP (17).
Нельзя поставить правило типа drop protocol=144-255, потому что это не поддерживается, поэтому принимаем все нужные протоколы и сбрасываем остальные. Эти правила должны идти В КОНЦЕ!!!
/ip firewall raw
add action=accept chain=prerouting protocol=icmp
add action=accept chain=prerouting protocol=igmp
add action=accept chain=prerouting protocol=tcp
add action=accept chain=prerouting protocol=udp
add action=accept chain=prerouting protocol=gre
add action=log chain=prerouting log-prefix="Not TCP protocol" protocol=!tcp
add action=drop chain=prerouting comment="Unused protocol protection" disabled=yes protocol=!tcp
Последнее правило отключено специально — сначала добавьте все используемые протоколы (например, 47 GRE для pptp, EoIP и т.п.) и только потом включайте его.
Новые TCP-соединения без SYN
Новое TCP-соединение должно начинаться с пакета с флагом SYN.
Если в первом пакете нет SYN — это точно атака или сканирование...
Каждое из правил должно идти первым в /ip firewall filter в соответствующей цепочке input и forward. В raw это не работает, потому что там нужен connection-tracking.
/ip firewall filter
add action=drop chain=input connection-state=new protocol=tcp tcp-flags=!syn comment="TCP non SYN scan attack input"
add action=drop chain=forward connection-state=new protocol=tcp tcp-flags=!syn comment="TCP non SYN scan attack forward"
Если кто-то найдёт баг — пожалуйста, сообщите. Спасибо.
Если в файрволе поставить одно правило по умолчанию: add action=drop connection-state=invalid, это на самом деле не блокирует никакие вредоносные соединения или пакеты. Правило drop invalid просто сбрасывает любой пакет или соединение, если не найдено соответствия в “connection tracking”. Следующие правила, наоборот, блокируют все поддельные или некорректные пакеты.
Эти правила основаны на том, как TCP и UDP пакеты должны быть оформлены, чтобы соответствовать RFC. Любые комментарии типа «UDP порт 0 используется некоторыми балансировщиками нагрузки» не важны, они не следуют RFC и не используются MikroTik.
boen_robot объясняет подробнее:
Эти правила должны быть установлены в “/firewall raw”, чтобы они не мешали работе обычных стандартных правил “/firewall filter”.
Внимание: эти правила не заменяют, а должны использоваться как минимум вместе с дефолтными правилами “/firewall filter”.
/ip firewall raw
add action=drop chain=prerouting comment="TCP invalid combination of flags attack (7 rules)" protocol=tcp tcp-flags=!fin,!syn,!rst,!ack
add action=drop chain=prerouting protocol=tcp tcp-flags=fin,syn
add action=drop chain=prerouting protocol=tcp tcp-flags=fin,rst
add action=drop chain=prerouting protocol=tcp tcp-flags=fin,!ack
add action=drop chain=prerouting protocol=tcp tcp-flags=fin,urg
add action=drop chain=prerouting protocol=tcp tcp-flags=syn,rst
add action=drop chain=prerouting protocol=tcp tcp-flags=rst,urg
add action=drop chain=prerouting comment="TCP Port 0 attack (2 rules)" protocol=tcp src-port=0
add action=drop chain=prerouting dst-port=0 protocol=tcp
add action=drop chain=prerouting comment="UDP Port 0 attack (2 rules)" protocol=udp src-port=0
add action=drop chain=prerouting dst-port=0 protocol=udp
Почему “drop” лучше, чем тратить CPU и создавать бесполезный трафик с “reject”?
Ещё раз спасибо boen_robot за объяснение:
SYN-фрагментированная атака
/ip firewall raw
add action=drop chain=prerouting comment="SYN fragmented attack" fragment=yes protocol=tcp tcp-flags=syn
Защищённая зона (против Teardrop Attack и других)
Некоторые виды атак используют фрагментацию IP-пакетов. Но фрагментация пакетов может быть нужна и легитимна. Чтобы создать «защищённые зоны» от фрагментированных IP-атак, можно использовать одно или оба варианта:
Создать список интерфейсов, которые нужно защитить:
/interface list
add name=fragment_protected_interface
/ip firewall raw
add action=drop chain=prerouting comment="Fragment attack Interface Protection" fragment=yes in-interface-list=fragment_protected_interface
Создать список адресов IP, которые нужно защитить:
/ip firewall address-list
add address=2.3.4.5 list=fragment_protected_IP
/ip firewall raw
add action=drop chain=prerouting comment="Fragment attack IP Protection" fragment=yes dst-address-list=fragment_protected_IP
Атаки с IP-опциями
Атаки, использующие редко применяемые (или неправильно используемые) IPv4 флаговые опции.
/ip firewall raw
add action=drop chain=prerouting comment="IP option loose-source-routing" ipv4-options=loose-source-routing
add action=drop chain=prerouting comment="IP option strict-source-routing" ipv4-options=strict-source-routing
add action=drop chain=prerouting comment="IP option record-route" ipv4-options=record-route
add action=drop chain=prerouting comment="IP option router-alert" ipv4-options=router-alert
add action=drop chain=prerouting comment="IP option timestamp" ipv4-options=timestamp
add action=drop chain=prerouting comment="IP options left, except IP Stream used by the IGMP protocol" ipv4-options=any protocol=!igmp
Защита от IP-спуфинга (предотвращение LAND Attack и других)
Все провайдеры должны это делать, и тогда 95% DDoS-атак просто не существовали бы...
В стандартной конфигурации есть два списка интерфейсов — для WAN и LAN:
/interface list
add name=WAN
add name=LAN
Определяем один или несколько списков IP-адресов, используемых на локальной стороне сети (может включать и публичные IP):
/ip firewall address-list
add address=192.168.88.0/24 list=IP_used_on_LAN
Мы не ожидаем входящие внутренние IP с WAN или с LAN, которые не включены в IP_used_on_LAN
/ip firewall raw
add action=drop chain=prerouting comment="IP Spoofing protection from WAN" in-interface-list=WAN src-address-list=IP_used_on_LAN
add action=drop chain=prerouting comment="IP Spoofing protection from LAN" in-interface-list=LAN src-address-list=!IP_used_on_LAN \
src-address=!0.0.0.0 dst-address=!255.255.255.255
src-address=!0.0.0.0 и dst-address=!255.255.255.255 нужны, чтобы не блокировать сервисы в LAN, например DHCP-сервер (src 0.0.0.0 → dst 255.255.255.255).
Неиспользуемые протоколы
Удалить неприсвоенные протоколы сложно, потому что в поле protocol можно указать только одно число, а не диапазон.
Протоколы с номерами от 144 до 255 не назначены
Но на практике не все эти 144 протокола используются, или в 95% случаев — только ICMP (1), TCP (6) и UDP (17).
Нельзя поставить правило типа drop protocol=144-255, потому что это не поддерживается, поэтому принимаем все нужные протоколы и сбрасываем остальные. Эти правила должны идти В КОНЦЕ!!!
/ip firewall raw
add action=accept chain=prerouting protocol=icmp
add action=accept chain=prerouting protocol=igmp
add action=accept chain=prerouting protocol=tcp
add action=accept chain=prerouting protocol=udp
add action=accept chain=prerouting protocol=gre
add action=log chain=prerouting log-prefix="Not TCP protocol" protocol=!tcp
add action=drop chain=prerouting comment="Unused protocol protection" disabled=yes protocol=!tcp
Последнее правило отключено специально — сначала добавьте все используемые протоколы (например, 47 GRE для pptp, EoIP и т.п.) и только потом включайте его.
Новые TCP-соединения без SYN
Новое TCP-соединение должно начинаться с пакета с флагом SYN.
Если в первом пакете нет SYN — это точно атака или сканирование...
Каждое из правил должно идти первым в /ip firewall filter в соответствующей цепочке input и forward. В raw это не работает, потому что там нужен connection-tracking.
/ip firewall filter
add action=drop chain=input connection-state=new protocol=tcp tcp-flags=!syn comment="TCP non SYN scan attack input"
add action=drop chain=forward connection-state=new protocol=tcp tcp-flags=!syn comment="TCP non SYN scan attack forward"
Если кто-то найдёт баг — пожалуйста, сообщите. Спасибо.
