Для примера выполню настройку Juniper MX204 для работы с биллинговой системой ABillS.
Скопируем купленный модуль в директорию с биллиногом:
В файле конфигурации config.pl после секций %AUTH = (); %ACCT = (); я указал:
$AUTH{mx80} = 'Mx802';
$ACCT{mx80} = 'Mx802';
(Для различных сценариев можно указывать или Mx802, или Mx803, или Mx804, или Mx805)
Для авторизации по 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 Пользователь: acp_kazna_39 Пароль: одинаковый для 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 it39.su
Теперь укажем этот профиль локальному 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 it39.su 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.acp_kazna_39 и id_rsa.acp_kazna_39.pub):
/usr/abills/misc/certs_create.sh ssh acp_kazna_39
Выполним настройки на 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 acp_kazna_39 class support authentication load-key-file /var/home/id_rsa.acp_kazna_39.pub set system root-authentication plain-text-password start shell user root scp -P 22 abills@it39.su:/usr/abills/Certs/id_rsa.acp_kazna_39.pub /var/home/id_rsa.acp_kazna_39.pub cd /var/home/acp_kazna_39/ ls
Вместо копирования файла можно указать его содержимое прямо в конфигурации:
set ssh-rsa "ssh-rsa XXXXXXXXXXXXXXXX ABillS remote machine manage key (Thu Jul 7 14:17:04 EEST 2022)" show log user acp_kazna_39