Не смотря на то, что продукция MikroTik не является оборудованием операторского класса, его активно применяют на начальном этапе строительства небольших сетей в странах СНГ и некоторых других ввиду его очень низкой цены и заявленного функционала(который не всегда работает как хочется).
В этой заметке рассматривается использование MikroTik RouterOS 6.19 в качестве PPPoE BRAS и его интеграция с радиус-сервером (в примере используется FreeRadius 2.1, но точно также могут быть использованы radius-серверы, интегрированные в различные биллинговые системы). Схема описываемой конфигурации:
Базовая настройка Mikrotik RouterOS:
# Подписываем порты /interface ethernet set [ find default-name=ether1 ] comment=Uplink set [ find default-name=ether2 ] comment=Radius set [ find default-name=ether3 ] comment="PPPoE Downlink" # На порту ether1 прописываем IP-адрес, выданный внешним провайдером, на ether2 IP-адрес на стыке с radius-сервером /ip address add address=192.0.2.98/30 comment=Uplink interface=ether1 network=192.0.2.96 add address=10.30.30.1/30 comment=Radius interface=ether2 network=10.30.30.0 # Шлюз по умолчанию (в сторону провайдера-аплинка) и NULL-роут IP-адресов, раздаваемых клиентам. # Кроме этого, желательно NULL-роутить все IP-сети, которые не являются глобально маршрутизируемыми /ip route add distance=1 gateway=192.0.2.97 add distance=1 dst-address=100.64.0.0/10 type=blackhole # Задаём DNS-сервера, они будут использовать как локальными приложениями самого RouterOS(типа ping или ntp-клиент) # Они же будут переданы абоненту в качестве DNS-серверов при установлении PPPoE-сессии /ip dns set servers=192.0.2.1,192.0.2.2 # Делаем NAT(PAT) для серых адресов, выдаваемых абоненту: /ip firewall nat add action=src-nat chain=srcnat comment="customers to internet" \ out-interface=ether1 src-address=100.64.0.0/10 to-addresses=192.0.2.98
Это были типовые настройки по части IP. Теперь по части PPP:
# Изменяем PPP-профиль по умолчанию, задаём local-address (лучше использовать один из тех, что принадлежит устройству, можно создать отдельный Loopback(bridge без интерфейсов)) /ppp profile set 0 change-tcp-mss=no local-address=192.0.2.98 use-compression=no \ use-encryption=no use-mpls=no use-vj-compression=no # Поднимаем pppoe сервис на интерфейсе ether3: /interface pppoe-server server add authentication=pap,chap disabled=no interface=ether3 keepalive-timeout=20 \ max-mru=1492 max-mtu=1492 one-session-per-host=yes service-name=pppoe3 # Включаем авторизацию PPP-пользователей через radius-сервер: /ppp aaa set use-radius=yes # Задаём параметры радиус-сервера (IP-адрес и пароль) /radius add address=10.30.30.2 secret=testing123 service=ppp # Включаем функционал PoD(packet of disconnect). CoA MikroTik не поддерживает /radius incoming set accept=yes # Задание hostname, будет отражено в PADO-фреймах /system identity set name=mt-bras
На этом настройка функционала PPPoE BRAS завершена (но при этом не забудьте, что нужно установить пароль на пользователя admin и ограничить доступ к самому mikrotik по протоколам telnet, ftp, www и т.д.(смотреть /ip service print))
До того как будет настроен Radius-сервер, можно проверить отвечает ли mikrotik на PADI-фреймы устройствам, подключенных к порту ether3. Должен отвечать подобным образом образом:
customer1# pppoe-discovery -I eth0 Access-Concentrator: mt-bras Service-Name: pppoe3 -------------------------------------------------- AC-Ethernet-Address: 00:50:56:b7:02:5d
Как уже было сказано, в качестве примера Radius-сервера будет использован Freeradius 2.1 из стандратных репозиториев Ubuntu 14.04(пакеты freeradius и freeradius-utils). Добавляем Mikrotik в список клиентов:
client mt-bras { ipaddr = 10.30.30.0 netmask = 30 secret = testing123 }
Добавляется не один адрес 10.30.30.2, а сеть 10.30.30.0/30, чтобы можно было посылать запросы локально утилитой radclient(для отладки)
Теперь добавляем пользователя и установливаем ему ограничение скорости 10Мбит/с:
user Cleartext-Password := "password" Framed-IP-Address = 100.64.0.2, Mikrotik-Rate-Limit = "10240k"
После чего нужно перезапустить радиус-сервер (service freeradius restart) и проверить, что радиус-сервер отвечает на запросы:
# echo "User-Name=user, User-Password=password" | radclient -x 10.30.30.2 auth testing123 Sending Access-Request of id 128 to 10.30.30.2 port 1812 User-Name = "user" User-Password = "password" rad_recv: Access-Accept packet from host 10.30.30.2 port 1812, id=128, length=40 Framed-IP-Address = 100.64.0.2 Mikrotik-Rate-Limit = "10240k"
Теперь запускаем клиентсткую pppoe-сессию и смотрим что получилось:
customer1# pppd call p1 Plugin rp-pppoe.so loaded. customer1# ip route show default dev ppp0 scope link 192.0.2.98 dev ppp0 proto kernel scope link src 100.64.0.2
Со стороны Mikrotik это выглядит следующим образом:
[admin@mt-bras] > /ppp active print Flags: R - radius # NAME SERVICE CALLER-ID ADDRESS UPTIME ENCODING 0 R user pppoe 00:50:56:B7:F5:A9 100.64.0.2 2m43s [admin@mt-bras] > /queue simple print Flags: X - disabled, I - invalid, D - dynamic 0 D name="<pppoe-user>" target=<pppoe-user> parent=none packet-marks="" priority=8/8 queue=default-small/default-small limit-at=10240k/10240k max-limit=10240k/10240k burst-limit=0/0 burst-threshold=0/0 burst-time=0s/0s
Проверка скорости:
customer1# speedtest-cli --server 3682 Retrieving speedtest.net configuration... Retrieving speedtest.net server list... Testing from Example ISP (192.0.2.98)... Hosted by Rostelecom (Moscow) [401.87 km]: 38.422 ms Testing download speed........................................ Download: 9.54 Mbits/s Testing upload speed.................................................. Upload: 7.87 Mbits/s
Функционал PoD(Packet of Disconnect) используется, когда абоненту нужно изменить скорость с помощью принудительной переавторизации или заблокировать его. Пример PoD запроса:
# echo "User-Name=user" | radclient -x 10.30.30.1 disconnect testing123 Sending Disconnect-Request of id 7 to 10.30.30.1 port 3799 User-Name = "user" rad_recv: Disconnect-ACK packet from host 10.30.30.1 port 3799, id=7, length=35 NAS-Identifier = "mt-bras" NAS-IP-Address = 10.30.30.1
При этом, mikrotik удаляет у себя сессию и шлёт PADT-запрос абоненту (но не шлёт предварительно LCP Term-Req, в результате чего некоторые клиенты могут обнаружить разрыв сессии не сразу, а по истечению LCP таймаута). PoD-запрос отражается в логах mikrotik следующим образом:
17:22:03 pppoe,ppp,info <pppoe-user>: terminating... 17:22:03 pppoe,ppp,info,account user logged out, 730 18225512 50292413 35653 42114 17:22:03 pppoe,ppp,info <pppoe-user>: disconnected
На этом почти всё, основные настройки PPPoE изложены в этой статье. Остаётся лишь пара замечаний. Во-первых, в реальной сети вряд ли весь трафик будут приходить в один логический интерфейс(такие сети называются L2 помойкой), скорее всего будет много dot1q-сабынтерфейсов, но pppoe сервер на них поднимается точно так же как и на ether3 в этой заметке. Во-вторых, параметр one-session-per-host=yes обозначает запрет на создание более одной pppoe-сессии с одинаковыми маками, но не запрешает создание двух сессий с разными мак-адресами, но с одним и тем же логином. Это должно контроллироваться на уровне радиус-сервера, либо с помощью задания статического IP каждому абоненту (не важно какого цвета будет IP-адрес), либо с помощью accounting-а.
Респект ВАМ!!!!
С удовольствие прочитал!