Биллинговая система Nodeny
29 Марта 2024, 07:29:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Прекращена поддержка версии Nodeny 49
 
   Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]
  Печать  
Автор Тема: Mikrotik и ip unnumbered  (Прочитано 11690 раз)
Cell
NoDeny
Спец
*

Карма: 52
Offline Offline

Сообщений: 1444



Просмотр профиля
« : 15 Декабря 2017, 08:18:17 »

Для превращения роутера с RouterOS на борту в полноценный IPoE BRAS мне не хватает ip unnumbered.
Ну как бы аналог ip unnumbered как и в любом линуксе на микротике запилить довольно просто - добавляя соответствующие маршруты вручную. Так и делал раньше, пока мне это не надоело. Но потом, потратив определенную часть своей жизни на изучение гомноскриптов родилось вот такое решение:

Реальная сеть добавляется в networks обычным образом, и реальники начинают выдаваться при помощи связки dhcp+radius и все бы хорошо, но у клиента с реальником ничего не работает. Во-первых на всех влан интерфейсах необходимо переключить ARP  в режим proxy-arp. Во-вторых создадим бридж с названием lo и не будем в него добавлять никаких портов (это будет наш аналог localhost), присвоим этому интерфейсу ip адрес, который будет являться шлюзом для всех остальных клиентов, с реальными адресами, разбросанных по вланам (в примере это 193.55.37.1 - чей это адрес хз, придумал на ходу) В третьих на каждом из dhcp серверов (на микротик они поднимаются для каждого влана отдельно) в поле Lease Script добавляем следующий скрипт:
Код:
:local realgw "193.55.37.1";
:if ($leaseBound = 1) do={
/ip dhcp-server lease;
:foreach i in=[find dynamic=yes] do={
:local dhcpip
:set dhcpip [ get $i address ];
:if ($leaseActIP = $dhcpip) do={
                                 :if ([:put ($dhcpip&255.255.0.0)]="193.55.0.0") do={
                                  if ([:len [/ip route find where dst-address=$dhcpip."/32"]] >0)    do={                            
                           /log warn "New Real IP already added $dhcpip";
                                     } else={
                                                   /log error "New real IP $dhcpip";
                                                   /ip route add distance=1 dst-address=$dhcpip gateway=[/ip dhcp-server get [/ip dhcp-server find name=$leaseServerName] interface] pref-src=$realgw;
        }
        }
           }
     }
}
Все, после сохранения, маршруты начнут добавляться автоматически (если их конечно нет). В логе появляются красивые разноцветные записи ))) error и warn - это для красоты, можно заменить на info и все будет черно-белое как тюремная стена.
В строке скрипта
Цитировать
:if ([:put ($dhcpip&255.255.0.0)]="193.55.0.0") do={
Идет определение, реальник используется или нет, поэтому необходимо подогнать под свою реальную сеть.

Есть один недостаток у этого способа: Если вы решите переместить юзера, с уже прикрученым реальником и маршрутом в другой влан - то маршрут в новый влан не добавится - его сначала придется вручную убрать из старого.
Этот же способ подходит, если у вас несколько роутеров, а реальная сеть одна несчастная... и что же делать? Да все точно так же делается, только связываете между собой роутеры динамической маршрутизацией, чтобы каждый из роутеров в сети всегда знал где какой адрес находится. Я для этого использую iBGP (если нет своей AS можно использовать фейковое пространство)
Записан
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
*

Карма: 116
Offline Offline

Сообщений: 1059



Просмотр профиля
« Ответ #1 : 22 Декабря 2017, 15:58:36 »

Вот тебе делать-то нефиг ))
Записан
Cell
NoDeny
Спец
*

Карма: 52
Offline Offline

Сообщений: 1444



Просмотр профиля
« Ответ #2 : 22 Декабря 2017, 16:36:41 »

Вот тебе делать-то нефиг ))
Видимо да, т.к. это походу никому не нужно. В скрипте есть синтаксическая ошибка, но всех все устроило )))
Это же вам не пиликать на каждом шагу о "магии" циско )))
Записан
0xbad0c0d3
гуру nodeny )
NoDeny
Спец
*

Карма: 116
Offline Offline

Сообщений: 1059



Просмотр профиля
« Ответ #3 : 26 Декабря 2017, 13:27:50 »

Веселый Погоди, сейчас создадут 100500 трелов по поводу того, что "неработает!" ))))
Записан
tom
Постоялец
***

Карма: 2
Offline Offline

Сообщений: 216


Просмотр профиля
« Ответ #4 : 09 Апреля 2018, 14:40:21 »

Вітаю.
А є данні по HW mikrotik і трафіку/кількість клієнтів у ролі BRAS. Чи реалізовано в mikrotik авто розраховування qinq по dhcp запиту?
Записан
2garin.90
Новичок
*

Карма: 1
Offline Offline

Сообщений: 3


Просмотр профиля Email
« Ответ #5 : 26 Июня 2018, 13:07:46 »

Для превращения роутера с RouterOS на борту в полноценный IPoE BRAS мне не хватает ip unnumbered.
Ну как бы аналог ip unnumbered как и в любом линуксе на микротике запилить довольно просто - добавляя соответствующие маршруты вручную. Так и делал раньше, пока мне это не надоело. Но потом, потратив определенную часть своей жизни на изучение гомноскриптов родилось вот такое решение:

Реальная сеть добавляется в networks обычным образом, и реальники начинают выдаваться при помощи связки dhcp+radius и все бы хорошо, но у клиента с реальником ничего не работает. Во-первых на всех влан интерфейсах необходимо переключить ARP  в режим proxy-arp. Во-вторых создадим бридж с названием lo и не будем в него добавлять никаких портов (это будет наш аналог localhost), присвоим этому интерфейсу ip адрес, который будет являться шлюзом для всех остальных клиентов, с реальными адресами, разбросанных по вланам (в примере это 193.55.37.1 - чей это адрес хз, придумал на ходу) В третьих на каждом из dhcp серверов (на микротик они поднимаются для каждого влана отдельно) в поле Lease Script добавляем следующий скрипт:
Код:
:local realgw "193.55.37.1";
:if ($leaseBound = 1) do={
/ip dhcp-server lease;
:foreach i in=[find dynamic=yes] do={
:local dhcpip
:set dhcpip [ get $i address ];
:if ($leaseActIP = $dhcpip) do={
                                 :if ([:put ($dhcpip&255.255.0.0)]="193.55.0.0") do={
                                  if ([:len [/ip route find where dst-address=$dhcpip."/32"]] >0)    do={                            
                           /log warn "New Real IP already added $dhcpip";
                                     } else={
                                                   /log error "New real IP $dhcpip";
                                                   /ip route add distance=1 dst-address=$dhcpip gateway=[/ip dhcp-server get [/ip dhcp-server find name=$leaseServerName] interface] pref-src=$realgw;
        }
        }
           }
     }
}
Все, после сохранения, маршруты начнут добавляться автоматически (если их конечно нет). В логе появляются красивые разноцветные записи ))) error и warn - это для красоты, можно заменить на info и все будет черно-белое как тюремная стена.
В строке скрипта
Цитировать
:if ([:put ($dhcpip&255.255.0.0)]="193.55.0.0") do={
Идет определение, реальник используется или нет, поэтому необходимо подогнать под свою реальную сеть.

Есть один недостаток у этого способа: Если вы решите переместить юзера, с уже прикрученым реальником и маршрутом в другой влан - то маршрут в новый влан не добавится - его сначала придется вручную убрать из старого.
Этот же способ подходит, если у вас несколько роутеров, а реальная сеть одна несчастная... и что же делать? Да все точно так же делается, только связываете между собой роутеры динамической маршрутизацией, чтобы каждый из роутеров в сети всегда знал где какой адрес находится. Я для этого использую iBGP (если нет своей AS можно использовать фейковое пространство)


По скрипту все понятно, опечатка очевидна (второй IF без ":" в начале).
Вот только не понял зачем сверять $leaseActIP со всеми выданными лизами. Ведь достаточно проверить существование роутинга. Объясните если не сложно?
Записан
Cell
NoDeny
Спец
*

Карма: 52
Offline Offline

Сообщений: 1444



Просмотр профиля
« Ответ #6 : 26 Июня 2018, 15:05:30 »

Давно было дело, уже не помню почему так. Попробуйте усовершенствовать.
Сейчас присмотрелся. Да, можно наверное было бы сделать по другому. Прикол в том что дальше везде используется $dhcpip который как раз и получался методом перебора, хотя можно было тупо использовать $leaseActIP и этот цикл был бы нафиг не нужен.
Записан
2garin.90
Новичок
*

Карма: 1
Offline Offline

Сообщений: 3


Просмотр профиля Email
« Ответ #7 : 26 Июня 2018, 16:31:18 »

Давно было дело, уже не помню почему так. Попробуйте усовершенствовать.
Сейчас присмотрелся. Да, можно наверное было бы сделать по другому. Прикол в том что дальше везде используется $dhcpip который как раз и получался методом перебора, хотя можно было тупо использовать $leaseActIP и этот цикл был бы нафиг не нужен.

Немного другая реализация с дополнительной проверкой существования роутинга.
Кстати, в версии ROS 6.40 и выше роутинг автоматически удаляется скриптом при окончании lease time или при ручном удалении из dhcp leases. Соответственно роутов ведущих в никуда не будет.
Так же возможна выдача IP из разных пулов GW определяется в зависимости от пула.

Код:
:local realgw;
:local gatwif;
:if ($leaseBound = 1) do={

        /log warn "START: $leaseActIP";
          :if ([:put ($leaseActIP&255.255.255.0)]="193.112.164.0") do={:set $realgw "193.112.164.1";}
          :if ([:put ($leaseActIP&255.255.255.0)]="192.214.208.0") do={:set $realgw "192.214.208.1";}
          :set $gatwif [/ip dhcp-server get [/ip dhcp-server find name=$leaseServerName] interface];
          /log warn "GW: $realgw  GATWIF=$gatwif";

    :if ([:len [/ip route find where dst-address=$leaseActIP."/32"]] >0)    do={
            /log error "New Real IP already added $leaseActIP";
            /ip route remove [find where dst-address=$leaseActIP."/32"];
            /ip route add distance=1 dst-address=$leaseActIP gateway=$gatwif pref-src=$realgw comment="Route: $leaseActIP TO: $gatwif";
     } else={
             /log error "New real IP $leaseActIP";
             /ip route add distance=1 dst-address=$leaseActIP gateway=$gatwif pref-src=$realgw comment="Route: $leaseActIP TO: $gatwif";
     }
} else= {
             /log warn "STOP $leaseActIP";
             /ip route remove [find where dst-address=$leaseActIP."/32"];
}
Записан
Cell
NoDeny
Спец
*

Карма: 52
Offline Offline

Сообщений: 1444



Просмотр профиля
« Ответ #8 : 26 Июня 2018, 17:24:43 »

Смысла нет разные гетвеи подставлять для разных подсетей, разве что если сети ну вообще разные что ппц, как в примере. Если есть возможность все возможные комбинации объеденить одной масской - то достаточно обычного прокси-арп и 1 ипа на локалхосте. А вообще- имеет право на жизнь. Нужно будет мне модернизировать свою поделку на новый лад, т.к. мне кое что тут не нравится.
Записан
elite
Начальник планеты
NoDeny
Спец
*

Карма: 52
Offline Offline

Сообщений: 1231

In LAN we trust!

358714596
Просмотр профиля
« Ответ #9 : 26 Июня 2018, 19:28:52 »

от почему микротиковцы не могут запилить нормальный ip unnumbered?
Записан
Cell
NoDeny
Спец
*

Карма: 52
Offline Offline

Сообщений: 1444



Просмотр профиля
« Ответ #10 : 26 Июня 2018, 22:48:44 »

Ппц... вот что значит нормальный? Он нормальный и так )))
В  циско на влан вешаешь ип и он сразу прописывается в роут.  На самом деле и тут можно также делать, и не только лишь все знают как )
Записан
2garin.90
Новичок
*

Карма: 1
Offline Offline

Сообщений: 3


Просмотр профиля Email
« Ответ #11 : 27 Июня 2018, 12:14:37 »

Ппц... вот что значит нормальный? Он нормальный и так )))
В  циско на влан вешаешь ип и он сразу прописывается в роут.  На самом деле и тут можно также делать, и не только лишь все знают как )


Можно и так, как говориться Cisco like  Веселый Логика та же.


Код:
:local realgw;
:local gatwif;
:if ($leaseBound = 1) do={
       /log info "+++ Start ACCT for $leaseActIP";
          :if ([:put ($leaseActIP&255.255.255.0)]="193.112.164.0") do={:set $realgw "193.112.164.1";}
          :if ([:put ($leaseActIP&255.255.255.0)]="192.214.208.0") do={:set $realgw "192.214.208.1";}
          :set $gatwif [/ip dhcp-server get [/ip dhcp-server find name=$leaseServerName] interface];
          /log warn "GW: $realgw  GATWIF=$gatwif";

    :if ([:len [/ip address find where network=$leaseActIP]] >0)    do={
            /log error "New Real IP already exist $leaseActIP";
            /ip address remove [find where network=$leaseActIP];
            /ip address add address=$realgw network=$leaseActIP interface=$gatwif comment="Unnumbered $leaseActIP";
     } else={
             /log error "New real IP $leaseActIP added";
             /ip address add address=$realgw network=$leaseActIP interface=$gatwif comment="Unnumbered $leaseActIP";
     }
} else={
             /log warn "STOP $leaseActIP";
             /ip address remove [find where network=$leaseActIP];
}
Записан
Cell
NoDeny
Спец
*

Карма: 52
Offline Offline

Сообщений: 1444



Просмотр профиля
« Ответ #12 : 27 Июня 2018, 13:25:16 »

От блин..... ты знал!!!! )))))))))))))
Записан
Cell
NoDeny
Спец
*

Карма: 52
Offline Offline

Сообщений: 1444



Просмотр профиля
« Ответ #13 : 24 Сентября 2018, 00:55:46 »

После небольшой модернизации скрипт стал выглядеть вот так:

Код:
:local realgw "193.55.37.1";
:if ($leaseBound = 1) do={
        :if ([:put ($leaseActIP&255.255.0.0)]="193.55.0.0") do={
     /log warn "START: $leaseActIP";
        :if ([:len [/ip route find where dst-address=$leaseActIP."/32"]] >0)    do={                             
/log warn "New Real IP already added $leaseActIP";
              } else={
        /log error "New real IP $leaseActIP";
        /ip route add distance=1 dst-address=$leaseActIP gateway=[/ip dhcp-server get [/ip dhcp-server find name=$leaseServerName] interface] pref-src=$realgw;
           }
     }
} else= {
          :if ([:put ($leaseActIP&255.255.0.0)]="193.33.0.0") do={
             /log warn "STOP $leaseActIP";
             /ip route remove [find where dst-address=$leaseActIP."/32"];
}
}


При этом маршрут по окончании лизинга автоматически удаляется т.е. мы лишились единственного недостатка.
Записан
Cell
NoDeny
Спец
*

Карма: 52
Offline Offline

Сообщений: 1444



Просмотр профиля
« Ответ #14 : 04 Июня 2023, 22:59:22 »

Еще одна небольшая модернизация. Добавлена пауза в 1.5 секунды т.к. слишком быстрые роутеры ведут себя неадекватно.
Код:
:local realgw "193.55.37.1";
:if ($leaseBound = 1) do={
        :if ([:put ($leaseActIP&255.255.0.0)]="193.55.0.0") do={
                      :delay 1500ms
     /log warn "START: $leaseActIP";
        :if ([:len [/ip route find where dst-address=$leaseActIP."/32"]] >0)    do={                             
/log warn "New Real IP already added $leaseActIP";
              } else={
        /log error "New real IP $leaseActIP";
        /ip route add distance=1 dst-address=$leaseActIP gateway=[/ip dhcp-server get [/ip dhcp-server find name=$leaseServerName] interface] pref-src=$realgw;
           }
     }
} else= {
          :if ([:put ($leaseActIP&255.255.0.0)]="193.33.0.0") do={
             /log warn "STOP $leaseActIP";
             /ip route remove [find where dst-address=$leaseActIP."/32"];
}
}

Записан
Страниц: [1]
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.20 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!