среда, 20 ноября 2013 г.

Настройка Mikrotik

Предлагаю вашему вниманию пример настройки MikroTik RouterOS на самой популярной, на сегодняшний день, версии v3.20 для работы с двумя провайдерами и публикации интернет-сервисов за маршрутизатором. При этом интернет-сервисы смогут автоматически отвечать по запросам пришедшим с обоих провайдеров.

ЧАСТЬ 1. НАСТРОЙКА ВЫХОДА В ИНТЕРНЕТ ИЗ ЛОКАЛЬНОЙ СЕТИ И БАЗОВАЯ ЗАЩИТА МАРШРУТИЗАТОРА.

Пример сделан на абсолютно чистой конфигурации. Из-за моей специфики я добавил всего-лишь несколько vlan-ов.
У меня в системе два физических интерфейса, из которых один смотрит в локальную сеть (ether2), а на другом (ether1) подключены два vlan-а.
Наличие vlan-ов вас не должно пугать, просто замените их на название ваших сетевых интерфейсов.
И так, структура сети следующая:

локальная сеть, интерфейс ether2, адрес 192.168.8.35/24
первый провайдер: интерфейс vlan54, адрес 89.15.64.9/26
второй провайдер: интерфейс vlan40, адрес 82.19.115.100/29
Начнем, с включения сетевых интерфейсов, если они по какой-то причине у вас выключены:
interface enable ether1
interface enable ether2
interface enable vlan54
interface enable vlan40
Результат:
[admin@MikroTik] > interface print
Flags: D - dynamic, X - disabled, R - running, S - slave
# NAME TYPE MTU
0 R ether1 ether 1500
1 R ether2 ether 1500
2 R vlan40 vlan 1500
3 R vlan54 vlan 1500
[admin@MikroTik] >
Добавляем ip адреса:

ip address add address=192.168.8.35/24 interface=ether2 comment="local
ip address add address=82.19.115.100/29 interface=vlan40 comment="isp1"
ip address add address=89.15.64.9/26 interface=vlan54 comment="isp2"
Должно получиться следующее:
[admin@MikroTik] > ip address print
Flags: X - disabled, I - invalid, D - dynamic
# ADDRESS NETWORK BROADCAST INTERFACE
0 ;;; local
192.168.8.35/24 192.168.8.0 192.168.8.255 ether2
1 ;;; isp2
89.15.64.9/26 89.15.64.0 89.15.64.63 vlan54
2 ;;; isp1
82.19.115.100/29 82.19.115.96 82.19.115.103 vlan40
[admin@MikroTik] >
После этого, если все кабели подключены то у нас должны пинговаться адреса в локальной сети и шлюзы провайдеров:
[admin@MikroTik] > ping 192.168.8.2
192.168.8.2 64 byte ping: ttl=255 time<1 ms
192.168.8.2 64 byte ping: ttl=255 time<1 ms
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0/0.0/0 ms
[admin@MikroTik] > ping 82.19.115.97
82.19.115.97 64 byte ping: ttl=255 time=12 ms
82.19.115.97 64 byte ping: ttl=255 time<1 ms
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0/6.0/12 ms
[admin@MikroTik] > ping 89.15.64.2
89.15.64.2 64 byte ping: ttl=255 time=10 ms
89.15.64.2 64 byte ping: ttl=255 time<1 ms
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0/5.0/10 ms
[admin@MikroTik] >
На этом этапе, если хотите, можете подключиться к маршрутизатору через WinBox
Базовая защита маршрутизатора (входящие соединения на сам маршрутизатор):
ip firewall filter add chain input connection-state=invalid action=drop comment="Drop invalid connection packets"
ip firewall filter add chain input connection-state=established action=accept comment="Allow established connections"
ip firewall filter add chain input connection-state=related action=accept comment="Allow related connections"
ip firewall filter add chain input protocol=udp action=accept comment="Allow UDP"
ip firewall filter add chain input protocol=icmp action=accept comment="Allow ICMP Ping"
ip firewall filter add chain input src-address=192.168.8.0/24 action=accept comment="Access to router only from local network"
ip firewall filter add chain input action=drop comment="All other inputs drop"
У нас должно получиться следующее:
[admin@MikroTik] > ip firewall filter print chain input
Flags: X - disabled, I - invalid, D - dynamic
0 ;;; Drop invalid connection packets
chain=input action=drop connection-state=invalid
1 ;;; Allow established connections
chain=input action=accept connection-state=established
2 ;;; Allow related connections
chain=input action=accept connection-state=related
3 ;;; Allow UDP
chain=input action=accept protocol=udp
4 ;;; Allow ICMP Ping
chain=input action=accept protocol=icmp
5 ;;; Access to router only from local network
chain=input action=accept src-address=192.168.8.0/24
6 ;;; All other inputs drop
chain=input action=drop
[admin@MikroTik] >

НАСТРАИВАЕМ ВЫХОД В ИНТЕРНЕТ ИЗ ЛОКАЛЬНОЙ СЕТИ:

ip firewall nat add chain=srcnat action=masquerade src-address=192.168.8.0/24 out-interface=vlan40
ip firewall nat add chain=srcnat action=masquerade src-address=192.168.8.0/24 out-interface=vlan54
Разрешаем маршрутизацию служебных пакетов через сам маршрутизатор:
ip firewall filter add chain forward connection-state=invalid action=drop comment="Drop invalid connection packets"
ip firewall filter add chain forward connection-state=established action=accept comment="Allow established connections"
ip firewall filter add chain forward connection-state=related action=accept comment="Allow related connections"
ip firewall filter add chain forward protocol=udp action=accept comment="Allow UDP"
ip firewall filter add chain forward protocol=icmp action=accept comment="Allow ICMP Ping"
Разрешаем выход в интернет для всех адресов из локальной сети:
ip firewall filter add chain forward in-interface=ether2 src-address=192.168.8.0/24 action=accept comment="Access to internet from local network"
Все остальные пакеты проходящие через маршорутизатор блокируем:
ip firewall filter add chain forward action=drop comment="All other forwards drop"
Результат:
[admin@MikroTik] > ip firewall filter print chain forward
Flags: X - disabled, I - invalid, D - dynamic
0 ;;; fake 10.0.0.0/8
chain=forward action=drop src-address=10.0.0.0/8 in-interface=!ether2
1 ;;; fake 172.16.0.0/12
chain=forward action=drop src-address=172.16.0.0/12 in-interface=!ether2
2 ;;; fake 192.168.0.0/16
chain=forward action=drop src-address=192.168.0.0/16 in-interface=!ether2
3 ;;; Drop invalid connection packets
chain=forward action=drop connection-state=invalid
4 ;;; Allow established connections
chain=forward action=accept connection-state=established
5 ;;; Allow related connections
chain=forward action=accept connection-state=related
6 ;;; Allow UDP
chain=forward action=accept protocol=udp
7 ;;; Allow ICMP Ping
chain=forward action=accept protocol=icmp
8 ;;; Access to internet from local network
chain=forward action=accept src-address=192.168.8.0/24 in-interface=ether2
9 ;;; All other forwards drop
chain=forward action=drop
[admin@MikroTik] >
А теперь, чтобы пользователи действительно могли выйти в интернет, необходимо добавить правило маршрутизации.
Я специально делаю чтобы по умолчанию все исходящие соединения шли через одного конкретного провайдера (isp1), а второй пока пусть будет отключен.

ip route add dst-address=0.0.0.0/0 gateway=82.19.115.97 comment="gw1"
ip route add dst-address=0.0.0.0/0 gateway=89.15.64.2 comment="gw2" disabled=yes
[admin@MikroTik] > ip route print
Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme,
B - blackhole, U - unreachable, P - prohibit
# DST-ADDRESS PREF-SRC GATEWAY-STATE GATEWAY DISTANCE INTERFACE
0 0.0.0.0/0 reachable 82.19.115.97 1 vlan40
1 ADC 82.19.115.96/29 82.19.115.100 0 vlan40
2 ADC 89.15.64.0/26 89.15.64.9 0 vlan54
3 ADC 192.168.8.0/24 192.168.8.35 0 ether2
[admin@MikroTik] >
Желающие использовать балансировку одинаково распределенную между двумя провайдерами укажите вместо адреса шлюза одного провайдра, через запятую, адреса обоих.
На этом первая часть настройки маршрутизатора завершена. Результаты её: маршрутизатор защищен от вторжений из вне, и пользователи из локальной сети имеют выход в интернет.

Теперь же я расскажу о самом интересном: публикации интернет-сервисов для работы за NATом, при этом они автоматически будут работать с двумя провайдерами, т.е. от какого провайдра пришел запрос, тому провайдеру и будет выдан ответ.

Вообще, история данного решения такова: После безуспешных попыток сделать такое на Cisco PIX 515E, наткнулся на статью, где сама cisco заявляет «load balancing or load sharing as it is not supported on ASA/PIX» и понял, что это просто невозможно Вспомнил, что давным давно, когда вода была мокрее , а сахар слаще, я такое реализовывал на маршрутизаторе MikroTik с RouterOS v.2.7. Тогда же мной был создан сайт pcrouter.ru, и написано несколько статей про настройку RouterOS. Но, это было давно, и как говориться, не правда. Сайт давно сменил хозяина, я сменил место работы, и мне больше не приходилось иметь дело с несколькими каналами в одном маршрутизаторе, поэтому на какое-то время забросил опыты с MiroTIk. Но, вот опять, два канала и надо чтобы оба работали. Так как времени прошло много, то и версия RouterOS поменялось не мало, и соответственно моё решение уже не работало современных версиях. Обыскав весь интернет ничего дельного не нашел. Попадались только варианты с заранее прописанной статической маршрутизацией на каждого провайдера, а мне то надо динамически. Службой поддержки MikroTik был сразу послан. В итоге, несколько вечеров за чтением документации и экпериментов, и вот, все получилось. Как говориться «решение на 1000$", пользуйтесь на здоровье !
Желающие отблагодарить — могут перечислить любую сумму на Яндекс.Деньги № 4100145284318.
Это было предисловие, а теперь к делу.

ЧАСТЬ 2. ПУБЛИКАЦИЯ ИНТЕРНЕТ-СЕРВИСОВ НА ПРИМЕРЕ ПОЧТОВОГО СЕРВЕРА.

Для примера буду использовать почтовый сервер находящийся по ip адресу 192.168.8.21 на 25 порту протокола tcp.
Для корректной работы шлюзом по умолчанию должен быть MikroTik, в моём примере его ip адрес 192.168.8.35
Делаем переадресацию входящих запросов приходящих на маршрутизатор на реальные адреса на почтовый сервер, внутренний адрес.
Два правила, по одному для каждого провайдера.
ip firewall nat add chain=dstnat action=dst-nat in-interface=vlan40 protocol=tcp dst-port=25 to-address=192.168.8.21 to-ports=25
ip firewall nat add chain=dstnat action=dst-nat in-interface=vlan54 protocol=tcp dst-port=25 to-address=192.168.8.21 to-ports=25
Разрешаем прохождение пакетов через маршрутизатор адресованных почтовому серверу:
ip firewall filter add chain forward in-interface=vlan40 protocol=tcp dst-port=25 dst-address=192.168.8.21 action=accept comment="vlan40 to smtp"
ip firewall filter add chain forward in-interface=vlan54 protocol=tcp dst-port=25 dst-address=192.168.8.21 action=accept comment="vlan54 to smtp"
Если вы, как в первой части статьи, разрешили выход в интернет всем, то следующее правило вам не нужно вводить.
В противном случае, разрешаем с почтового сервера создание новых соединений на другие почтовый серверы в интернете:
ip firewall filter add chain forward in-interface=ether2 src-address=192.168.8.21/32 protocol=tcp dst-port=25 action=accept comment="Access to SMTP servers from local mail server"
Результат должен быть таким:
[admin@MikroTik] > ip firewall filter print chain forward
Flags: X - disabled, I - invalid, D - dynamic
0 ;;; Drop invalid connection packets
chain=forward action=drop connection-state=invalid
1 ;;; Allow established connections
chain=forward action=accept connection-state=established
2 ;;; Allow related connections
chain=forward action=accept connection-state=related
3 ;;; Allow UDP
chain=forward action=accept protocol=udp
4 ;;; Allow ICMP Ping
chain=forward action=accept protocol=icmp
5 ;;; Access to internet from local network
chain=forward action=accept src-address=192.168.8.0/24 in-interface=ether2
6 ;;; All other forwards drop
chain=forward action=drop
7 ;;; vlan40 to smtp
chain=forward action=accept protocol=tcp dst-address=192.168.8.21 in-interface=vlan40 dst-port=25
8 ;;; vlan54 to smtp
chain=forward action=accept protocol=tcp dst-address=192.168.8.21 in-interface=vlan54 dst-port=25
9 ;;; Access to SMTP servers from local mail server
chain=forward action=accept protocol=tcp src-address=192.168.8.21 in-interface=ether2 dst-port=25
[admin@MikroTik] >
Как видите, наши новые правила оказались после запрещающего правила, поэтому это запрещающее правило удаляем и заново создаем (перед удалением всегнда надо сначало сделать print):
ip firewall filter print chain forward
ip firewall filter remove 6
ip firewall filter add chain forward action=drop comment="All other forwards drop"
Должно получиться следующее:
[admin@MikroTik] > ip firewall filter print chain forward
Flags: X - disabled, I - invalid, D - dynamic
0 ;;; Drop invalid connection packets
chain=forward action=drop connection-state=invalid
1 ;;; Allow established connections
chain=forward action=accept connection-state=established
2 ;;; Allow related connections
chain=forward action=accept connection-state=related
3 ;;; Allow UDP
chain=forward action=accept protocol=udp
4 ;;; Allow ICMP Ping
chain=forward action=accept protocol=icmp
5 ;;; Access to internet from local network
chain=forward action=accept src-address=192.168.8.0/24 in-interface=ether2
6 ;;; vlan40 to smtp
chain=forward action=accept protocol=tcp dst-address=192.168.8.21 in-interface=vlan40 dst-port=25
7 ;;; vlan54 to smtp
chain=forward action=accept protocol=tcp dst-address=192.168.8.21 in-interface=vlan54 dst-port=25
8 ;;; Access to SMTP servers from local mail server
chain=forward action=accept protocol=tcp src-address=192.168.8.21 in-interface=ether2 dst-port=25
9 ;;; All other forwards drop
chain=forward action=drop
[admin@MikroTik] >
Ну, а теперь самое интересно, помечаем входящие соединения, чтобы ответы шли через того провайдера с которого получен запрос:
ip firewall mangle add chain=forward in-interface=vlan40 action=mark-connection new-connection-mark=vlan40_c passthrough=yes
ip firewall mangle add chain=forward in-interface=vlan54 action=mark-connection new-connection-mark=vlan54_c passthrough=yes
ip firewall mangle add chain=prerouting src-address=192.168.8.0/24 connection-mark=vlan40_c action=mark-routing new-routing-mark=vlan40_r passthrough=yes
ip firewall mangle add chain=prerouting src-address=192.168.8.0/24 connection-mark=vlan54_c action=mark-routing new-routing-mark=vlan54_r passthrough=yes
Проверяем результат:
[admin@MikroTik] > ip firewall mangle print
Flags: X - disabled, I - invalid, D - dynamic
0 chain=forward action=mark-connection new-connection-mark=vlan40_c passthrough=yes in-interface=vlan40
1 chain=forward action=mark-connection new-connection-mark=vlan54_c passthrough=yes in-interface=vlan54
2 chain=prerouting action=mark-routing new-routing-mark=vlan40_r passthrough=yes src-address=192.168.8.0/24 connection-mark=vlan40_c
3 chain=prerouting action=mark-routing new-routing-mark=vlan54_r passthrough=yes src-address=192.168.8.0/24 connection-mark=vlan54_c
[admin@MikroTik] >
Добавляем правила маршрутизации:
ip route add routing-mark=vlan40_r gateway=82.19.115.97
ip route add routing-mark=vlan54_r gateway=89.15.64.2
Должно получиться следующее:
[admin@MikroTik] > ip route print detail
Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme, B - blackhole, U - unreachable, P - prohibit
0 A S dst-address=0.0.0.0/0 gateway=82.19.115.97 interface=vlan40 gateway-state=reachable distance=1 scope=30 target-scope=10
1 A S dst-address=0.0.0.0/0 gateway=82.19.115.97 interface=vlan40 gateway-state=reachable distance=1 scope=30 target-scope=10 routing-mark=vlan40_r
2 A S dst-address=0.0.0.0/0 gateway=89.15.64.2 interface=vlan54 gateway-state=reachable distance=1 scope=30 target-scope=10 routing-mark=vlan54_r
3 ADC dst-address=82.19.115.96/29 pref-src=82.19.115.100 interface=vlan40 distance=0 scope=10
4 ADC dst-address=89.15.64.0/26 pref-src=89.15.64.9 interface=vlan54 distance=0 scope=10
5 ADC dst-address=192.168.8.0/24 pref-src=192.168.8.35 interface=ether2 distance=0 scope=10
[admin@MikroTik] >
Проверяем, и радуемся как все работает.

MikroTik и два канала в интернет. Часть 3 - Маршрутизация - 5.0 out of 5 based on 2 votes
В этой статье я приведу примеры с маршрутизацией трафика на несколько провайдеров и расскажу о настройки DNS сервера на RouterOS v3.20

Часть 3. Маршрутизация

В MikroTik RouterOS есть несколько вариантов направлять трафик в нужном направлении:
1.Маркировка трафика через ip firewall mangle с дальнейшей маршрутизацией через ip route
Этот вариант интересен тем, что можно управлять маршрутизацией пакетов основывая на разных критериях, например протоколе. адресе исходящего порта, ip адресе отправителя или получателя, и многих других.
Приведу пример: предположим что весь трафик для сети 10.1.1.0/24 нам надо отправлять через первого провайдера, а 172.16.0.0/24 через второго.
Для этого нужно сделать следующее:
добавляем в нужные нам адреса в список адресов. to_isp1 для первого провайдера, to_isp2 для второго.
ip firewall address-list add address=10.1.10/24 list=to_isp1 comment="route via isp1"
ip firewall address-list add address=172.16.0.0/24 list=to_isp2 comment="route via isp2"

Теперь помечаем пакеты проходящие через маршрутизатор, чтобы для определенного списка адресов шли через определенного провайдера (правила маршрутизации в ip route мы создали во второй части статьи, поэтому их создавать не надо)
ip firewall mangle add chain=prerouting connection-state=new dst-address-list=to_isp1 action=mark-routing new-routing-mark=vlan40_r
ip firewall mangle add chain=prerouting connection-state=new dst-address-list=to_isp2 action=mark-routing new-routing-mark=vlan54_r
Обратите внимание, это правило для соединений проходящих через маршрутизатор (из локальной сети в интернет), если же вы хотите что и соединения с самого маршрутизатора шли по этим правила то необходимо chan prerouting заменить на output:
ip firewall mangle add chain=output connection-state=new dst-address-list=to_isp1 action=mark-routing new-routing-mark=vlan40_r
ip firewall mangle add chain=output connection-state=new dst-address-list=to_isp2 action=mark-routing new-routing-mark=vlan54_r

В будущем, если понадобится, вы можете добавлять/удалять адреса из списка адресов to_isp1 & to_isp2 и не меня правил маршрутизации все будет работать.

2. Непосредственное указание маршрута в Ip route.
При этом способе мы может только указать маршрут по ip адресу получателя. При наличии только ip адреса назначения, это более правильный вариант.
Простой пример:
У каждого провайдера обычно есть свои DNS сервера, и зачастую они обслуживают запросы только из своих подсетей. Предположим у меня ip адрес dns сервера первого провайдера 82.199.96.143, а второго 83.242.139.10, и запросы на них надо направлять только через соответствующих провайдеров.
ip route add dst-address=82.199.96.143 gateway=82.19.115.97
ip route add dst-address=83.242.139.10 gateway=89.15.64.2
Вот и все, пакеты для адреса 82.199.96.143 пойдут через один 82.19.115.97, а для 83.242.139.10 через 89.15.64.2.

Ну. а на последок, предлагаю настроить DNS сервер на самом MikroTik.
По мне так это очень удобно, когда внешний сервер DNS для нескольких провайдеров находится в одном месте, и соответственно для того же MS Active Directory, а именного его сервера DNS лучше указать внешним этот сервер.
ip dns set primary-dns=82.199.96.143 secondary-dns=83.242.139.10 allow-remote-requests=yes
На этом, пока все.

2 комментария:

  1. В офисе 2 сети. в каждй - по серверу. Пользователи первой сети не видят вторую, зато у них есть интернет. Пользователи второй видят обе сети, но не имеют интернета. Как настроить маршрутизацию на роутере Mikrotik, чтобы избранным пользователям первой сети был доступен сервер из второй?

    ОтветитьУдалить
  2. Смотря какая у вас топология сети.
    Что означает 2 сети?
    А) используется 2 разных "адресации" tcp/ip внутри одного сегмента?
    Б) Сети физически в разных сегментах и соединены только через маршрутизатор?

    Как вариант, поместить сервер в третью сеть и настроить доступ к нему для выбранных пользователей, остальное разрулить при помощи firewall / L7

    ОтветитьУдалить