Mikrotik для небольшого офиса

Вводная: небольшой офис. В наличии имеется один канал от провайдера (впрочем, их может быть два), проводная сеть, служебный и гостевой WiFi.
При этом к проводной сети подключены сервера (ну и админ, конечно ;)), а сотрудники сидят через служебный WiFi. Для гостей (и личных устройств сотрудников) есть гостевой WiFi (может быть, даже с hotspot) c обычной PSK-аутентификацией или без неё.
Чтобы было ещё веселее – добавим DMZ с почтовым сервером (как его настроить, можно почтитать, например, тут). По организации DMZ есть много толковых мануалов, так что заострять на этом внимания не буду – для простоты, почтовый сервер будет жить в одной сети со всеми остальными.

В этой статье я намеренно не буду пытаться охватить все аспекты существования офисного роутера (например, обеспечение резервирования или удалённого доступа сотрудников) – вы без труда найдёте на этом сайте нужную информацию воспользовавшись поиском или облаком тэгов.
netdiag2
Мы же остановимся именно на разграничении трафика между тремя сетями – для каждой будет отдельное адресное пространство, интерфейсы и правила фаервола.
Хорошей идеей было бы ограничить гостевую сеть с помощью очередей (queues), но это оставим для следующей статьи.
Приступим?

0. Обновление, установка ntp server

Для начала, нужно установить актуальную версию Router OS (я использую bugfix-ветку, но можно и current) и обновить firmware.
Т.к. микротик в нашей локалке будет ещё и ntp-сервером, установим соответствующий пакет.
В моём случае это следуюшие пакеты

ntp-6.37.5-mipsbe.npk
routeros-mipsbe-6.37.5.npk

С помощью WinBox (или веб-интерфейса) кладём файлы в корень ФС устройства, перезагружаемся.
winbox2

1. Настройка с нуля

Теперь сбросим конфигурацию, чтобы настроить с нуля. Зачем? Всё просто – настраиваем мы не просто домашний роутер, а роутер для офиса, тем более с претензией на защищённость, и настройки необходимо держать под контролем.
После сброоса конфигурации, подключиться к устройству можно через WinBox и функцию mac-telnet (я надеюсь, как это сделать, вы знаете).
winbox
Интерфейсы

#Настройки интерфейсов приведены для роутера RB951
#На вашем роутере настройки интерфейсов могут отличаться
/interface ethernet
set [ find default-name=ether1 ] comment=Internet name=ether1
set [ find default-name=ether2 ] name=ether2
set [ find default-name=ether3 ] master-port=ether2 name=ether3
set [ find default-name=ether4 ] master-port=ether2 name=ether4
set [ find default-name=ether5 ] master-port=ether2 name=ether5

IP, DHCP-сервер

/ip address
add address=192.168.88.1/24 comment="servers" interface=ether2 network=192.168.88.0
/ip pool
add name=guest ranges=192.168.88.10-192.168.88.254
/ip dhcp-server network
add address=192.168.88.0/24 comment="servers" dns-server=192.168.88.1 gateway=192.168.88.1 ntp-server=192.168.88.1
/ip dhcp-server
add address-pool=servers disabled=no interface=ether2 lease-time=3d name=servers


/ip address
add address=192.168.89.1/24 comment="Stuff WiFi" interface=wlan1 network=192.168.89.0
/ip pool
add name=stuff ranges=192.168.89.10-192.168.89.254
/ip dhcp-server network
add address=192.168.89.0/24 comment="stuff wifi" dns-server=192.168.89.1 gateway=192.168.89.1 ntp-server=192.168.89.1
/ip dhcp-server
add address-pool=stuff disabled=no interface=wlan1 lease-time=3d name=stuff

NTP-сервер
/system ntp client
set enabled=yes primary-ntp=95.104.192.10 secondary-ntp=93.180.6.3
/system ntp server
set enabled=yes

5. WiFi (channel, psk)
/interface wireless
#Выставляем режим 2.4GHz b/g/n (у вас, возможно, будет другая модель роутера, например с поддержкой 5GHz-диапазона.
#В таком случае, настройки будут отличаться
#Также, возможно, придётся поменять частоту
set [ find default-name=wlan1 ] band=2ghz-b/g/n comment=hs-ap-default disabled=no distance=indoors frequency=2437 guard-interval=long mode=ap-bridge ssid=Stuff wireless-protocol=802.11
/interface wireless security-profiles
set [ find default=yes ] authentication-types=wpa2-psk group-ciphers=aes-ccm mode=dynamic-keys supplicant-identity=MikroTik unicast-ciphers=aes-ccm wpa2-pre-shared-key=123WiFi321

Задаём пароль админа
[admin@snake-mikrotik] > /user set 0 password=VeRy$tR0nGp@s$

NAT – он у нас будет один на всех
/ip firewall nat
add action=masquerade chain=srcnat comment="NAT Internet" out-interface=ether1 src-address-list=internal-nets dst-address-list=!internal-nets

2. Гостевой wifi (virtual ap, shaping, отдельная сеть)

Т.к. стоит задача изолировать беспроводных клиентов от проводной сети, а их всех вместе – от гостевой, то сетей у нас будет три (можно и больше), с разными правилами доступа для каждой.
Создаем виртуальную точку доступа и security profile
/interface wireless security-profiles
add name=hs-ap-prof-nixman authentication-types=wpa2-psk group-ciphers=aes-ccm mode=dynamic-keys supplicant-identity=MikroTik unicast-ciphers=aes-ccm wpa2-pre-shared-key=WiFiPaSsWoRd
/interface wireless
add master-interface=wlan1 mode=ap-bridge name=hs-ap-nixman security-profile=hs-ap-prof-nixman ssid="Guest WiFi"

IP, DHCP-сервер

/ip address
add address=192.168.90.1/24 comment="Guest WiFi" interface=hs-ap-nixman network=192.168.90.0 arp=reply-only
/ip pool
add name=guest ranges=192.168.90.10-192.168.90.254
/ip dhcp-server network
add address=192.168.90.0/24 comment="guest wifi" dns-server=8.8.8.8 gateway=192.168.90.1
/ip dhcp-server
add address-pool=guest disabled=no interface=hs-ap-nixman lease-time=1h name=guest add-arp=yes

3. Защищаем роутер

Отключаем ненужные службы.
/ip service
set telnet disabled=yes
set ftp disabled=yes
set api disabled=yes
set api-ssl disabled=yes

Для нужных – меняем порты (либо ограничиваем доступ только списком администраторов – см. правила фаервола ниже)
/ip service
set www port=8080
set ssh port=2222

Теперь настраиваем фаервол. Я воспользовался правилами от Грега, только немного изменив “под себя”. У вас, вполне вероятно, получится что-то своё.

/ip firewall address-list
#rfc 1918, loopback, мультикаст и прочие bogon networks
add address=0.0.0.0/8 comment="" disabled=no list=rfc-1918
add address=127.0.0.0/8 comment="" disabled=no list=rfc-1918
add address=100.64.0.0/10 comment="" disabled=no list=rfc-1918
add address=10.0.0.0/8 comment="" disabled=no list=rfc-1918
add address=169.254.0.0/16 comment="" disabled=no list=rfc-1918
add address=172.16.0.0/12 comment="" disabled=no list=rfc-1918
add address=192.0.0.0/24 comment="" disabled=no list=rfc-1918
add address=192.0.2.0/24 comment="" disabled=no list=rfc-1918
add address=192.168.0.0/16 comment="" disabled=no list=rfc-1918
add address=198.18.0.0/15 comment="" disabled=no list=rfc-1918
add address=198.51.100.0/24 comment="" disabled=no list=rfc-1918
add address=203.0.113.0/24 comment="" disabled=no list=rfc-1918
add address=224.0.0.0/3 comment="" disabled=no list=rfc-1918

#наш внешний адрес
add address=X.X.X.X comment="" disabled=no list=public-add

#внутренние сети
add address=192.168.88.0/24 comment="Servers" disabled=no list=internal-nets
add address=192.168.88.0/24 comment="Servers" disabled=no list=servers
add address=192.168.89.0/24 comment="LAN" disabled=no list=internal-nets
add address=192.168.89.0/24 comment="LAN" disabled=no list=lan
add address=192.168.90.0/24 comment="Guest WiFi" disabled=no list=internal-nets
add address=192.168.90.0/24 comment="Guest WiFi" disabled=no list=guest

#Список доверенных адресов
add address=Y.Y.Y.Y comment="" disabled=no list=admins

#Исключения для SMTP-сервера
add address=192.168.88.5 comment="" disabled=no list=smtp-bypass

#DMZ
add address=192.168.88.5 comment="" disabled=no list=dmz

/ip firewall filter
#Защищаемся от icmp-flood
add action=accept chain=input comment="start of greg rules up to 5 pings in 5 seconds" disabled=no limit=5,5 protocol=icmp
add action=add-src-to-address-list address-list=icmp-attack address-list-timeout=12h chain=input comment="add all other icmp input into icmp-attack address list." \
disabled=no protocol=icmp
add action=drop chain=input comment="drop excessive icmp traffic for 12 hours" disabled=no src-address-list=icmp-attack protocol=icmp
add action=drop chain=forward comment="drop excessive icmp traffic for 12 hours" disabled=yes src-address-list=icmp-attack protocol=icmp

#Запрещаем снаружи сети, которых там быть не должно
add action=drop chain=forward comment="block rfc 1918 and multicast inbound" disabled=no in-interface=ether1 src-address-list=rfc-1918
add action=drop chain=forward comment="block our addressing inbound - spoofed" disabled=no in-interface=ether1 src-address-list=public-add
add action=drop chain=input comment="block rfc 1918 and multicast inbound" disabled=no in-interface=ether1 src-address-list=rfc-1918
add action=drop chain=input comment="block our addressing inbound - spoofed" disabled=no in-interface=ether1 src-address-list=public-add

#Защищаемся от сканирования портов и DoS-атак
add action=add-src-to-address-list address-list=port-scan address-list-timeout=2w chain=input comment="add port scannes to port-scan list" disabled=no \
in-interface=ether1 protocol=tcp psd=21,3s,3,1 src-address-list=!internal-nets
add action=add-src-to-address-list address-list=port-scan address-list-timeout=2w chain=input comment="NMAP FIN Stealth scan" disabled=no protocol=tcp \
tcp-flags=fin,!syn,!rst,!psh,!ack,!urg
add action=add-src-to-address-list address-list=port-scan address-list-timeout=2w chain=input comment="SYN/FIN scan" disabled=no protocol=tcp tcp-flags=\
fin,syn
add action=add-src-to-address-list address-list=port-scan address-list-timeout=2w chain=input comment="SYN/RST scan" disabled=no protocol=tcp tcp-flags=\
syn,rst
add action=add-src-to-address-list address-list=port-scan address-list-timeout=2w chain=input comment="FIN/PSH/URG scan" disabled=no protocol=tcp tcp-flags=\
fin,psh,urg,!syn,!rst,!ack
add action=add-src-to-address-list address-list=port-scan address-list-timeout=2w chain=input comment="ALL/ALL scan" disabled=no protocol=tcp tcp-flags=\
fin,syn,rst,psh,ack,urg
add action=add-src-to-address-list address-list=port-scan address-list-timeout=2w chain=input comment="NMAP NULL scan" disabled=no protocol=tcp tcp-flags=\
!fin,!syn,!rst,!psh,!ack,!urg
add action=tarpit chain=input comment="tarpit port-scan address list to router" disabled=no protocol=tcp src-address-list=port-scan
add action=drop chain=input comment="drop port-scan address list to our router" disabled=no src-address-list=port-scan
add action=drop chain=forward comment="drop port-scan address list to our infrastructure" disabled=no src-address-list=port-scan

#Разрешаем established и related
add action=accept chain=input comment="allow established,related" connection-state=established,related
add action=accept chain=forward comment="allow established,related" connection-state=established,related

#Разрешаем доступ администраторам (если вы меняли порты для служб, здесь тоже нужно поменять)
add action=accept chain=input comment="allow management for admins" disabled=no dst-port=8291,22,80 protocol=tcp src-address-list=admins

#Ограничиваем число коннектов наружу для SMTP. SMTP-серверу можно больше, чем другим
add action=accept chain=forward comment="allow smtp-bypass list to create multiple sessions" disabled=no dst-port=25 protocol=tcp src-address-list=smtp-bypass
add action=drop chain=forward comment="drop smtp traffic marked as spam" disabled=no dst-port=25 protocol=tcp src-address-list=spam-block
add action=add-src-to-address-list address-list=spam-block address-list-timeout=2h chain=forward comment=\
"more than 5 smtp connections out as spam. add to address list" connection-limit=30,32 disabled=no dst-port=25 limit=50,5 protocol=tcp \
src-address-list=rfc-1918

#Запрещаем локалке и серверам ходить в гостевую сеть
add action=drop chain=forward comment="deny from LAN,SERVERS to GUEST" src-address-list=internal-nets dst-address-list=guest
#Гостевой сети можно ходить только в интернет, и совсем нельзя в локалку и к серверам
add action=drop chain=forward comment="deny from GUEST to LAN,SERVERS" src-address-list=guest dst-address-list=internal-nets
#Сервера и локалка могут общаться без ограничений, но из локалки нельзя ходить на почтовый сервер по ssh
add action=drop chain=forward comment="Deny SSH to mailserver" src-address-list=internal-nets dst-address-list=dmz
add action=accept chain=forward comment="accept from LAN,SERVERS to LAN,SERVERS" src-address-list=internal-nets dst-address-list=internal-nets
#Сервера и локалка могут ходить в интернет
add action=accept chain=forward comment="deny from LAN,SERVERS to INTERNET" src-address-list=internal-nets dst-address-list=!internal-nets
#Сервера и локалка могут спрашивать у микротика DNS и NTP
add action=accept chain=input comment="allow DNS, NTP for LAN,SERVERS" src-address-list=lan protocol=udp dst-port=53,123
add action=accept chain=input comment="allow DNS, NTP for LAN,SERVERS" src-address-list=servers protocol=udp dst-port=53,123

#Снаружи можно зайти в DMZ
add action=accept chain=input dst-address-list=public-add dst-port=80,443,25,587,465,995 protocol=tcp
add action=accept chain=forward dst-address-list=dmz connection-nat-state=dstnat dst-port=80,443,25,587,465,995 protocol=tcp

#Запрещаем несанкционированную активность
add action=drop chain=forward comment="block disallowed forward" disabled=no
add action=drop chain=input comment="block inbound traffic from everyone else" disabled=no

Теперь настраиваем NAT. Помимо обычного маскарадинга (его мы настроили выше) нам еще нужно сделать проброс портов к нашему почтовому серверу в DMZ.
/ip firewall nat
add action=dst-nat chain=dstnat comment="HTTPS" dst-address-list=public-add dst-port=443 protocol=tcp to-addresses=192.168.88.5 to-ports=443
add action=dst-nat chain=dstnat comment="HTTP" dst-address-list=public-add dst-port=80 protocol=tcp to-addresses=192.168.88.5 to-ports=80
add action=dst-nat chain=dstnat comment="Mail" dst-address-list=public-add dst-port=25 protocol=tcp to-addresses=192.168.88.5 to-ports=25
add action=dst-nat chain=dstnat comment="Mail" dst-address-list=public-add dst-port=465 protocol=tcp to-addresses=192.168.88.5 to-ports=465
add action=dst-nat chain=dstnat comment="Mail" dst-address-list=public-add dst-port=587 protocol=tcp to-addresses=192.168.88.5 to-ports=587
add action=dst-nat chain=dstnat comment="Mail" dst-address-list=public-add dst-port=995 protocol=tcp to-addresses=192.168.88.5 to-ports=995

В заключение – отключаем mac-telnet и neighbor discovery. При желании можете оставить для проводной сети, но только если вы твёрдо уверены, что вам оно нужно.
/ip neighbor discovery settings set default=n default-for-dynamic=no

[admin@snake-mikrotik] > /tool mac-server mac-winbox print
Flags: X - disabled, * - default
# INTERFACE
0 X* all
1 ether2-master-local
2 ether3-slave-local
3 ether4-slave-local
4 ether5-slave-local
5 wlan1
6 bridge-local
[admin@snake-mikrotik] > /tool mac-server mac-winbox set 1,2,3,4,5,6 disabled=y

[admin@snake-mikrotik] > /tool mac-server print
Flags: X - disabled, * - default
# INTERFACE
0 X* all
1 ether2-master-local
2 ether3-slave-local
3 ether4-slave-local
4 ether5-slave-local
5 wlan1
6 bridge-local
[admin@snake-mikrotik] > /tool mac-server set 1,2,3,4,5,6 disabled=y

На этом всё. Надеюсь, руководство окажется для вас полезным.

3 Comments

  1. Классная статья, очень интересная! Люблю знаете ли скролить страницы полные текста!

  2. #Защищаемся от сканирования портов и DoS-атак
    add action=add-src-to-address-list address-list=port-scan address-list-timeout=2w chain=input comment=”add port scannes to port-scan list” disabled=no \
    in-interface=ether1 protocol=tcp psd=21,3s,3,1 src-address-list=!internal-nets

    “src-address-list=!internal-nets” можно не указывать.

    Спасибо за статью!

Leave a Reply