PPPoE BRAS на MikroTik RouterOS (c radius-сервером)

Не смотря на то, что продукция MikroTik не является оборудованием операторского класса, его активно применяют на начальном этапе строительства небольших сетей в странах СНГ и некоторых других ввиду его очень низкой цены и заявленного функционала(который не всегда работает как хочется).

В этой заметке рассматривается использование MikroTik RouterOS 6.19 в качестве PPPoE BRAS и его интеграция с радиус-сервером (в примере используется FreeRadius 2.1, но точно также могут быть использованы radius-серверы, интегрированные в различные биллинговые системы). Схема описываемой конфигурации:

Mikrotik PPPoE Bras with radius server

Базовая настройка 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-а.

Advertisements

One thought on “PPPoE BRAS на MikroTik RouterOS (c radius-сервером)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s