Настройка FireWall на Mikrotik
о FireWall и цепочках
цепочка INPUT
Минимальный набор правил - сделать недоступным из вне внешний интерфейс роутера.
/ip firewall filter add chain=input connection-state=invalid action=drop comment="drop invalid connections" add chain=input connection-state=related action=accept comment="allow related connections" add chain=input connection-state=established action=accept comment="allow established connections" add chain=input action=drop comment="drop everything else" in-interface=ether1-gateway
В последнем правиле мы запрещаем весь входящий трафик на внешнем интрфейсе. Не играйтесь настройками удаленно! Легко лишить себя доступа к роутеру.
Далее, по мере надобности, можно будет помещать разрешающие правила перед последним запрещающим.
Открываем доступ снаружи
1. Добавим правило, разрешающее подключение извне на 8291 port:
Chain: input; Protocol: 6 (tcp); Dst. Port: 8291
2. Перейдем на вкладку Action:
Action: accept.
3. Разместим созданное правило выше запрещающего.
ЗЫ - не забываем неастроить IP → Servises
Нужный доступ должен быть активирован, лишние выключены.
NAT
IP → Firewall - NAT. По-умолчанию, nat уже включен.Это правило «маскарадинга»:
/ip firewall nat add chain=srcnat action=masquerade out-interface=ether1-gateway
Исходящий интерфейс (out-interface) всегда внешний, смотрящий и интернет (или просто в другую сеть, если у вас все непросто). В принципе, минимально этих правил nat и input уже достаточно. Учтите, что если у вас цепочка forward по-умолчанию блокирует все, что возможно, то надо добавить соответствующее правило:
/ip firewall filter add chain=forward out-interface=ether1-gateway
Проброс портов
Предположим, вам надо сделать доступным веб-сервер (tcp/80), запущенный на локальной машине с IP 192.168.88.22.
/ip firewall nat add action=dst-nat chain=dstnat dst-port=80 in-interface=ether1-gateway protocol=tcp to-addresses=192.168.88.22 to-ports=80
Все бы ничего, но скорее всего, у вас включен firewall, который режет все, что не соответствует политике партии. Тогда надо разрешить forward пакетов:
/ip firewall filter add chain=forward protocol=tcp dst-port=80 action=accept
Это правило надо переместить повыше, т.е. ближе к началу списка правил. Перенаправление трафика, адресованного одному ip, на другой ip
Если вам надо все подключения на один ip-адрес переадресовать другому ip-адресу:
/ip firewall nat add action=netmap chain=dstnat protocol=tcp dst-address=192.168.88.3 to-addresses=192.168.4.200
Еще проброс портов
меню /ip firewall nat
/ip firewall nat add chain=dstnat dst-address=172.16.88.67 protocol=tcp dst-port=22 \ action=dst-nat to-address=192.168.88.22 to-ports=86
Ждем и давим, как блох любителей чужого ssh
Если мы не используем ssh для работы с Mikrotik, то нам может быть мало просто отключить ssh в IP → Services. Если мы не пользуемся ssh, значит, любая попытка коннекта по ssh - вражеская!
Следующее правило добавляет IP-адреса источников (action=add-src-to-address-list), которые подключаются к 22 порту, в список ssh_blacklist, на 60 минут. Само это правило ничего не блокирует, просто заносит в черную книжечку:
/ip firewall filter add chain=input protocol=tcp dst-port=22 address-list=ssh_blacklist action=add-src-to-address-list address-list-timeout=60m comment=«record ssh brute forcers» disabled=no log=yes log-prefix=« — SSH ATTEMPT — »
А вот теперь, имея на руках список хулиганов (ssh_blacklist), можно банить им либо только работу с ssh, либо вообще любые действия в сторону нашего микротика:
/ip firewall filter add chain=input protocol=tcp src-address-list=ssh_blacklist action=drop comment=«drop ssh brute forcers»
Правила по отлову и блокированию маньяков надо разместить выше последнего запрещающего правила, иначе ничего не сработает. А еще лучше, если у вас есть открытый VPN или другие сервисы на микроте - оба этих правила поставить самыми первыми, чтобы тех, кто пытался наш ssh открыть, отгородить вообще от всего на нашем роутере, по принципу - если кто-то в одном что-то замышляет, то и в другом он тоже пакость готовит. Главное - не перестараться! Вдруг вы сами случайно забудете об этом правиле и решите с работы посканить роутер nmap-ом, например.
По этому принципу настраивают защиту микротика от брутфорса, но здесь я уже не буду засорять эфир, и так уже нагородил простыню. Настройка с помощью скрипта
Вводить каждое правило firewall с консоли руками очень быстро может надоесть, к тому же готовый скрипт легко сохранить «на память». В открытом WinBox выбираем System → Scripts. В текстовом редакторе готовим скрипт правил, копируем его и жмем Run Script. Потом можно что-то добавить по мелочи, что-то подправить, а может и опять скриптом все…
Приведу пример скрипта настройки firewall:
/ip firewall filter # INPUT add chain=input connection-state=invalid action=drop comment="drop invalid connections" add chain=input connection-state=related action=accept comment="allow related connections" add chain=input connection-state=established action=accept comment="allow established connections" # ext input # local input add chain=input src-address=192.168.88.0/24 action=accept in-interface=!ether1-gateway # drop all other input add chain=input action=drop comment="drop everything else" # OUTPUT add chain=output action=accept out-interface=ether1-gateway comment="accept everything to internet" add chain=output action=accept out-interface=!ether1-gateway comment="accept everything to non internet" add chain=output action=accept comment="accept everything" # FORWARD add chain=forward connection-state=invalid action=drop comment="drop invalid connections" add chain=forward connection-state=established action=accept comment="allow already established connections" add chain=forward connection-state=related action=accept comment="allow related connections" add chain=forward src-address=0.0.0.0/8 action=drop add chain=forward dst-address=0.0.0.0/8 action=drop add chain=forward src-address=127.0.0.0/8 action=drop add chain=forward dst-address=127.0.0.0/8 action=drop add chain=forward src-address=224.0.0.0/3 action=drop add chain=forward dst-address=224.0.0.0/3 action=drop # (1) jumping add chain=forward protocol=tcp action=jump jump-target=tcp add chain=forward protocol=udp action=jump jump-target=udp add chain=forward protocol=icmp action=jump jump-target=icmp # (3) accept forward from local to internet add chain=forward action=accept in-interface=!ether1-gateway out-interface=ether1-gateway comment="accept from local to internet" # (4) drop all other forward add chain=forward action=drop comment="drop everything else" # (2) deny some types common types add chain=tcp protocol=tcp dst-port=69 action=drop comment="deny TFTP" add chain=tcp protocol=tcp dst-port=111 action=drop comment="deny RPC portmapper" add chain=tcp protocol=tcp dst-port=135 action=drop comment="deny RPC portmapper" add chain=tcp protocol=tcp dst-port=137-139 action=drop comment="deny NBT" add chain=tcp protocol=tcp dst-port=445 action=drop comment="deny cifs" add chain=tcp protocol=tcp dst-port=2049 action=drop comment="deny NFS" add chain=tcp protocol=tcp dst-port=12345-12346 action=drop comment="deny NetBus" add chain=tcp protocol=tcp dst-port=20034 action=drop comment="deny NetBus" add chain=tcp protocol=tcp dst-port=3133 action=drop comment="deny BackOriffice" add chain=tcp protocol=tcp dst-port=67-68 action=drop comment="deny DHCP" add chain=udp protocol=udp dst-port=69 action=drop comment="deny TFTP" add chain=udp protocol=udp dst-port=111 action=drop comment="deny PRC portmapper" add chain=udp protocol=udp dst-port=135 action=drop comment="deny PRC portmapper" add chain=udp protocol=udp dst-port=137-139 action=drop comment="deny NBT" add chain=udp protocol=udp dst-port=2049 action=drop comment="deny NFS" add chain=udp protocol=udp dst-port=3133 action=drop comment="deny BackOriffice" add chain=icmp protocol=icmp icmp-options=0:0 action=accept comment="echo reply" add chain=icmp protocol=icmp icmp-options=3:0 action=accept comment="net unreachable" add chain=icmp protocol=icmp icmp-options=3:1 action=accept comment="host unreachable" add chain=icmp protocol=icmp icmp-options=3:4 action=accept comment="host unreachable fragmentation required" add chain=icmp protocol=icmp icmp-options=4:0 action=accept comment="allow source quench" add chain=icmp protocol=icmp icmp-options=8:0 action=accept comment="allow echo request" add chain=icmp protocol=icmp icmp-options=11:0 action=accept comment="allow time exceed" add chain=icmp protocol=icmp icmp-options=12:0 action=accept comment="allow parameter bad" add chain=icmp action=drop comment="deny all other types" # (5) drop all other forward add chain=forward action=drop comment="drop (2) everything else"
Обратите внимание: этот скрипт не привязан к внешнему IP или MAC или чему-то уникальному. Его можно брать и использовать. Если вы ничего не меняли в своем роутере и обновили до версии 6.* после покупки, вам на всякий случай следует проверить название внешнего интерфейса и убедиться, что внутренняя сеть 192.168.88.0/24. И все.
ether1-gateway - внешний интерфейс, первый по счету. Это его имя по-умолчанию. Остальные порты - внутренние.
В секции ext input ничего нет - мне не нужно, чтобы кто-то подключался к роутеру. Если вам необходим удаленный доступ к роутеру, скажем, по ssh, то впишите команду:
add chain=input protocol=tcp dst-port=22 action=accept in-interface=ether1-gateway comment=«allow remote ssh»
В секции OUTPUT хватило бы и последней команды (add chain=output action=accept comment=«accept everything»), но для интереса я немного разделил по исходящим интерфейсам. Теперь при беглом просмотре будет видно, есть ли вообще трафик от роутера, и если есть, куда он идет - наружу или в локалку. Скажем, увидим, что был трафик наружу, уточним правила по протоколам (tcp, udp, icmp). Если будет еще интереснее, можно будет поставить правило для логирования определенного вида трафика. Особо не увлекайтесь, все-таки роутер не имеет кучи места под логи. Да и лишний раз напрягать слабенький процессор тоже не очень.
Последнее правило (5) никогда не будет выполняться, я его добавил сюда специально, чтобы продемонстрировать работу jump. Последнее правило для цепочки forward будет (4) drop.
Т.е. предположим, мы запросили исходящее соединение с удаленным ssh-сервером (т.е. из локальной сети через через цепочку forward, протокол tcp, dst-port 22). Дойдя до блока (1) jumping, выполнится переход в (2) deny для tcp. Т.к. в цепочке tcp нет решения по поводу tcp/22, то выполнение вернется к (3), которое выполнит forward нашего пакета. Если наш пакет не удовлетворит требованиям (3), следующее за ним правило (4) блокирует его.
Наглядно это очень интересно смотреть, когда в окне Firewall видишь счетчик пакетов по правилам.
Если вы начали подозревать, что 100500 правок выполняют уже невесть что, просто выделяете все правила брандмауэра и нажимаете delete. Затем снова Run Script ;)