Настройка Juniper MX и ABillS

Для примера выполню настройку Juniper MX204 для работы с биллинговой системой ABillS.

Скопируем купленный модуль в директорию с биллиногом:

cp Mx802.pm /usr/abills/Abills/mysql

В файле конфигурации config.pl после секций %AUTH = (); %ACCT = (); я указал:

$AUTH{mx80} = 'Mx802';
$ACCT{mx80} = 'Mx802';

Для авторизации по MAC адресу указал:

$conf{MX80_MAC_AUTH}=1;

Так как я скомпилировал FreeRadius 3.0.23, то указанные ниже атрибуты не пришлось изменять, как было описано в документации ABillS, так как они уже были в таком виде:

dictionary.erx
ATTRIBUTE     ERX-Dhcp-Options                        55      octets
dictionary.rfc4679
ATTRIBUTE     ADSL-Agent-Circuit-Id                   1       octets
ATTRIBUTE     ADSL-Agent-Remote-Id                    2       octets

Замечу, что свои атрибуты нужно вносить в файл /usr/local/freeradius/etc/raddb/dictionary, в этом файле также нет INCLUDE для остальных словарей, так как начиная с версии FreeRadius 3.0.2, они автоматически загружаются из директории /usr/local/freeradius/share/freeradius/.

В меню Настройка>Сервер доступа я добавил сервер доступа:

IP:
Название:
Тип: mx80
Alive: 600
IP:x.x.x.x
POD/COA:3799
SNMP:161
SSH:22
Пользователь: abills_admin
Пароль: одинаковый для SNMP и SSH

Также в нем добавил RADIUS Parameters (DNS сервера лучше указывать свои локальные кэширующие):

MS-Primary-DNS-Server=8.8.8.8,
MS-Secondary-DNS-Server=1.1.1.1,
Session-Timeout=0,

После добавления сервера доступа необходимо перезапустить FreeRadius, иначе будет ругаться на него с ошибкой unknown client.

Для всех гостевых клиентов, например без денег, отключенных или неизвестных и т.д., в настройках тарифа я указал IP Pool негативного депозита (можно указывать один для всех серверов доступа), а в поле «Фильтр негативного депозита» можно указывать произвольные Radius параметры, например:

RAD: ERX-Ingress-Policy-Name=svc-filter-in-nomoney, ERX-Egress-Policy-Name=1Mbps

Если используются разные сервера доступа совместно с Juniper, например Accel-ppp, то для гостевых клиентов этот атрибут им будет отправляться тоже, это не будет проблемой, в логах Accel-ppp просто будут записи:

radius:packet: vendor 26 not found

Приведу пример SQL запроса для массового изменения поля «Фильтр негативного депозита»:

UPDATE tarif_plans SET neg_deposit_filter_id='RAD: ERX-Ingress-Policy-Name=svc-filter-in-nomoney, ERX-Egress-Policy-Name=1Mbps' WHERE neg_deposit_filter_id='RAD: ERX-Egress-Policy-Name=1Mbps' AND module='Internet';

Или лучше не указывать эти параметры в поле «Фильтр негативного депозита», а указать имена фильтров в файле конфигурации ABillS (можно также указать одинаковый фильтр для всех):

$conf{MX80_PROFILES}='
WRONG_PASS:svc-guest-ipoe(svc-filter-in-wrongpassword);
NEG_DEPOSIT:svc-guest-ipoe(svc-filter-in-nomoney);
AUTH_ERROR:svc-guest-ipoe(svc-filter-in-unknownerror);
USER_NOT_EXIST:svc-guest-ipoe(svc-filter-in-notregister);
NOT_ALLOW_SERVICE:svc-guest-ipoe(svc-filter-in-notallowservice);
DISABLE:svc-guest-ipoe(svc-filter-in-disable);
WRONG_PORT:svc-guest-ipoe(svc-filter-in-wrongport);
WRONG_CID:svc-guest-ipoe(svc-filter-in-wrongcid);
';

Первоначальную настройку Juniper я описывал в статье:
Настройка Juniper MX204

Обязательно активируем функцию управления абонентами (без этого не будет выполнятся аутентификация и не будут отправляться запросы на Radius):

set chassis network-services enhanced-ip
set system services subscriber-management enable
set system configuration-database max-db-size 300М
commit
request system reboot

show subscribers address 172.16.5.210 detail
show system subscriber-management route
show system subscriber-management summary
show system processes | grep libexec[36]

На устройствах с памятью более 32 Gb, можно не указывать размер памяти под конфигурацию, чтобы JunOS автоматически выбирала значение, после этого значение будет 698343424:

delete system configuration-database max-db-size
request system reboot

Смотрите также мою статью:
JunOS dyn prof: failed to register error

Продолжаем настройку, создадим фильтр с именем 1Mbps, который ограничит гостевым пользователям скорость:

set firewall family inet filter 1Mbps interface-specific term 1 then policer 1Mbps accept
set firewall policer 1Mbps if-exceeding bandwidth-limit 1m burst-size-limit 128k
set firewall policer 1Mbps then discard

Также создадим фильтр который разрешит доступ только к указанным IP адресам и портам, а также переадресует http трафик на страницу заглушку «captive portal» (на которой можно написать произвольную информацию и ссылку на личный кабинет):

set firewall family inet filter svc-filter-in-nomoney interface-specific
set firewall family inet filter svc-filter-in-nomoney term 1 from destination-prefix-list WhiteListHosts
set firewall family inet filter svc-filter-in-nomoney term 1 from protocol [ tcp udp ]
set firewall family inet filter svc-filter-in-nomoney term 1 from destination-port [ 80 443 53 67 68 81 82 9443 ]
set firewall family inet filter svc-filter-in-nomoney term 1 then accept
set firewall family inet filter svc-filter-in-nomoney term 2 from protocol tcp destination-port 80
set firewall family inet filter svc-filter-in-nomoney term 2 then routing-instance neg_dep
set firewall family inet filter svc-filter-in-nomoney term default then discard

edit policy-options prefix-list WhiteListHosts
set 10.20.0.1
set 10.20.0.5

set routing-instances neg_dep instance-type forwarding routing-options static route 0.0.0.0/0 next-hop 192.168.99.5

Создадим динамический профиль для VLAN (интерфейсы VLAN будут иметь вид например ae0.3222119914):

edit dynamic-profiles VLAN-IPOE
set routing-instances "$junos-routing-instance" interface "$junos-interface-name"
edit interfaces "$junos-interface-ifd-name" unit "$junos-interface-unit"
set demux-source inet
set no-traps
set proxy-arp restricted
set vlan-id "$junos-vlan-id"
set family inet unnumbered-address "$junos-loopback-interface"

Еще пример динамического профиля для VLAN (интерфейсы VLAN будут иметь вид например demux0.3222014310):

edit dynamic-profiles Auto-VLAN-Demux
set routing-instances "$junos-routing-instance" interface "$junos-interface-name"
set interfaces demux0 unit "$junos-interface-unit" demux-source inet
set interfaces demux0 unit "$junos-interface-unit" no-traps
set interfaces demux0 unit "$junos-interface-unit" proxy-arp restricted
set interfaces demux0 unit "$junos-interface-unit" vlan-id "$junos-vlan-id"
set interfaces demux0 unit "$junos-interface-unit" demux-options underlying-interface "$junos-interface-ifd-name"
set interfaces demux0 unit "$junos-interface-unit" family inet unnumbered-address "$junos-loopback-interface"

Назначим его на интерфейс в сторону клиентов, например ae0, чтобы VLAN поднимались автоматически (в ranges укажем для каких VLAN он должен работать):

set ae0 auto-configure vlan-ranges dynamic-profile VLAN-IPOE accept dhcp-v4
set ae0 auto-configure vlan-ranges dynamic-profile VLAN-IPOE ranges 220-221
set ae0 auto-configure vlan-ranges dynamic-profile VLAN-IPOE ranges 777-780

Потом я добавил динамический профиль для пользователей:

edit dynamic-profiles DHCP-IP-Demux interfaces demux0
set unit $junos-interface-unit proxy-arp restricted
set unit $junos-interface-unit no-traps
set unit $junos-interface-unit demux-options underlying-interface $junos-underlying-interface
set unit $junos-interface-unit family inet demux-source $junos-subscriber-ip-address
set unit $junos-interface-unit family inet unnumbered-address lo0.0 preferred-source-address 10.10.0.3

set unit $junos-interface-unit family inet unnumbered-address "$junos-loopback-interface" preferred-source-address "$junos-preferred-source-address"
edit dynamic-profiles DHCP
set routing-instances "$junos-routing-instance" interface "$junos-interface-name"
exit

Также настроим RPF в этом профиле, пример смотрите в моей статье:
Настройка RPF в динамических профилях

Переименовывать профили если что можно так:

rename dynamic-profiles DHCP-IP-Demux to ixnfo.com

Теперь укажем этот профиль локальному DHCP серверу в Juniper, а также запустим DHCP на интерфейсе demux0 (пользовательские суб интерфейсы будут создаваться вида demux0.xxxxx):

edit system services dhcp-local-server
set pool-match-order external-authority
set authentication username-include mac-address
set group all dynamic-profile DHCP-IP-Demux
set group all interface demux0.0
set group all interface ae0.0

Можно включить детальные логи DHCP (и позже отключить, чтобы не испортить память устройства, так как будет записываться очень много информации):

edit system processes dhcp-service traceoptions
set file dhcp_logfile size 10m
set level warning
set flag packet
commit
show log dhcp_logfile | last 100
edit edit system processes dhcp-service
delete traceoptions
commit

Можно также мониторить DHCP трафик на интерфейсе:

monitor traffic interface XXX size 1500 no-resolve detail matching udp

Теперь создадим динамический профиль для обычных рабочих сессий:

edit dynamic-profiles svc-global-ipoe
set variables SPEED_IN mandatory
set variables SPEED_OUT mandatory
set variables INET_IN uid
set variables INET_OUT uid
set variables POLICER_IN uid
set variables POLICER_OUT uid
set interfaces demux0 unit "$junos-interface-unit" family inet filter input "$INET_IN"
set interfaces demux0 unit "$junos-interface-unit" family inet filter input precedence 50
set interfaces demux0 unit "$junos-interface-unit" family inet filter output "$INET_OUT"
set interfaces demux0 unit "$junos-interface-unit" family inet filter output precedence 50
set firewall family inet filter "$INET_IN" interface-specific
set firewall family inet filter "$INET_IN" term 1 then policer "$POLICER_IN"
set firewall family inet filter "$INET_IN" term 1 then service-accounting
set firewall family inet filter "$INET_IN" term 1 then accept
set firewall family inet filter "$INET_OUT" interface-specific
set firewall family inet filter "$INET_OUT" term 1 then policer "$POLICER_OUT"
set firewall family inet filter "$INET_OUT" term 1 then service-accounting
set firewall family inet filter "$INET_OUT" term 1 then accept
set firewall policer "$POLICER_IN" filter-specific
set firewall policer "$POLICER_IN" if-exceeding bandwidth-limit "$SPEED_IN"
set firewall policer "$POLICER_IN" if-exceeding burst-size-limit 512k
set firewall policer "$POLICER_IN" then discard
set firewall policer "$POLICER_OUT" filter-specific
set firewall policer "$POLICER_OUT" if-exceeding bandwidth-limit "$SPEED_OUT"
set firewall policer "$POLICER_OUT" if-exceeding burst-size-limit 512k
set firewall policer "$POLICER_OUT" then discard

Приведу пример гостевого динамического профиля (который будет ожидать от Radius название входящего фильтра, например svc-filter-in-nomoney, а исходящий фильтр я уже указал вручную 1Mbps):

edit dynamic-profiles svc-guest-ipoe
set variables FILTER-IN mandatory
set interfaces demux0 unit "$junos-interface-unit" family inet filter input "$FILTER-IN"
set interfaces demux0 unit "$junos-interface-unit" family inet filter input precedence 100
set interfaces demux0 unit "$junos-interface-unit" family inet filter output 1Mbps
set interfaces demux0 unit "$junos-interface-unit" family inet filter output precedence 100

Потом я добавил все IP Pool которые заведены в ABillS и будут использоваться на этом Juniper, например (DNS можно не указывать, а передавать через Radius как я описывал выше):

edit access address-assignment pool Guests
set family inet network 10.10.0.0/20 range R1 low 10.10.0.2 high 10.10.15.253
set family inet network 10.10.0.0/20 dhcp-attributes maximum-lease-time 600 server-identifier 10.10.0.1 router 10.10.0.1
set family inet network 10.10.0.0/20 dhcp-attributes name-server 192.168.5.5
set family inet network 10.10.0.0/20 dhcp-attributes name-server 1.1.1.1

edit access address-assignment pool 17217
set family inet network 172.17.0.0/21 range R1 low 172.17.1.2 high 172.17.7.253
set family inet network 172.17.0.0/21 dhcp-attributes maximum-lease-time 600 server-identifier 172.17.0.3 router 172.17.0.3

Шлюзы этих IP pool я повесил на локальном интерфейсе lo0, но обязательно с маской подсети /32, например:

set interfaces lo0 unit 0 family inet address 172.17.0.3/32
set interfaces lo0 unit 0 family inet address 10.10.0.3/32

По поводу настройки Radius смотрите мою статью:
Настройка Radius на Juniper

Глобально укажем созданный Radius профиль:

set access-profile CLIENTS

Если radius серверы не доступны, то Juiper по умолчанию будет держать активные сессии.
Для диагностики на Linux сервере с Radius можно использовать tcpdump, чтобы перехватить Radius запросы от Juniper:

tcpdump host ixnfo.com
tcpdump -i eno5 port 1812 or port 1813 or port 3799
radiusd -X > rad_debug.txt
CTRL+C

Проверим конфигурацию на Juniper и применим:

commit check
commit

Скрипт проверки расхождения сессий:

/usr/abills/libexec/billd mx80_checklines SHOW
/usr/abills/libexec/billd mx80_checklines HANGUP

Примеры просмотра различной информации и статистики:

show subscribers
show subscribers extensive
show subscribers subscriber-state ?
show interfaces demux0.xxxxxxx
show arp
show arp state
show bridge mac-table
show log messages | last 30
show interfaces mac-database
show system services dhcp binding
show system services dhcp binding ?
show system services dhcp conflict
show dynamic-profile session client-id
show subscribers interface demux0.3221225509 extensive

Ручное завершение сессии клиента:

clear dhcp server binding 10.10.0.5

Перезапуск DHCP службы:

restart dhcp-service
restart dhcp-service ?

Пример создания пользователя для подключения по SSH с сервера ABillS, создадим сертификаты (в директории /usr/abills/Certs/ появятся файлы id_rsa.abills_admin и id_rsa.abills_admin.pub):

/usr/abills/misc/certs_create.sh ssh abills_admin

Выполним настройки на Juniper:

set system login class support idle-timeout 10
set system login class support permissions interface
set system login class support permissions routing
set system login class support permissions view
set system login class support allow-commands "monitor|ping|traceroute|show|clear dhcp server binding"
set system login class support deny-commands "clear|file|op|request|set|start"

set system login user abills_admin class support authentication load-key-file /var/home/id_rsa.abills_admin.pub
set system root-authentication plain-text-password

start shell user root
scp -P 22 abills@ixnfo.com:/usr/abills/Certs/id_rsa.abills_admin.pub /var/home/id_rsa.abills_admin.pub

cd /var/home/abills_admin/
ls

Вместо копирования файла можно указать его содержимое прямо в конфигурации:

set ssh-rsa "ssh-rsa XXXXXXXXXXXXXXXX ABillS remote machine manage key (Thu Jul  7 14:17:04 EEST 2022)"
show log user abills_admin

Смотрите также мои статьи:
Подключение по SSH ключу к Juniper
Как посмотреть скорость сессии пользователя
Массовый шейпинг скорости при авариях

Если устройств несколько, то маршруты пользователей можно передавать по iBGP, например смотрите мою статью:
Настройка iBGP на Juniper MX

Смотрите также другие мои статьи про Juniper

Оставьте комментарий

Добавить комментарий