...
Скопируем купленный модуль в директорию с биллиногом:
cp Mx802.pm /usr/abills/Abills/mysql
В файле конфигурации 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 |