Привет всем!
Некоторое время назад у нас возникли проблемы со случайными сбоями маршрутизаторов MikroTik, выполняющих завершение PPPoE. Мы пытались разобраться в причинах, но до недавнего времени не могли выявить никаких четких закономерностей. Однако, теперь кажется, что проблема связана с функцией IP-пула в RouterOS. Это также воспроизводится на всех версиях 2.8.x (мы несколько раз обновляли и понижали версии RouterOS без изменений). Мы обнаружили, что при следующей конфигурации мы можем практически на 100% раз вызвать сбой:
Не могли бы другие (особенно сотрудники MikroTik) попробовать эти шаги, чтобы проверить, получите ли вы тот же результат?
Кстати, мы используем стойки Supermicro 1U (2.8GHz P4/Celeron, 1GB RAM, RouterOS загружен на IDE flash module).
1. Настройте машину RouterOS (назовем ее маршрутизатор #1) так, чтобы в ней был IP-пул с диапазоном, скажем, 192.168.1.0-192.168.1.255.
2. Создайте PPPoE-профиль на маршрутизаторе #1 и установите Удаленный адрес равным пулу, созданному на шаге 1.
3. Создайте и запустите экземпляр PPPoE-сервера на одном из Ethernet-интерфейсов на маршрутизаторе #1, используя PPPoE-профиль, созданный на шаге 2, в качестве Профиля по умолчанию для этого сервера.
4. Создайте один PPP Secret на маршрутизаторе #1 с любым именем пользователя и паролем по вашему выбору. Установите его профиль на тот, который вы создали на шаге 2, и тип службы – 'pppoe'.
На второй машине RouterOS (маршрутизатор #2), к которой вы подключите маршрутизатор #1, создайте несколько сотен PPPoE-клиентских интерфейсов (просто создайте один и несколько раз скопируйте его; проще всего со скриптом), все с именем пользователя и паролем, которые вы придумали для шага 1, но пока отключите их все. Можно установить имя службы, чтобы оно совпадало с именем службы PPPoE на маршрутизаторе #1, если это необходимо/желательно.
```
/interface pppoe-client
add interface=ether1 user=username password=password add-default-route=no disabled=yes name=0
print
:for x from 1 to 511 do=[add disabled=yes copy-from=0 name=($x)]
```
Теперь – опять же, лучше всего это сделать со скриптом – включите каждый PPPoE-клиент на маршрутизаторе #2 по одному с задержкой в секунду-две между включением каждого. Следите, чтобы туннели появлялись на маршрутизаторе #1, и внимательно следите за системными ресурсами на маршрутизаторе #1.
```
:for x from 0 to 511 do=[:delay 1;enable $x]
```
**Результат:**
Туннели будут успешно устанавливаться некоторое время, и IP-адреса из пула будут выдаваться входящим туннелям последовательно, как и ожидалось. Однако, примерно через 120 туннелей (по крайней мере, на наших тестовых машинах) использование системных ресурсов на маршрутизаторе #1 резко возрастет: загрузка ЦП достигнет 100%, и почти вся физическая оперативная память в 1 ГБ будет задействована. В этот момент то, что произойдет дальше, как будто зависит от случая: вы можете увидеть, что все приходит в норму и продолжается после минуты, вы можете увидеть, что использование ресурсов возвращается к нормальному уровню, но маршрутизатор #1 перестанет принимать новые PPPoE-туннели, вы можете увидеть, что загрузка ЦП остается на 100%, вы можете увидеть, что успешно установленные ранее PPPoE-туннели перестанут работать, хотя они все еще перечислены в списке Интерфейсов, или вы можете увидеть, что маршрутизатор #1 выйдет из сети и больше никогда не вернется (в последнем случае при доступе к маршрутизатору #1 через консоль может появиться Kernel Panic или не отвечающий запрос входа в систему или другие возможности).
После того, как вы подтвердите вышеописанное поведение, попробуйте это: Перейдите на маршрутизатор #2 и отключите все PPPoE-интерфейсы.
```
/interface pppoe-client
disable [find]
```
Вернитесь к маршрутизатору #1, перезагрузите его, затем перейдите к свойствам PPPoE-профиля, созданного ранее, и установите Удаленный адрес равным статическому значению (например, 192.168.1.1) вместо указания на IP-пул. Вернитесь на маршрутизатор #2 и снова включите PPPoE-клиентские интерфейсы по одному, как в прошлый раз.
**Результат:**
Все 512 PPPoE-туннеля успешно запускаются на маршрутизаторе #1 (хотя им всем назначен один и тот же IP-адрес) без всплесков ресурсов и сбоев. Это указывает на то, что нечто в коде IP-пула вызывает утечку памяти или зацикливание. Затем ядро, вероятно, начинает завершать процессы после того, как все выходит из-под контроля. Возможно, это будет успешно или нет, что, вероятно, и объясняет разнообразные непредсказуемые симптомы, которые мы видим в конце.
Если это проблема IP-пула, возможно, это также может повлиять на DHCP, хотя я никогда не пытался воспроизвести эту проблему, заменив PPPoE на DHCP.
– Nathan
Некоторое время назад у нас возникли проблемы со случайными сбоями маршрутизаторов MikroTik, выполняющих завершение PPPoE. Мы пытались разобраться в причинах, но до недавнего времени не могли выявить никаких четких закономерностей. Однако, теперь кажется, что проблема связана с функцией IP-пула в RouterOS. Это также воспроизводится на всех версиях 2.8.x (мы несколько раз обновляли и понижали версии RouterOS без изменений). Мы обнаружили, что при следующей конфигурации мы можем практически на 100% раз вызвать сбой:
Не могли бы другие (особенно сотрудники MikroTik) попробовать эти шаги, чтобы проверить, получите ли вы тот же результат?
Кстати, мы используем стойки Supermicro 1U (2.8GHz P4/Celeron, 1GB RAM, RouterOS загружен на IDE flash module).
1. Настройте машину RouterOS (назовем ее маршрутизатор #1) так, чтобы в ней был IP-пул с диапазоном, скажем, 192.168.1.0-192.168.1.255.
2. Создайте PPPoE-профиль на маршрутизаторе #1 и установите Удаленный адрес равным пулу, созданному на шаге 1.
3. Создайте и запустите экземпляр PPPoE-сервера на одном из Ethernet-интерфейсов на маршрутизаторе #1, используя PPPoE-профиль, созданный на шаге 2, в качестве Профиля по умолчанию для этого сервера.
4. Создайте один PPP Secret на маршрутизаторе #1 с любым именем пользователя и паролем по вашему выбору. Установите его профиль на тот, который вы создали на шаге 2, и тип службы – 'pppoe'.
На второй машине RouterOS (маршрутизатор #2), к которой вы подключите маршрутизатор #1, создайте несколько сотен PPPoE-клиентских интерфейсов (просто создайте один и несколько раз скопируйте его; проще всего со скриптом), все с именем пользователя и паролем, которые вы придумали для шага 1, но пока отключите их все. Можно установить имя службы, чтобы оно совпадало с именем службы PPPoE на маршрутизаторе #1, если это необходимо/желательно.
```
/interface pppoe-client
add interface=ether1 user=username password=password add-default-route=no disabled=yes name=0
:for x from 1 to 511 do=[add disabled=yes copy-from=0 name=($x)]
```
Теперь – опять же, лучше всего это сделать со скриптом – включите каждый PPPoE-клиент на маршрутизаторе #2 по одному с задержкой в секунду-две между включением каждого. Следите, чтобы туннели появлялись на маршрутизаторе #1, и внимательно следите за системными ресурсами на маршрутизаторе #1.
```
:for x from 0 to 511 do=[:delay 1;enable $x]
```
**Результат:**
Туннели будут успешно устанавливаться некоторое время, и IP-адреса из пула будут выдаваться входящим туннелям последовательно, как и ожидалось. Однако, примерно через 120 туннелей (по крайней мере, на наших тестовых машинах) использование системных ресурсов на маршрутизаторе #1 резко возрастет: загрузка ЦП достигнет 100%, и почти вся физическая оперативная память в 1 ГБ будет задействована. В этот момент то, что произойдет дальше, как будто зависит от случая: вы можете увидеть, что все приходит в норму и продолжается после минуты, вы можете увидеть, что использование ресурсов возвращается к нормальному уровню, но маршрутизатор #1 перестанет принимать новые PPPoE-туннели, вы можете увидеть, что загрузка ЦП остается на 100%, вы можете увидеть, что успешно установленные ранее PPPoE-туннели перестанут работать, хотя они все еще перечислены в списке Интерфейсов, или вы можете увидеть, что маршрутизатор #1 выйдет из сети и больше никогда не вернется (в последнем случае при доступе к маршрутизатору #1 через консоль может появиться Kernel Panic или не отвечающий запрос входа в систему или другие возможности).
После того, как вы подтвердите вышеописанное поведение, попробуйте это: Перейдите на маршрутизатор #2 и отключите все PPPoE-интерфейсы.
```
/interface pppoe-client
disable [find]
```
Вернитесь к маршрутизатору #1, перезагрузите его, затем перейдите к свойствам PPPoE-профиля, созданного ранее, и установите Удаленный адрес равным статическому значению (например, 192.168.1.1) вместо указания на IP-пул. Вернитесь на маршрутизатор #2 и снова включите PPPoE-клиентские интерфейсы по одному, как в прошлый раз.
**Результат:**
Все 512 PPPoE-туннеля успешно запускаются на маршрутизаторе #1 (хотя им всем назначен один и тот же IP-адрес) без всплесков ресурсов и сбоев. Это указывает на то, что нечто в коде IP-пула вызывает утечку памяти или зацикливание. Затем ядро, вероятно, начинает завершать процессы после того, как все выходит из-под контроля. Возможно, это будет успешно или нет, что, вероятно, и объясняет разнообразные непредсказуемые симптомы, которые мы видим в конце.
Если это проблема IP-пула, возможно, это также может повлиять на DHCP, хотя я никогда не пытался воспроизвести эту проблему, заменив PPPoE на DHCP.
– Nathan
