В этой статье поговорим про NAT в Mikrotik.
NAT (Network Address Translation) – это процедура изменения либо адреса источника (Source address), либо адреса назначения (Destination Address) в заголовке пакета.
Зачем мы используем NAT и с чем связано вообще использование NAT?
Использование этих диапазонов разрешено кем угодно внутри своих локальных сетей. В глобальной сети Интернет эти адреса не маршрутизируются.
Если вы используете эти адреса и нужно попасть в глобальную сеть Интернет, Вам нужно провести автоматическое изменение либо адреса источника пакета, либо адреса назначения пакета – для этого и существует NAT.
Для чего используется NAT?
Самое частое использование — это доступ из локальной сети с серыми адресами куда-то в интернет.
Открыть доступ из внешней сети к ресурсам (напр., веб-сервер) находящимся во внутренней сети (так называемый «проброс портов»).
Это правило находится в IP – Firewall — NAT (раздел NAT отвечает за преобразование адресов и портов, заголовках пакетов, сегментах, дейтаграммах и так далее).

В данном случае правило Source NAT — процедура изменения в заголовке пакета адреса (например, адреса локальной сети), где есть условие, что пакет, идущий в сторону Out interface List – WAN (в сторону интернета) и Action — masquerade.

Или вторая процедура, которая описывается как DST-NAT и для ее работы используются цепочка DSTNAT — это процедура, например, для проброса портов с внешнего интерфейса во внутреннюю (локальную) сеть.
Или, например, внутри локальной сети есть какой-то веб-сервер, который слушает TCP 80 порт и нужно, чтобы он был доступен из интернета. Только вот, если сказать адрес сервера 192.168.88.2, никто не сможет получить доступ к веб-серверу.


/ip firewall nat
add action=dst-nat chain=dstnat dst-port=80 in-interface-list=WAN protocol=tcp to-addresses=192.168.88.2 to-ports=80
Если служба запущена на 80 порту, то в Action — dst-nat, to Ports не нужно указывать 80 порт, т.к. это, по сути, будет повторение одного и того же действия. Роутер будет в заголовках сегмента 4 уровня менять TCP 80 на TCP 80, что немножко повлияет на производительность. Поэтому, в ситуации прямого проброса, нужно убрать поле to ports.

В другой ситуации, когда внешний 80 порт нужно пробросить на внутренний 8080, тогда поле to ports нужно заполнить.

Также можно пробросить несколько портов, например, 80, 443, 8080 и тд.
В данном случае не нужно указывать to ports, проброс будет осуществляться с порта на порт. То есть – с 80 на 80, с 443 на 443, с 8080 на 8080.
/ip firewall nat
add action=dst-nat chain=dstnat dst-port=80,443,8080 in-interface=WAN protocol=tcp to-addresses=192.168.88.2
Если нужно пробросить все эти порты на один порт, то нужно указать в to ports нужный порт.
При пробросе портов и при стандартной настройке файрволла не нужно добавлять дополнительные правила в цепочку Filter. Правило forward, запрещающее доступ из внешнего интерфейса, решает вопрос с пробросом портов «кроме DST-NAT»


Если необходимо разрешать это все дело в файрволле, например, для производительности или, если не используется в правиле «кроме DST Nat» в Drop Forward и на Interface list WAN (внешний), то необходимо писать правила, которые будут разрешать проброшенные порты с внешнего интерфейса и указать порты, которые открыты на веб-сервере (все те порты, на которые нужно пробросить с внешнего интерфейса).
Например, если пробрасывается внешний порт TCP 8080 на порт внутренний TCP 80, то в Forward нужно указать порт TCP 80.
/ip firewall nat
add action=dst-nat chain=forward dst-port=80 in-interface=WAN protocol=tcp to-addresses=192.168.88.2 to-ports=8080
Это все связано с тем, что правила dst-nat отрабатывают до firewall filter и сначала изменяются в заголовках 4 уровня и адреса, и порты, а потом пакет попадает в firewall. Это всё связано работой Packet Flow diagram Mikrotik RouterOS.
На этом знакомство с NAT в Mikrotik завершено.
RouterOS — сетевая ОС, изначально предназначенная для устройств RouterBoard латвийской компании Mikrotik, но в дальнейшем перекочевавшая на x86 и в облака (версия Cloud Hosted Router). В этой статье поговорим о том, как грамотно настроить межсетевой экран в этой ОС.
Безопасность периметра локальной сети — одна из приоритетных задач любого системного администратора и в компании Mikrotik это прекрасно понимают. Так что как только вы включили устройство на RouterBoard с настройками по умолчанию — там уже будет некоторое количество преднастроенных правил. В случае Mikrotik CHR — по умолчанию правил не будет, но Mikrotik настоятельно рекомендует их настроить.
Сразу оговоримся, что в рамках этой статьи мы будет пользоваться исключительно интерфейсом командной строки (CLI) и облачной версией RouterOS CHR. Логика настройки точно такая же, как и при использовании WinBox или WebFig, но предпочтительнее изначально пользоваться CLI.
Настройка firewall
Одним из базовых понятий настройки файервола Mikrotik является цепочка (chain). По умолчанию их 3, но есть возможность и создания собственных цепочек:
Если к нам должен прийти какой-либо трафик извне, например, из интернета, то мы его будем обрабатывать цепочкой INPUT. Чтобы обработать правилами трафик, уходящий наружу (например, в тот же интернет), задействуем цепочку OUTPUT. Если же наш маршрутизатор не находится на границе сети, а служит промежуточным узлом между сетями, то тогда для обработки трафика применяем цепочку FORWARD.
Причем тут странное название «цепочка»? Все элементарно. Все создаваемые правила обработки действуют не вместе, а строго по очереди одно за другим. Точно также, как формируется цепь — одно звено следует за другим. Именно поэтому списки правил стали именовать «цепочками».
Теперь коснемся статусов соединения. Каждое соединение условно можно разделить на 4 категории:
И сразу к практике
Открываем консольный интерфейс и посмотрим на существующие правила:
Пока что правил нет, отображается только «легенда» про флаги. Переходим в раздел настройки фильтров:
Полезный чит-код: узнать все варианты команд в любом разделе можно, нажав клавишу со знаком вопроса «?«
Теперь создадим несколько правил и расскажем для чего они нужны:
add action=accept chain=input comment=»default configuration» connection-state=established,related
Эту команду можно читать прямо дословно. Разберем прямо по пунктам:
Таким образом эта длинная команда всего лишь превращается во вполне логичную фразу «Принимать извне все пакеты со статусом соединения Established и Related». Это правило позволяет четко указать маршрутизатору что если из внешней сети прилетают соединения с указанными статусами, то их следует принять.
Теперь переходим к следующему правилу, рекомендуемому Mikrotik:
add action=accept chain=input src-address-list=allowed_to_router
Еще небольшое пояснение. Из-за того, что правила в цепочке обрабатываются одно за другим, то вначале следует прописывать разрешающие правила, а только после этого запрещающие.
add action=accept chain=input protocol=icmp
Тут все просто — эта команда разрешает принимать извне и обрабатывать ICMP-пакеты. И завершающая команда:
add action=drop chain=input
Этим в финале цепочки INPUT мы будем отбрасывать (дропать) все оставшиеся пакеты, не подпадающие под правила выше. Посмотрим как у нас сформировались правила:
Рассмотрим как же это работает. Представим, что мы пингуем маршрутизатор извне. Это выглядит примерно так:
Рассмотрим еще один случай. На этот раз к нам на маршрутизатор извне прилетел некий неизвестный UDP-пакет с данными. Как будет действовать маршрутизатор:
Надеемся, что столь подробный разбор логики немного прояснил как именно работает файервол в Mikrotik RouterOS, поэтому приступим к дальнейшей настройке. Сформируем список разрешенных адресов. Для этого вернемся в главное меню, нажав символ / и подтвердив нажатием клавиши Enter. Теперь перейдем в раздел консольного интерфейса Mikrotik – ip firewall и посмотрим какие адресные списки у нас существуют:
Как видим, список пока пустой. Добавим туда адреса из стандартной локальной подсети 192.168.88.0/24 за исключением 192.168.88.1 (адрес маршрутизатора). Эта подсеть обычно используется по умолчанию на устройствах Mikrotik и именно ее чаще всего используют для раздачи адресов в локальной сети. Выполним добавление:
add address=192.168.88.2-192.168.88.254 list=allowed_to_router
Команда максимально проста для понимания мы говорим, что нам нужно добавить адреса 192.168.88.2-192.168.88.254 в список с именем allowed_to_router. Подразумевается то, что если списка с таким именем не существует, то при выполнении команды он будет создан. Проверим:
Разделяем и властвуем
Списки адресов — крайне полезная штука при настройке файервола. Тут важно следовать стандартам, разработанным такой крутой организацией, как IETF (Internet Engineering Task Force) — Инженерный совет Интернета. Это международное сообщество с конца 80-х годов занимается развитием протоколов и архитектуры интернета.
Результаты работы IEFT публикуются в виде RFC (Request for Comments) — информационных документов, содержащих в себе детальное описание спецификаций и стандартов. Этих документов уже создано несколько тысяч, все они представлены на английском языке. Один из них поможет нам корректно сформировать списки адресов, а именно RFC6890.
Наша задача при настройке файервола четко разделить адреса, относящиеся к локальному сегменту и адреса глобальной сети интернет. Именно их мы возьмем из RFC и пропишем в нашем маршрутизаторе списком с названием not_in_internet. В дальнейшем это поможет нам сформировать правила в которых будут абстракции «это адрес из интернета» и «это адрес не из интернета».
add address=0.0.0.0/8 comment=RFC6890 list=not_in_internet
add address=172.16.0.0/12 comment=RFC6890 list=not_in_internet
add address=192.168.0.0/16 comment=RFC6890 list=not_in_internet
add address=10.0.0.0/8 comment=RFC6890 list=not_in_internet
add address=169.254.0.0/16 comment=RFC6890 list=not_in_internet
add address=127.0.0.0/8 comment=RFC6890 list=not_in_internet
add address=198.18.0.0/15 comment=RFC6890 list=not_in_internet
add address=192.0.0.0/24 comment=RFC6890 list=not_in_internet
add address=192.0.2.0/24 comment=RFC6890 list=not_in_internet
add address=198.51.100.0/24 comment=RFC6890 list=not_in_internet
add address=203.0.113.0/24 comment=RFC6890 list=not_in_internet
add address=100.64.0.0/10 comment=RFC6890 list=not_in_internet
add address=240.0.0.0/4 comment=RFC6890 list=not_in_internet
Есть еще две важные подсети, которые тоже стоит добавить в этот список. Первая подсеть — это 224.0.0.0/4. Эта подсеть зарезервирована для технологии многоадресного вещания (мультикаст) и это зафиксировано в соответствующем RFC2780. Вторая подсеть специфична для переходного механизма 6to4, позволяющего передавать IPv6 трафик через IPv4 сети. Этот механизм реализован в подсети 192.88.99.0/24, что также зафиксировано в отдельном RFC3068.
add address=224.0.0.0/4 comment=Multicast_RFC2780 list=not_in_internet
add address=192.88.99.0/24 comment=»6to4_RFC 3068″ list=not_in_internet
Теперь, когда мы все сделали «по фен-шую», у нас есть список всех адресов, которые будут опознаваться как локальные, т.е. пришедшие не из интернета. Проверим:
Теперь, используя эти листы, создадим еще правила уже в цепочке FORWARD, которые защитят устройства в локальной сети от различных посягательств. Возвращаемся в раздел с правилами:
/ip firewall filter
Первым правилом мы сделаем так, чтобы наш файервол не срабатывал, когда имеет дело с уже установленными соединениями, это лишь тратит ресурсы маршрутизатора и никоим образом не помогает в обеспечении безопасности:
add action=fasttrack-connection chain=forward comment=FastTrack connection-state=established,related
Обрабатываем установленные соединения в цепочке Forward:
add action=accept chain=forward comment=»Established, Related» connection-state=established,related
Отбрасываем «битые» соединения:
add action=drop chain=forward comment=»Drop invalid» connection-state=invalid log=yes log-prefix=invalid
add action=drop chain=forward comment=»Drop tries to reach not public addresses from LAN» dst-address-list=not_in_internet in-interface=bridge1 log=yes log-prefix=!public_from_LAN out-interface=!bridge1
Отбрасываем входящие пакеты, которые не подходят для NAT и фиксируем срабатывание:
add action=drop chain=forward comment=»Drop incoming packets that are not NATted» connection-nat-state=!dstnat connection-state=new in-interface=ether1 log=yes log-prefix=!NAT
add action=drop chain=forward comment=»Drop incoming from internet which is not public IP» in-interface=ether1 log=yes log-prefix=!public src-address-list=not_in_internet
add action=drop chain=forward comment=»Drop packets from LAN that do not have LAN IP» in-interface=bridge1 log=yes log-prefix=LAN_!LAN src-address=!192.168.88.0/24
Защита от атак перебором
Брутфорс-атаки давно стали повседневностью. Десятки тысяч ботов регулярно сканируют весь интернет в поисках открытых портов SSH и затем начинают весьма активно «стучаться» на внешний интерфейс и перебирать пароли в попытке захватить контроль над подключенным устройством. У тех, кто контролирует эти сети есть весьма обширные словари паролей, использующие как дефолтные реквизиты доступа большинства устройств.
Но даже если вы задали сложный пароль — это еще не гарантирует безопасности. Длительная атака перебором способна сломать этот барьер защиты, поэтому проще всего пресекать попытки злоумышленников сразу, как только замечен процесс перебора. Настройка правил firewall у устройств Mikrotik достаточно тривиальна:
add chain=input protocol=tcp dst-port=22 src-address-list=ssh_blacklist action=drop comment=»Drop SSH brutforce» disabled=no
add chain=input protocol=tcp dst-port=22 connection-state=new action=add-src-to-address-list address-list=ssh_stage1 address-list-timeout=1m comment=»Stage1″ disabled=no
Если даже пользователь ошибся, то ничего страшного, однако если он попробует в течение этой минуты еще раз подключиться, то его адрес мы закидываем во второй список ssh_stage2 из первого списка ssh_stage1.
add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage1 action=add-src-to-address-list address-list=ssh_stage2 address-list-timeout=1m comment=»Stage2″ disabled=no
add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage2 action=add-src-to-address-list address-list=ssh_stage3 address-list-timeout=1m comment=»» disabled=no
Третья ошибочная попытка приводит к копированию IP из списка ssh_stage3 в список ssh_blacklist и все входящие соединения с этого IP будут заблокированы сроком на 10 дней.
add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage3 action=add-src-to-address-list address-list=ssh_blacklist address-list-timeout=10d comment=»» disabled=no
Для разблокировки адреса будет достаточно его удалить из черного списка.
Базовая настройка и проброс портов
Решением проблемы является так называемый проброс портов (Port Forwarding). Создавая правило проброса портов мы даем маршрутизатору указания какому устройству перенаправить запрос извне. На логическом уровне подобный запрос может выглядеть как «Если на порт XXX придет TCP-запрос, то перенаправь его на локальный адрес 192.168. XXX. XXX на порт YYY». Давайте посмотрим 2 способа как нам настроить NAT на Mikrotik.
ip firewall nat add chain=srcnat out-interface=ether1 action=masquerade
где ether1 — интерфейс, смотрящий в интернет. Также можно задать не один выходной интерфейс, а сразу несколько, заранее сформировав список out-interface-list.
Теперь еще один вариант организации NAT. Рассмотрим пример:
ip firewall nat add chain=srcnat out-interface=ether1 action=src-nat to-addresses=XXX. XXX. XXX. XXX
Теперь переходим к пробросу портов. Для примера предположим, что у нас в локальной сети 192.168.88.0/24 есть небольшой сервер по адресу 192.168.88.10 с поднятым SSH. Нам нужно подключаться к серверу удаленно, используя номер порта 1122. Для этого выполним проброс портов, созданием правила:
ip firewall nat add chain=dstnat in-interface=ether1 protocol=tcp dst-port=1122 action=dst-nat to-addresses=192.168.88.10 to-ports=22
Почему мы взяли такой странный номер порта 1122? Все просто — чтобы затруднить злоумышленникам нахождение номера порта и последующего перебора реквизитов. Таким образом, мы создали правило, однозначно позволяющее маршрутизатору понять, что все TCP-пакеты, пришедшие на порт 1122 следует переадресовывать на локальный адрес 192.168.88.10 на порт 22.
Вместо заключения
Мы рассмотрели основные команды для выстраивания базовой защиты для устройств на базе RouterBoard, а также облачной версии Mikrotik CHR и взглянули на то, как можно парой команд настроить NAT. Разумеется, для каждого неиспользуемого сервиса можно закрыть доступ извне, исходя из используемых портов, протоколов и типа трафика.
Угроз безопасности с каждым днем становится все больше и каждая из них заслуживает внимания и адекватного ответа.
Существует два типа NAT:
Для преодоления этих ограничений RouterOS включает в себя ряд так называемых помощников NAT, которые позволяют выполнять обход NAT для различных протоколов.
NAT action=masquerade является уникальной субверсией action=srcnat, он был разработан для конкретного использования в ситуациях, когда публичный IP может случайным образом изменяться, например DHCP-сервер меняет его, или PPPoE — туннель после отключения получает другой IP, короче говоря-когда публичный IP динамичен.
К сожалению, это может привести к некоторым проблемам, когда action=masquerade используется в установках с нестабильными соединениями/ссылками, которые маршрутизируются по другому каналу, когда первичный не работает. В таком сценарии могут произойти следующие вещи:
Вы можете обойти это, создав маршрут blackhole в качестве альтернативы маршруту, который может исчезнуть при отключении).
Когда action=srcnat он используется вместо этого, записи отслеживания соединений остаются, и соединения могут просто возобновиться.
Бета версия перевода официального WiKi MikroTik

