Вибір роутера

Локальные сети и Интернет
Відповісти
Автор
Повідомлення
mumu
Member
Аватар користувача
Звідки: Житомир

Повідомлення

Вітаю,
треба роутер з підтримкою декількох wan і можливістю розподілу навантаження: ліміт на 1 wan 500Гб\місяць, буде від 2-х wan.

думав взяти якийсь cudy, вродє ж опенврт має вміти, але на сайті пишуть про два роутери, що вміють в мультиван(один проводний cudy r700, тому треба ще точку доступу до нього, інший P5 з віфі, але ціна здається високою). І не знаю, чи опенврт вміє в балансування по ліміту трафіку.

зараз пробуємо mikrotik hap ac2 настроїти, трохи складно.і вайфай у нього так собі.
бюджет бажано до 5к, менше буде краще. можна вживане, аби працювало.
Scoffer
Member
Аватар користувача

Повідомлення

mumu: ↑ 10.10.2026 15:00трохи складно
Так у тебе і запит не тривіальний. Стан лічильників має зберігатись між ребутами і звірятись з часом інакше схема зламається.
ШІ питав?
mumu
Member
Аватар користувача
Звідки: Житомир

Повідомлення

Scoffer: ↑ 10.10.2026 15:17Стан лічильників має зберігатись між ребутами і звірятись з часом інакше схема зламається.
так. якщо світло пропаде щоб лог використаного трафіка зберігався.
ШІ, гугл і т.д. питаємо

Дали декілька старлінків з обмеженим пріоріті трафіком, якщо використати ліміт, заберуть акаунти назад :-/ . Тому і треба відповідне рішення.
Scoffer
Member
Аватар користувача

Повідомлення

mumu
спойлер

Код: Виділити все

# ============================================================================
# MikroTik hAP ac² — два WAN із лімітом 500 ГБ на кожного провайдера
# Сумісність: RouterOS 7.x
#
# ПРИЗНАЧЕННЯ
#   • ether1 — WAN1, основний провайдер;
#   • ether2 — WAN2, резервний провайдер;
#   • обидва провайдери мають видавати WAN-адресу через DHCP;
#   • маршрутизатор рахує RX + TX окремо на кожному фізичному WAN-порту;
#   • після досягнення ліміту 500 000 000 000 байтів порт виключається з
#     маршрутизації за замовчуванням, а інший WAN стає основним;
#   • на початку нового календарного місяця обидва ліміти обнуляються;
#   • стан лічильників зберігається у файлі, щоб не починати облік із нуля
#     після звичайного перезавантаження роутера.
#
# ВАЖЛИВО ПЕРЕД ІМПОРТОМ
#   1. Зробіть резервну копію: WinBox → Files → Backup або через Terminal:
#        /system backup save name=before-dualwan
#   2. Підключіться через ether3–ether5 або Wi-Fi. Після імпорту ether2
#      забирається з LAN-моста й стає WAN2; через нього поточне керування
#      роутером може обірватися.
#   3. Цей файл налаштований саме на DHCP. Для PPPoE або статичної WAN-IP
#      конфігурацію потрібно адаптувати.
#   4. Файл змінює DHCP-клієнти ether1/ether2 та створює маршрути з коментарями
#      quota-WAN1 і quota-WAN2. Перевірте наявні нестандартні маршрути, VPN,
#      правила policy routing та інші конфігурації, які можуть обходити ці
#      маршрути.
#   5. Перед автоскиданням перевірте дату, час, часовий пояс і NTP на роутері.
#
# ЯК ІМПОРТУВАТИ
#   Завантажте цей файл у WinBox → Files, потім у Terminal виконайте:
#        /import file-name=hap_ac2_dualwan_500gb_ua_comments.rsc
#   Імпортуйте повну конфігурацію лише один раз. Повторний імпорт повторно
#   перестворює DHCP-клієнти WAN1/WAN2 та службові скрипти/планувальники.
#
# ПРО ОБЛІК ТРАФІКУ
#   500 000 000 000 байтів — це десяткові 500 GB (не 500 GiB).
#   Сумуються лічильники RX і TX фізичного порту. Це практичний підрахунок
#   трафіку інтерфейсу, але він може трохи відрізнятися від білінгу провайдера:
#   провайдер може рахувати інакше, округлювати сесії або враховувати службові
#   заголовки. Монітор перевіряє ліміт раз на хвилину, тому можливе невелике
#   перевищення між перевірками.
# ============================================================================

# --- 1. Переводимо ether2 із LAN у WAN --------------------------------------
# У типовій заводській конфігурації ether2 входить до bridge (LAN). Видаляємо
# лише цей порт із моста, щоб він не об'єднував мережу провайдера з локальною.
:if ([:len [/interface bridge port find where interface="ether2"]] > 0) do={
    /interface bridge port remove [find where interface="ether2"]
}

# --- 2. Створюємо список інтерфейсів WAN і додаємо до нього обидва порти ------
# Типові правила NAT і firewall часто використовують interface-list WAN.
# Перевіряємо наявність списку/учасників, щоб не створювати дублікати.
:if ([:len [/interface list find where name="WAN"]] = 0) do={
    /interface list add name="WAN"
}
:if ([:len [/interface list member find where list="WAN" and interface="ether1"]] = 0) do={
    /interface list member add list="WAN" interface="ether1"
}
:if ([:len [/interface list member find where list="WAN" and interface="ether2"]] = 0) do={
    /interface list member add list="WAN" interface="ether2"
}

# --- 3. Додаємо NAT для виходу локальних пристроїв в інтернет ----------------
# Masquerade підміняє адресу клієнта адресою активного WAN. Правило додається
# лише тоді, коли вже немає такого правила для списку WAN.
:if ([:len [/ip firewall nat find where chain="srcnat" and action="masquerade" and out-interface-list="WAN"]] = 0) do={
    /ip firewall nat add chain=srcnat action=masquerade out-interface-list="WAN" comment="NAT для двох WAN"
}

# --- 4. Очищаємо старі DHCP-клієнти та службові елементи цієї конфігурації ----
# Ці команди стосуються лише ether1/ether2 і елементів із наведеними нижче
# службовими іменами/коментарями. Інші DHCP-клієнти не видаляються.
/ip dhcp-client remove [find where interface="ether1"]
/ip dhcp-client remove [find where interface="ether2"]
/ip route remove [find where comment="quota-WAN1"]
/ip route remove [find where comment="quota-WAN2"]
/system scheduler remove [find where name="Quota-Monitor-Scheduler"]
/system scheduler remove [find where name="Quota-Init-Scheduler"]
/system scheduler remove [find where name="Quota-Monthly-Reset-Scheduler"]
/system script remove [find where name="Quota-Monthly-Reset-Check"]
/system script remove [find where name="Quota-Monitor"]
/system script remove [find where name="Quota-Init"]
/system script remove [find where name="Quota-Reset"]

# --- 5. Файл стану лічильників ----------------------------------------------
# Формат quota-state.txt: total1,previous1,total2,previous2
#   total1    — накопичені байти WAN1 за поточний місяць;
#   previous1 — значення RX+TX лічильника ether1 під час попередньої перевірки;
#   total2    — накопичені байти WAN2 за поточний місяць;
#   previous2 — попереднє значення RX+TX для ether2.
# Якщо файл відсутній, створюємо його з нульовими значеннями.
:if ([:len [/file find where name="quota-state.txt"]] = 0) do={
    /file print file=quota-state
    /file set [find where name="quota-state.txt"] contents="0,0,0,0"
}

# --- 6. Файл-мітка місячного скидання ---------------------------------------
# У ньому зберігається місяць і рік останнього обробленого періоду, наприклад
# oct2026. Це не дає скидати ліміти кожні п'ять хвилин протягом того самого
# місяця. Файл створюється із поточним місяцем, тому сам імпорт не скидає квоту.
:if ([:len [/file find where name="quota-month-marker.txt"]] = 0) do={
    /file print file=quota-month-marker
    :local d [/system clock get date]
    :local monthId ([:pick $d 0 3] . [:pick $d 7 11])
    /file set [find where name="quota-month-marker.txt"] contents=$monthId
}

# --- 7. Ініціалізація після запуску роутера ---------------------------------
# Після перезавантаження апаратні лічильники інтерфейсів можуть початися з
# нуля. Накопичені total1/total2 НЕ обнуляємо — лише записуємо поточні значення
# RX+TX як нову базу для наступного розрахунку приросту.
/system script add name="Quota-Init" policy=read,write,ftp source={
    :local f [/file find where name="quota-state.txt"]
    :local data [/file get $f contents]
    :local p1 [:find $data ","]
    :local p2 [:find $data "," ($p1 + 1)]
    :local p3 [:find $data "," ($p2 + 1)]
    :local total1 [:tonum [:pick $data 0 $p1]]
    :local total2 [:tonum [:pick $data ($p2 + 1) $p3]]
    :local i1 [/interface find where name="ether1"]
    :local i2 [/interface find where name="ether2"]
    :local now1 ([/interface get $i1 rx-byte] + [/interface get $i1 tx-byte])
    :local now2 ([/interface get $i2 rx-byte] + [/interface get $i2 tx-byte])
    /file set $f contents=($total1 . "," . $now1 . "," . $total2 . "," . $now2)
}

# --- 8. Основний монітор: рахує приріст і керує маршрутами -------------------
# Запускається планувальником раз на хвилину. Для кожного WAN:
#   1) читає збережені суми та попередні показники інтерфейсу;
#   2) обчислює приріст RX+TX з моменту попередньої перевірки;
#   3) додає його до місячного підсумку та записує стан у файл;
#   4) якщо квота вичерпана — вимикає відповідний маршрут;
#   5) надає WAN1 вищий пріоритет, якщо на ньому ще є трафік.
/system script add name="Quota-Monitor" policy=read,write,ftp source={
    # Ліміт одного WAN: 500 GB у десятковому вимірі, у байтах.
    :local limit 500000000000
    :local f [/file find where name="quota-state.txt"]
    :local data [/file get $f contents]
    :local p1 [:find $data ","]
    :local p2 [:find $data "," ($p1 + 1)]
    :local p3 [:find $data "," ($p2 + 1)]
    :local total1 [:tonum [:pick $data 0 $p1]]
    :local prev1 [:tonum [:pick $data ($p1 + 1) $p2]]
    :local total2 [:tonum [:pick $data ($p2 + 1) $p3]]
    :local prev2 [:tonum [:pick $data ($p3 + 1) [:len $data]]]
    :local before1 $total1
    :local before2 $total2

    # Поточне сумарне значення лічильників RX+TX на фізичних WAN-портах.
    :local i1 [/interface find where name="ether1"]
    :local i2 [/interface find where name="ether2"]
    :local now1 ([/interface get $i1 rx-byte] + [/interface get $i1 tx-byte])
    :local now2 ([/interface get $i2 rx-byte] + [/interface get $i2 tx-byte])
    :local delta1 0
    :local delta2 0

    # Якщо лічильник став меншим за попередній (наприклад, його скинули),
    # беремо поточне значення як новий приріст, щоб не віднімати байти.
    :if ($now1 >= $prev1) do={ :set delta1 ($now1 - $prev1) } else={ :set delta1 $now1 }
    :if ($now2 >= $prev2) do={ :set delta2 ($now2 - $prev2) } else={ :set delta2 $now2 }

    # Додаємо приріст до місячних сум і зберігаємо суму разом із новою базою.
    :set total1 ($total1 + $delta1)
    :set total2 ($total2 + $delta2)
    /file set $f contents=($total1 . "," . $now1 . "," . $total2 . "," . $now2)

    # Пишемо попередження в системний журнал у момент першого перетину ліміту.
    :if (($before1 < $limit) && ($total1 >= $limit)) do={ :log warning "WAN1: вичерпано ліміт 500 ГБ; перехід на WAN2, якщо він доступний" }
    :if (($before2 < $limit) && ($total2 >= $limit)) do={ :log warning "WAN2: вичерпано ліміт 500 ГБ" }

    # Менше значення distance означає вищий пріоритет маршруту.
    # Звичайний режим: WAN1 distance=1, WAN2 distance=2.
    # WAN1 вичерпав квоту: WAN1 distance=10, WAN2 distance=1.
    # WAN2 вичерпав квоту: WAN1 distance=1, WAN2 distance=10.
    # Обидві квоти вичерпано: обидва маршрути вимикаються нижче.
    :local distance1 1
    :local distance2 2
    :if ($total1 >= $limit) do={ :set distance1 10; :set distance2 1 }
    :if ($total2 >= $limit) do={ :set distance2 10; :set distance1 1 }
    :if (($total1 >= $limit) && ($total2 >= $limit)) do={ :set distance1 10; :set distance2 10 }

    # Шукаємо саме наші маршрути за службовим коментарем. DHCP-клієнт може
    # ще не отримати адресу/шлюз, тому також перевіряємо стан обох оренд.
    :local r1 [/ip route find where comment="quota-WAN1"]
    :local r2 [/ip route find where comment="quota-WAN2"]
    :local c1 [/ip dhcp-client find where interface="ether1"]
    :local c2 [/ip dhcp-client find where interface="ether2"]
    :local bound1 false
    :local bound2 false
    :if ([:len $c1] > 0) do={ :if ([/ip dhcp-client get $c1 status] = "bound") do={ :set bound1 true } }
    :if ([:len $c2] > 0) do={ :if ([/ip dhcp-client get $c2 status] = "bound") do={ :set bound2 true } }

    # WAN1 активний лише тоді, коли квота не вичерпана і DHCP отримав адресу.
    :if ([:len $r1] > 0) do={
        :if (($total1 >= $limit) || ($bound1 = false)) do={
            /ip route set $r1 disabled=yes distance=$distance1
        } else={
            /ip route set $r1 disabled=no distance=$distance1
        }
    }
    # WAN2 працює за тим самим принципом, але має нижчий пріоритет у нормі.
    :if ([:len $r2] > 0) do={
        :if (($total2 >= $limit) || ($bound2 = false)) do={
            /ip route set $r2 disabled=yes distance=$distance2
        } else={
            /ip route set $r2 disabled=no distance=$distance2
        }
    }
}

# --- 9. Ручне/автоматичне обнулення обох місячних лімітів --------------------
# Обнуляємо тільки накопичені суми. Поточні показники інтерфейсів записуються
# як базові значення, щоб трафік до моменту скидання не потрапив у новий місяць.
# Скрипт також можна запустити вручну командою:
#        /system script run Quota-Reset
/system script add name="Quota-Reset" policy=read,write,ftp source={
    :local f [/file find where name="quota-state.txt"]
    :local i1 [/interface find where name="ether1"]
    :local i2 [/interface find where name="ether2"]
    :local now1 ([/interface get $i1 rx-byte] + [/interface get $i1 tx-byte])
    :local now2 ([/interface get $i2 rx-byte] + [/interface get $i2 tx-byte])
    /file set $f contents=("0," . $now1 . ",0," . $now2)
    :log warning "Ліміти WAN1 і WAN2 обнулено; почався новий період обліку"
}

# --- 10. Перевірка зміни місяця для автоматичного скидання -------------------
# Запускається раз на 5 хвилин. Якщо поточний місяць/рік відрізняється від
# маркера, ліміти обнуляються один раз, маркер оновлюється, а монітор запускається
# знову, щоб відразу застосувати потрібний стан маршрутів.
# Якщо роутер був вимкнений першого числа, скидання станеться після його
# ввімкнення та першої перевірки. Для коректної роботи необхідний правильний час.
/system script add name="Quota-Monthly-Reset-Check" policy=read,write,ftp source={
    :local d [/system clock get date]
    :local currentMonth ([:pick $d 0 3] . [:pick $d 7 11])
    :local f [/file find where name="quota-month-marker.txt"]
    :local previousMonth [/file get $f contents]
    :if ($currentMonth != $previousMonth) do={
        /system script run Quota-Reset
        /file set $f contents=$currentMonth
        /system script run Quota-Monitor
        :log warning ("Автоматичне місячне скидання лімітів завершено: " . $currentMonth)
    }
}

# --- 11. DHCP-клієнти для WAN1 і WAN2 ---------------------------------------
# DHCP автоматично отримує адресу та шлюз провайдера. add-default-route=no
# вимикає створення автоматичного маршруту за замовчуванням: маршрути створює
# наш скрипт із фіксованими коментарями quota-WAN1 і quota-WAN2, щоб керувати
# пріоритетом і квотою незалежно для кожного провайдера.
# Маршрути спочатку створюються вимкненими, а Quota-Monitor їх увімкне після
# перевірки, що DHCP прив'язаний і ліміт ще не вичерпаний.
/ip dhcp-client add interface=ether1 add-default-route=no use-peer-dns=no use-peer-ntp=yes disabled=no script={
    :local r [/ip route find where comment="quota-WAN1"]
    :if ($bound = 1) do={
        :if ([:len $r] = 0) do={
            /ip route add dst-address=0.0.0.0/0 gateway=$"gateway-address" distance=1 check-gateway=ping disabled=yes comment="quota-WAN1"
        } else={
            /ip route set $r gateway=$"gateway-address"
        }
    } else={
        :if ([:len $r] > 0) do={ /ip route set $r disabled=yes }
    }
}
/ip dhcp-client add interface=ether2 add-default-route=no use-peer-dns=no use-peer-ntp=yes disabled=no script={
    :local r [/ip route find where comment="quota-WAN2"]
    :if ($bound = 1) do={
        :if ([:len $r] = 0) do={
            /ip route add dst-address=0.0.0.0/0 gateway=$"gateway-address" distance=2 check-gateway=ping disabled=yes comment="quota-WAN2"
        } else={
            /ip route set $r gateway=$"gateway-address"
        }
    } else={
        :if ([:len $r] > 0) do={ /ip route set $r disabled=yes }
    }
}

# --- 12. Перший запуск і планувальники --------------------------------------
# Quota-Init оновлює стартові показники інтерфейсів без втрати накопиченої суми.
# Quota-Monitor перевіряє ліміти щохвилини; це визначає точність відключення.
# Quota-Monthly-Reset-Scheduler перевіряє зміну календарного місяця кожні 5 хв.
/system script run Quota-Init
/system scheduler add name="Quota-Init-Scheduler" start-time=startup interval=0s on-event="/system script run Quota-Init" policy=read,write,ftp
/system scheduler add name="Quota-Monitor-Scheduler" start-time=startup interval=1m on-event="/system script run Quota-Monitor" policy=read,write,ftp
/system scheduler add name="Quota-Monthly-Reset-Scheduler" start-time=startup interval=5m on-event="/system script run Quota-Monthly-Reset-Check" policy=read,write,ftp

# --- Корисні команди для перевірки після імпорту ----------------------------
# Переконатися, що обидва DHCP-клієнти отримали адресу:
#   /ip dhcp-client print detail
# Переглянути маршрути, які перемикає скрипт:
#   /ip route print detail where comment~"quota-WAN"
# Переглянути останні повідомлення про квоти:
#   /log print where message~"WAN|ліміт|скидання"
# Подивитися збережені значення обліку:
#   /file print detail where name="quota-state.txt"
# Перевірити планувальники:
#   /system scheduler print detail
# Скинути вручну обидва ліміти:
#   /system script run Quota-Reset
Ось заставив суперінтелект клода попрацювати :laugh: На перший погляд щось схоже на правду.
На оперврт сильно простіше не буде. До речі опенврт ставиться на hAP ac²
https://openwrt.org/toh/mikrotik/hap_ac2
Так що купляти новий роутер не треба в будь-якому випадку.
Відповісти