Настройка 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:

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 Auto-VLAN-Demux accept dhcp-v4
set ae0 auto-configure vlan-ranges dynamic-profile Auto-VLAN-Demux ranges 220-221
set ae0 auto-configure vlan-ranges dynamic-profile Auto-VLAN-Demux 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

Можно включить детальные логи 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

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

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