Для примера выполню настройку 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 |