Резервирование и подсети на HAP Lite (RB941-2nD-TC)

Обсуждение оборудования и его настройки
xvo
Сообщения: 4204
Зарегистрирован: 25 фев 2018, 22:41
Откуда: Москва

Отсюда: https://wiki.mikrotik.com/wiki/ECMP_loa ... masquerade
Routing table flushing
Every time when something triggers flush of the routing table and ECMP cache is flushed. Connections will be assigned to gateways once again and may or may not be on the same gateway.(in case of 2 gateways there are 50% chance that traffic will start to flow via other gateway).


If you have fully routed network (clients address can be routed via all available gateway), change of the gateway will have no ill effect, but in case you use masquerade, change of the gateway will result in change of the packet's source address and connection will be dropped.


Routing table flush can be caused by 2 things:

1) routing table change (dynamic routing protocol update, user manual changes)

2) every 10 minutes routing table is flushed for security reasons (to avoid possible DoS attacks)

So even if you do not have any changes of routing table, connections may jump to other gateway every 10 minutes


Telegram: @thexvo
ShadowNet
Сообщения: 19
Зарегистрирован: 19 янв 2021, 18:45

А теперь?

Код: Выделить всё

/interface list add name=LAN comment "Internal network"
/interface list add name=WAN comment "Internet"
/interface list add name=ISP1 comment "1-st provider"
/interface list add name=ISP2 comment "2-nd provider"
/interface list member add interface=ether1 list=WAN
/interface list member add interface=ether1 list=ISP1
/interface list member add interface=ether2 list=WAN
/interface list member add interface=ether2 list=ISP2
#
/interface bridge add name=bridge disabled=no auto-mac=yes protocol-mode=rstp
/interface bridge port add bridge=bridge interface=ether3
/interface bridge port add bridge=bridge interface=ether4
#
/interface list member add interface=bridge list=LAN
#
/ip dhcp-client add interface=ether1 disabled=no add-default-route=no
/ip dhcp-client add interface=ether2 disabled=no add-default-route=no
/ip address add address=192.168.22.1/24 interface=bridge
/ip pool add name="default-dhcp" ranges=192.168.22.23-192.168.22.255
/ip dhcp-server add name=def-dhcp address-pool="default-dhcp" interface=bridge lease-time=10m disabled=no
/ip dhcp-server network add address=192.168.22.0/24 gateway=192.168.22.1
#
# скроем за NAT все что выходит из локальной сети
/ip firewall nat add src-address=192.168.22.0/24 action=masquerade chain=srcnat
#
#Пометим каждое соединение пришедшее снаружи и адресованное нашему роутеру:
/ip firewall mangle add action=mark-connection chain=input in-interface-list=ISP1 new-connection-mark=cin_ISP1
/ip firewall mangle add action=mark-connection chain=input in-interface-list=ISP2 new-connection-mark=cin_ISP2
#
#чтобы отвечать через те же интерфейсы, откуда пришли запросы, поставим соответствующую роутинг-марку на каждое соединение.
/ip firewall mangle add action=mark-routing chain=output connection-mark=cin_ISP1 new-routing-mark=rout_ISP1 passthrough=no
/ip firewall mangle add action=mark-routing chain=output connection-mark=cin_ISP2 new-routing-mark=rout_ISP2 passthrough=no
#
#добавим default gateway в каждую из промаркированных таблиц маршрутизации:
/ip route add distance=1 gateway=192.168.10.1 routing-mark=rout_ISP1 check-gateway=ping
/ip route add distance=1 gateway=192.168.0.1 routing-mark=rout_ISP2 check-gateway=ping
#
#промаркируем весь траффик из локальной сети
/ip firewall mangle add src-address=192.168.22.0/24 action=mark-routing chain=prerouting new-routing-mark=mixed
#
#используем ECMP для балансировки траффика из локальной сети
/ip route add dst-address=0.0.0.0/0 gateway=192.168.10.1,192.168.0.1 routing-mark=mixed


xvo
Сообщения: 4204
Зарегистрирован: 25 фев 2018, 22:41
Откуда: Москва

Пробуйте, тестируйте.
Но смысл не поменялся.


Telegram: @thexvo
ShadowNet
Сообщения: 19
Зарегистрирован: 19 янв 2021, 18:45

Работает вроде.

Как я понимаю, неприятие вызывает ситуация - что раз в 10 минут таблица рутинга перехешируется, и уже установленные соединения могут из-за этого поломаться?


xvo
Сообщения: 4204
Зарегистрирован: 25 фев 2018, 22:41
Откуда: Москва

Именно так.


Telegram: @thexvo
ShadowNet
Сообщения: 19
Зарегистрирован: 19 янв 2021, 18:45

Ну тогда вот:

Код: Выделить всё

/interface list add name=LAN comment "Internal network"
/interface list add name=WAN comment "ISP"
/interface list add name=ISP1 comment "1-st provider"
/interface list add name=ISP2 comment "2-nd provider"
/interface list member add interface=ether1 list=WAN
/interface list member add interface=ether2 list=WAN
/interface list member add interface=ether1 list=ISP1
/interface list member add interface=ether2 list=ISP2
#
/interface bridge add name=bridge disabled=no auto-mac=yes protocol-mode=rstp
/interface bridge port add bridge=bridge interface=ether3
/interface bridge port add bridge=bridge interface=ether4
#
/interface list member add interface=bridge list=LAN
#
/ip dhcp-client add interface=ether1 disabled=no add-default-route=no
/ip dhcp-client add interface=ether2 disabled=no add-default-route=no
/ip address add address=192.168.22.1/24 interface=bridge
/ip pool add name="dhcp-pool" ranges=192.168.22.23-192.168.22.254
/ip dhcp-server add name=def-dhcp address-pool="dhcp-pool" interface=bridge lease-time=1d disabled=no
/ip dhcp-server network add address=192.168.22.0/24 gateway=192.168.22.1
/ip dhcp-server lease add address=192.168.22.222 mac-address=AA:AA:AA:AA:AA:AA server=def-dhcp
/ip dhcp-server lease add address=192.168.22.254 mac-address=BB:BB:BB:BB:BB:BB server=def-dhcp
#
/ip firewall nat add action=masquerade chain=srcnat out-interface-list=ISP1
/ip firewall nat add action=masquerade chain=srcnat out-interface-list=ISP2
#
/ip firewall mangle add chain=input dst-address=192.168.10.1 in-interface-list=ISP1 action=mark-connection new-connection-mark=ISP1-conn-In
/ip firewall mangle add chain=output connection-mark=ISP1-conn-In action=mark-routing new-routing-mark=ISP1-conn-Out passthrough=no
/ip firewall mangle add chain=forward in-interface-list=ISP1 action=mark-connection new-connection-mark=ISP1-conn-Forward passthrough=no
#
/ip firewall mangle add chain=input dst-address=192.168.0.1 in-interface-list=ISP2 action=mark-connection new-connection-mark=ISP2-conn-In
/ip firewall mangle add chain=output connection-mark=ISP2-conn-In action=mark-routing new-routing-mark=ISP2-conn-Out passthrough=no
/ip firewall mangle add chain=forward in-interface-list=ISP2 action=mark-connection new-connection-mark=ISP2-conn-Forward passthrough=no
#
/ip firewall address-list add list=LocalNet address=192.168.22.0/24
/ip firewall address-list add list=LocalNet address=192.168.33.0/24
#
/ip firewall mangle add chain=prerouting src-address=192.168.22.0/24 dst-address-list=!LocalNet per-connection-classifier=src-address-and-port:2/0 action=mark-routing new-routing-mark=ISP1-conn-Out 
/ip firewall mangle add chain=prerouting src-address=192.168.22.0/24 dst-address-list=!LocalNet per-connection-classifier=src-address-and-port:2/1 action=mark-routing new-routing-mark=ISP2-conn-Out
#
/ip route add dst-address=0.0.0.0/0 gateway=192.168.10.1 distance=1 check-gateway=arp
/ip route add dst-address=0.0.0.0/0 gateway=192.168.0.1 distance=2 check-gateway=arp
#
/ip route add dst-address=0.0.0.0/0 gateway=192.168.10.1 distance=1 check-gateway=arp routing-mark=ISP1-conn-Out
/ip route add dst-address=0.0.0.0/0 gateway=192.168.0.1 distance=1 check-gateway=arp routing-mark=ISP2-conn-Out
#
/ip route add dst-address=192.168.33.0/24 gateway=192.168.22.222 distance=1
Даже локальный трафик куда не надо не заворачиваю. Балансинг на основе PCC.

Осталось scope прикрутить, и будет совсем годно imho.


xvo
Сообщения: 4204
Зарегистрирован: 25 фев 2018, 22:41
Откуда: Москва

Ну вот как-то так, да.
Проверенный вариант, так сказать.

Единственное, входящие соединения помечаются в input, что не вполне логично: если какие-то порты будут проброшены внутрь, то они пролетят непомеченными. Лучше тоже делать это в prerouting.
И та же история с PCC - у вас он помечает сразу роутинг, без разбора. И ответные пакеты на проброшенные соединения вполне могут улететь не туда, откуда пришли, даже если у них будут метки соединений.

Поэтому (хотя это и не единственная причина) я всегда сначала помечаю соединения, в том числе и исходящие. А routing mark расставляю только на основе уже проставленных меток соединений.


Telegram: @thexvo
ShadowNet
Сообщения: 19
Зарегистрирован: 19 янв 2021, 18:45

Нашёл на Хабре замечательнейшую статью Владимира @prislonsky "Мультиван и маршрутизация на Mikrotik RouterOS".

Теперь моя конфигурация выглядит так:

Код: Выделить всё

/interface list
add name=WAN comment "ISP"
add name=LAN comment "Internal network"
add name=ISP1 comment "1-st provider"
add name=ISP2 comment "2-nd provider"

member add interface=ether1 list=WAN comment=ISP1
member add interface=ether2 list=WAN comment=ISP2 
member add interface=ether1 list=ISP1 comment="1-st provider"
member add interface=ether2 list=ISP2 comment="2-nd provider"
member add interface=ether3 list=LAN comment=LAN1
member add interface=ether4 list=LAN comment=LAN2

/interface ethernet set ether1 comment="to ISP1"
/interface ethernet set ether2 comment="to ISP2"
/interface ethernet set ether3 comment="to LAN1"
/interface ethernet set ether4 comment="to LAN2"

#
/ip neighbor discovery-settings set discover-interface-list=!WAN
/tool mac-server set allowed-interface-list=LAN
/tool mac-server mac-winbox set allowed-interface-list=LAN

/ip firewall filter add action=accept chain=input comment="Related Established Untracked Allow" connection-state=established,related,untracked
/ip firewall filter add action=accept chain=input comment="ICMP from ALL" protocol=icmp
/ip firewall filter add action=accept chain=forward comment="Established, Related, Untracked allow" connection-state=established,related,untracked
/ip firewall filter add action=drop chain=forward comment="Invalid drop" connection-state=invalid
/ip firewall filter add action=drop chain=forward comment="Drop all from WAN not DSTNATed" connection-nat-state=!dstnat connection-state=new in-interface-list=WAN

/ip firewall mangle add action=mark-connection chain=prerouting \
comment="Connmark in from ISP1" connection-mark=no-mark in-interface-list=ISP1 \
new-connection-mark=conn_isp1 passthrough=no per-connection-classifier=src-address-and-port:2/0

/ip firewall mangle add action=mark-connection chain=prerouting \
comment="Connmark in from ISP2" connection-mark=no-mark in-interface-list=ISP2 \
new-connection-mark=conn_isp2 passthrough=no per-connection-classifier=src-address-and-port:2/1

/ip firewall mangle add action=mark-routing chain=prerouting \
comment="Routemark transit out via ISP1" connection-mark=conn_isp1 \
dst-address-type=!local in-interface-list=!WAN new-routing-mark=to_isp1 passthrough=no

/ip firewall mangle add action=mark-routing chain=prerouting \
comment="Routemark transit out via ISP2" connection-mark=conn_isp2 \
dst-address-type=!local in-interface-list=!WAN new-routing-mark=to_isp2 passthrough=no

/ip firewall mangle add action=mark-routing chain=output \
comment="Routemark local out via ISP1" connection-mark=conn_isp1 \
dst-address-type=!local new-routing-mark=to_isp1 passthrough=no

/ip firewall mangle add action=mark-routing chain=output \
comment="Routemark local out via ISP2" connection-mark=conn_isp2 \
dst-address-type=!local new-routing-mark=to_isp2 passthrough=no

#
/interface bridge
add name=bridge disabled=no auto-mac=yes protocol-mode=rstp
port add bridge=bridge interface=ether3
port add bridge=bridge interface=ether4
#
/ip address add address=192.168.22.1/24 interface=bridge
#
/interface list member add interface=bridge list=LAN comment=Bridge-Local

/interface bridge add name=br-lo comment="Loopback interface"
/ip route add distance=254 gateway=br-lo comment="Emergency route"

/ip route add check-gateway=ping comment="For recursion via ISP1" \
distance=1 dst-address=1.1.1.1 gateway=192.168.10.1 scope=10	

/ip route add check-gateway=ping comment="For recursion via ISP2" \
distance=1 dst-address=8.8.8.8 gateway=192.168.0.1 scope=10	

#
/ip dhcp-client

add add-default-route=no disabled=yes interface=ether1 script=":if (\$bound=1) do={\r\
    \n   /ip route remove [ find gateway=\"1.1.1.1\" ]; /ip route remove \
          [ find where dst-address ~\"1.1.1.1\" ]\r\
    \n   /ip route add check-gateway=ping comment=\"For recursion via ISP1\" \
          distance=1 dst-address=1.1.1.1/32 gateway=\$\"gateway-address\" scope=10\r\
    \n   /ip route add check-gateway=ping comment=\"Unmarked via ISP1\" \
          distance=1 gateway=1.1.1.1\r\
    \n   /ip route add comment=\"Marked via ISP1 Backup1\" distance=2 gateway=1.1.1.1 \
          routing-mark=to_isp2\r\
    \n   /ip route add comment=\"Marked via ISP2 Main\" distance=1 \
          gateway=8.8.8.8 routing-mark=to_isp1\r\
    \n   /ip firewall nat add action=src-nat chain=srcnat ipsec-policy=out,none \
          out-interface=\$\"interface\" to-addresses=\$\"lease-address\" \
          comment=\"NAT via ISP1\"\r\
    \n   /ip route rule add comment=\"From ISP1 IP to Inet\" \
          src-address=\$\"lease-address\" table=to_isp1 \r\
    \n} else={\r\
    \n   /ip route remove [ find gateway=\"1.1.1.1\" ]; /ip route remove \
          [ find where dst-address ~\"1.1.1.1\" ]\r\
    \n   /ip firewall nat remove  [find comment=\"NAT via ISP1\"]\r\
    \n   /ip route rule remove [find comment=\"From ISP1 IP to Inet\"]\r\
    \n}\r\
    \n" use-peer-dns=no use-peer-ntp=no

add add-default-route=no disabled=yes interface=ether2 script=":if (\$bound=1) do={\r\
    \n   /ip route remove [ find gateway=\"8.8.8.8\" ]; /ip route remove \
          [ find where dst-address ~\"8.8.8.8\" ]\r\
    \n   /ip route add check-gateway=ping comment=\"For recursion via ISP2\" \
          distance=1 dst-address=8.8.8.8/32 gateway=\$\"gateway-address\" scope=10\r\
    \n   /ip route add check-gateway=ping comment=\"Unmarked via ISP2\" \
          distance=1 gateway=8.8.8.8\r\
    \n   /ip route add comment=\"Marked via ISP2 Main\" distance=1 gateway=8.8.8.8 \
          routing-mark=to_isp2\r\
    \n   /ip route add comment=\"Marked via ISP1 Backup1\" distance=2 \
          gateway=1.1.1.1 routing-mark=to_isp1\r\
    \n   /ip firewall nat add action=src-nat chain=srcnat ipsec-policy=out,none \
          out-interface=\$\"interface\" to-addresses=\$\"lease-address\" \
          comment=\"NAT via ISP2\"\r\
    \n   /ip route rule add comment=\"From ISP2 IP to Inet\" \
          src-address=\$\"lease-address\" table=to_isp2 \r\
    \n} else={\r\
    \n   /ip route remove [ find gateway=\"8.8.8.8\" ]; /ip route remove \
          [ find where dst-address ~\"8.8.8.8\" ]\r\
    \n   /ip firewall nat remove  [find comment=\"NAT via ISP2\"]\r\
    \n   /ip route rule remove [find comment=\"From ISP2 IP to Inet\"]\r\
    \n}\r\
    \n" use-peer-dns=no use-peer-ntp=no

/
#

/ip pool add name="dhcp-pool" ranges=192.168.22.23-192.168.22.254
#
/ip dhcp-server
add name=def-dhcp address-pool="dhcp-pool" interface=bridge lease-time=5m disabled=no
network add address=192.168.22.0/24 gateway=192.168.22.1
lease add address=192.168.22.222 mac-address=AA:AA:AA:AA:AA:AA server=def-dhcp
lease add address=192.168.22.254 mac-address=BB:BB:BB:BB:BB:BB server=def-dhcp

/
#

/ip firewall mangle add action=mark-routing chain=prerouting \
comment="Address List via ISP1" new-routing-mark=to_isp1 \
passthrough=no src-address-list=Via_ISP1
/ip firewall mangle add action=mark-routing chain=prerouting \
comment="Address List via ISP2" new-routing-mark=to_isp2 \
passthrough=no src-address-list=Via_ISP2

/ip dns set servers=1.0.0.1,8.8.4.4
/system ntp client set enabled=yes \
server-dns-names=0.pool.ntp.org,1.pool.ntp.org,2.pool.ntp.org

/ip route add dst-address=192.168.33.0/24 gateway=192.168.22.222 distance=1
/ip dhcp-client enable 0
/ip dhcp-client enable 1
Все марки развешиваются на prerouting'ах. Мультиван тоже есть. Кстати, нифига не панацея. Он разбрасывает юзеров равномерно по шлюзам. На большом их(юзеров) количестве достигается профит. А если я в сети один? Пошлют меня по роутингу, и буду я втыкать в единственный маршрут. Но не всё так грустно. Есть ещё IPTV приставка с халявными листами. Планируется сетевое хранилище, совмещённое с торрентокачалкой. Периодически подцепляются планшеты и телефоны, которые тоже интернет сосут. В общем, не зря заморочился.
Можно посмотреть острым взглядом, не налажал ли я где? У меня лёгкие сомнения в маршрутизации. Не совсем ещё въехал в эту тему.
И ещё: нужно ли прописывать blackhole маршруты с большим весом, чтобы коннекты поскорей рубились при отвале провайдера?


xvo
Сообщения: 4204
Зарегистрирован: 25 фев 2018, 22:41
Откуда: Москва

Ну так, беглым взглядом, вроде все по фен-шую.

Вот только в правилах цепочки output вот это условие лишнее: dst-address-type=!local
Там же только то, что исходит с самого роутера, так что зачем проверять, что оно же и не идет на него же?

По поводу равномерности: у вас там в PCC классификация на основе src-address-and-port, так что оно вполне будет размазывать по разным WAN'ам и разные соединения от одного и того же клиента.

Что касается blackhole - идея интересная, но по факту оно и без этого нормально переключается. Есть желание - потестируйте.
Интересно, например, не поможет ли это в случае с какими-нибудь склонными к "залипанию" udp-соединениями вроде sip или ipsec.


Telegram: @thexvo
ShadowNet
Сообщения: 19
Зарегистрирован: 19 янв 2021, 18:45

xvo писал(а): 25 янв 2021, 12:24 Что касается blackhole - идея интересная, но по факту оно и без этого нормально переключается.
IPTV box при смене провайдера тупо зависает, вертя часики. Может очень долго ждать - пока тот, через которого установлено соединение, не появится. Если же выбрать другой канал - всё радостно начнёт показываться и с альтернативного в рамках текущей сессии. Т.е. не надо даже из программы выходить. При попытке сразу же после переключения вернуться на зависший канал - он тоже будет воспроизводиться. Ну конечно - соединения-то сбросили при переходе.

Ping <какой-нибудь внешний адрес> -t тоже таймауты кажет, хотя рутинги уже поменялись. Опять же в рамках активной задачи. Если закрыть командную строку и запустить заново, тоже всё нормализуется.

Я в этом ключе исповедую путь перфекциониста. Переключились маршруты? - ок, скокатотам пакетов потерялось. Но когда стал активным другой провайдер - будь добр пинговать через него. Без лишних телодвижений, ибо иначе это не резервирование, а костыли. С таким же успехом я могу в ван устройства резервный кабель переткнуть, срубить задачу, и заново пингануть. Где здесь автоматизация?
xvo писал(а):Интересно, например, не поможет ли это в случае с какими-нибудь склонными к "залипанию" udp-соединениями вроде sip или ipsec.
Собственно, в контексте именно этих приложений я на Хабре нашёл совет использовать "чёрные дыры". Чтобы всё не висло, а работало. Автор утверждал, что добавление этих маршрутов в конфигурацию решает проблему. Всего лишь одной строчкой.


Ответить