Просмотр Исходного

{toc}

h1. Описание

Сдвоенная схема для PPPoE и IPoE одновременно - такую гибкость настройки позволяет Accel.

IPoE подразумевает работу в одном широковещательном сигменте с клиентами.

Схема проверялась на Debian 10 и Ubuntu 20.04

h1. Настройка

h2. BRAS

h3. Что нужно поменять в конфигурационных файлах

*{color:red}!!!TODO идея: сделать расписанный лог красным/зелёным/синим с пояснениями{color}*

*{color:red}TODO: описать эти опции наглядней{color}*

* *Внешний IP Accel, он же IP с которого уходят запросы к биллингу*: 192.168.1.130
* *Внутренний IP Accel, он же IP шлюза для абонентов IPoE*: 192.168.0.100
* *Интерфейс, за которым находятся абоненты*: enp0s8
* *IP, биллинга, на который BRAS будет отправлять запросы авторизации и Netflow*: 192.168.1.156
* *Пароль RADIUS-клиента (не забудьте указать одинаковый в Accel и на биллинге)*: AccelSharedSecret
* *Пароль CoA-клиента (не забудьте указать одинаковый в Accel и на биллинге)*: AccelCoASecret

h3. Что можно поменять, но не обязательно

* *DNS для абонентов PPPoE*: dns1=8.8.8.8, dns2=8.8.4.4

h3. Что менять не следует

*{color:red}TODO: описать эти опции наглядней{color}*

* *IP шлюза для абонентов PPPoE*: 10.128.0.1
* *ifcfg=1, shared=1, mode=L2, start=up*: - это важные параметры для правильной работы описанной схемы. Если их поменять - у Вас будет уже другая схема, не описанная в этой статье
* *auth-port=1812, acct-port=1813*: биллигом не преусмотрено изменение этих параметров, все NAS сервера дожны обращаться к биллингу именно на эти порты для авторизации и аккаунтинга
* *Две строки server= в секции radius, отдельно для аккаунтинга и авторизации*: такую настройку разработчики Carbon Soft заложили в XGE, где так же используется Accel, как наиболее стабильнную. Лучше последовать их примеру для гарантии правильного взаимодействия биллинга и Accel.
* *level, verbose* - опции определяют детализацию журнала сервера. Лучше оставьте детализацию максимальной, это сэкономит время при отладке возникающих проблем в процессе эксплуатации
* *per-session* - сильно упростит

h3. Листинги конфигурационных файлов

h4. Конфигурационный файл Accel

{code:title=/etc/accel-ppp.conf}
[modules]
log_file
pppoe
ipoe
radius
pppd_compat
ippool
auth_mschap_v2
auth_mschap_v1
auth_chap_md5
auth_pap
shaper

[core]
log-error=/var/log/accel-ppp/core.log
thread-count=1

[common]
single-session=replace
sid-source=urandom
check-ip=1

[log]
log-file=/var/log/accel-ppp/accel-ppp.log
log-emerg=/var/log/accel-ppp/emerg.log
log-fail-file=/var/log/accel-ppp/auth-fail.log
per-user-dir=/var/log/accel-ppp/users
per-session=1
copy=1
level=5

[radius]
verbose=5
nas-identifier=accel-ppp
nas-ip-address=192.168.1.130
gw-ip-address=192.168.0.100
server=192.168.1.156,AccelSharedSecret,auth-port=1812,acct-port=0,req-limit=100,fail-timeout=0,max-fail=10,weight=1
server=192.168.1.156,AccelSharedSecret,auth-port=0,acct-port=1813,req-limit=100,fail-timeout=0,max-fail=10,weight=1
dae-server=192.168.1.130:3799,AccelCoASecret
sid-in-auth=1
max-try=1
timeout=3

[cli]
verbose=0
telnet=127.0.0.1:2000
tcp=127.0.0.1:2001

[ipoe]
verbose=1
ifcfg=1
shared=1
interface=enp0s8
mode=L2
start=up
calling-sid=mac
check-mac-change=1
soft-terminate=0
idle-timeout=45
password=AccelCommonPassword
attr-l4-redirect=L4-Redirect
l4-redirect-ipset=Block
unit-cache=10

[pppoe]
verbose=1
called-sid=mac
interface=enp0s8

[ppp]
verbose=1
min-mtu=1280
mtu=1400
mru=1400
ccp=1
mppe=prefer
ipv4=require
ipv6=deny
lcp-echo-interval=5
lcp-echo-failure=3
lcp-echo-timeout=45
unit-cache=1
unit-preallocate=1

[dns]
dns1=8.8.8.8
dns2=8.8.4.4

[ip-pool]
gw-ip-address=10.128.0.1

[pppd-compat]
verbose=1
ip-up=/etc/ppp/ip-up
ip-down=/etc/ppp/ip-down
radattr-prefix=/var/run/radattr

[shaper]
verbose=1
attr=Filter-Id
up-limiter=police
down-limiter=htb

[connlimit]
limit=10/min
burst=3
timeout=60
{code}

h4. Словарь атрибутов RADIUS
Нужно добавить одну строку в конец файла - атрибут для описания редиректа (блокировки абонента).
{code:title=/usr/share/accel-ppp/radius/dictionary}
...
ATTRIBUTE L4-Redirect 242 integer
{code}

h2. Billing

h3. Словарь атрибутов RADIUS

Нужно добавить одну строку ближе к концу файла. В принципе, можно и в самый конец, но разработчики FreeRADIUS предлогают добавить именно тут. Предлагаем последовать их совету.

{code:title=/app/asr_billing/cfg/usr/share/freeradius/dictionary}
...
#
# Miscellaneous attributes defined in weird places that
# don't really belong anywhere else...
#
ATTRIBUTE L4-Redirect 242 integer
...
{code}

h3. Скриншоты настроек NAS

!Accel Описание, основные настройки.png|border=0,width=800!

!Accel Дополнительно.png|border=0,width=800!

!Accel RADIUS-атрибуты.png|border=0,width=800!

h3. Скриншот учётной записи абонента (одинаково PPPoE и IPoE)

!Accel Учетная запись абонента.png|border=0,width=1000!


h3. Скрипт управления session

* Скрипт реализует только основные команды: установка шейпера, блокировка (однинаковое поведение на любые виды блокировок) и снятие блокировки.
* Команда user_info покажет данные BRAS и проведёт базовую сетевую диагностику, и при отсутствии связи с абонентом может выполняться 3-5 секунд.
* События, вызываемые при авторизации, не будут отправлены - они не нужны, так как шейпер и статус блокировки в RADIUS атрибутах.

{code:title=/app/asr_billing/var/oss/core/<NAS>/ubin/session}
#!/bin/bash
. $(dirname $BASH_SOURCE)/../bin/session



###
### Документация по custom схемам OSS находится здесь:
### http://docs.carbonsoft.ru/x/HIAlAw
###

__coa_send() {
if [[ $owner_script == events.py ]]; then
echo "Не отправляем команды при авторизации, выходим из скрипта: exit 0"
exit 0
fi
echo "$@" | radclient -x $nas_ip coa $coa_psw &>$TMPDIR/radclient.$$
ret=$?
# exit 254 отложить передачу, todo возможно и другие схожие busy context и тд
grep "no response from server" $TMPDIR/radclient.$$ && exit 254
cat $TMPDIR/radclient.$$
return $ret
}

# Приходит при отключении пользователя администратором
# либо при добровольной блокировке.
user_disconnect() {
# echo "Framed-IP-Address=100.64.0.15" | radclient -x 192.168.1.130 disconnect AccelCoASecret
echo "Framed-IP-Address=${ip}" | radclient -x $nas_ip disconnect $coa_psw
}

# Приходит при удалении пользователя из биллинга
# И при смене критичных параметров(ip, vlan, port etc.)(со старыми значениями)
# Обычно используется для ВСЕХ видов авторизации
user_del() {
user_disconnect
}

# Приходит при превышении лимита, либо при отключении услуги
user_redirect() {
__coa_send "Framed-IP-Address=${ip},L4-Redirect=1"
}

# Приходит после оплаты, если хватило денег на включение услуги
user_redirect_cancel() {
__coa_send ip redirect del $ip
}


# Приходит при изменении скорости подключения
# Или включения\выключении услуги(турбокнопка, ночной форсаж и т.д.)
user_rate_set() {
__coa_send "Framed-IP-Address=${ip},Filter-Id=$ceil_in/$ceil_out"
}

# Приходит при нажатии кнопки info в учетной записи
user_info() {
sshpass -p ${telnet_password} ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o GSSAPIAuthentication=no ${telnet_login}@${telnet_ip} "
echo '<p style=\"color:#007Ac5\"><b>accel-cmd show sessions match ip ${ip}</b></p>'
echo '<pre style=\"height:auto;overflow: auto;\">'
accel-cmd show sessions match ip ${ip}
echo '</pre>'
echo '<p style=\"color:#007Ac5\"><b>ipset save | grep ${ip}</b></p>'
echo '<pre style=\"height:auto;overflow: auto\">'
ipset save | grep ${ip}
echo '</pre>'
echo '<p style=\"color:#007Ac5\"><b>ping -4 ${ip} -A -c4</b></p>'
echo '<pre style=\"height:auto;overflow: auto\">'
ping -4 ${ip} -A -c4
echo '</pre>'
echo '<p style=\"color:#007Ac5\"><b><span style=\"color: #999\">timeout 3</span> tcpdump -nni any src ${ip} -c 4</b></p>'
echo '<pre style=\"height:auto;overflow: auto\">'
timeout 3 tcpdump -nni any src ${ip} -c 4
echo '</pre>'
" >> /tmp/${user_id}_user_info.new

mv -f /tmp/${user_id}_user_info.new /tmp/${user_id}_user_info
chown apache:apache /tmp/${user_id}_user_info
[ "${is_daemon:--}" != 1 ] && cat /tmp/${user_id}_user_info
}

# Приходит при нажатии кнопки тест в учетной записи
user_test() {
:
}

# Приходит при создании пользователя в биллинге
# И при смене критичных параметров(ip, vlan, port etc.)(с новыми значениями)
# Обычно используется для ip авторизации
user_add() {
:
}

# Приходит после авторизации пользователя
# Рекомендуется политику пользователя передавать в радиус replay параметрах, А НЕ В ЭТОМ СОБЫТИИ,
# т.к. у любого оборудования есть ограничения на колличество отправляемых команд в секунду
user_accept() {
:
}

# Приходит при отключении пользователя
# Рекомендуется избегать удаления пользователя из списков, для экономии очереди команд на оборудовании
user_drop() {
:
}

# Приходит при добавлении услуги абоненту
usluga_add(){
:
}

# Приходит при удалении услуги у абонента
usluga_del(){
:
}

# Приходит при активации услуги
usluga_activated(){
:
}

# Приходит при деактивации услуги
usluga_deactivated(){
:
}
{code}

h2. Примеры запросов в журнале RADIUS в режиме повышенной отладки

h3. Access-Request

{code:title=IPoE}
rad_recv: Access-Request packet from host 192.168.1.130 port 53835, id=1, length=153
User-Name = "100.64.0.2"
NAS-Identifier = "accel-ppp"
NAS-IP-Address = 192.168.1.130
NAS-Port = 4
NAS-Port-Id = "ipoe0"
NAS-Port-Type = Ethernet
Calling-Station-Id = "08:00:27:a3:36:f3"
Called-Station-Id = "enp0s8"
Framed-IP-Address = 100.64.0.2
Acct-Session-Id = "0c56614294fc0ffa"
User-Password = "AccelCommonPassword"
{code}


{code:title=PPPoE, PAP}
rad_recv: Access-Request packet from host 192.168.1.130 port 54164, id=1, length=147
User-Name = "test"
NAS-Identifier = "accel-ppp"
NAS-IP-Address = 192.168.1.130
NAS-Port = 0
NAS-Port-Id = "ppp0"
NAS-Port-Type = Virtual
Service-Type = Framed-User
Framed-Protocol = PPP
Calling-Station-Id = "08:00:27:37:99:4e"
Called-Station-Id = "08:00:27:de:c9:cb"
Acct-Session-Id = "332815f09a46e2a2"
User-Password = "servicemode"
{code}

{code:title=PPPoE, MS-CHAP2}
rad_recv: Access-Request packet from host 192.168.1.130 port 36736, id=1, length=211
User-Name = "test"
NAS-Identifier = "accel-ppp"
NAS-IP-Address = 192.168.1.130
NAS-Port = 0
NAS-Port-Id = "ppp0"
NAS-Port-Type = Virtual
Service-Type = Framed-User
Framed-Protocol = PPP
Calling-Station-Id = "08:00:27:37:99:4e"
Called-Station-Id = "08:00:27:de:c9:cb"
Acct-Session-Id = "478dd8f06d2939d0"
MS-CHAP-Challenge = 0x273ac9a62f91d9a56b66fb05cf47209c
MS-CHAP2-Response = 0x0100374c413999dc31e3b824fd55804443d9000000000000000025ba423765744584b7794c0c20865a39d1b6acf711637b14
{code}

h3. Access-Accept, интернет есть IPoE

{code:title=IPoE}
Sending Access-Accept of id 1 to 192.168.1.130 port 53835
Acct-Interim-Interval := 600
Framed-IP-Address := 100.64.0.2
Filter-Id := "1024/1024"
{code}

{code:title=PPPoE, PAP}
Sending Access-Accept of id 1 to 192.168.1.130 port 50421
Framed-Protocol = PPP
Acct-Interim-Interval := 600
Framed-IP-Address := 10.100.0.2
Filter-Id := "1024/1024"
{code}

{code:title=PPPoE, MS-CHAP2}
Sending Access-Accept of id 1 to 192.168.1.130 port 46953
Framed-Protocol = PPP
Acct-Interim-Interval := 600
Framed-IP-Address := 10.100.0.2
Filter-Id := "1024/1024"
MS-CHAP2-Success = 0x01533d36383044333637384539314430424233393135303041444444303045313341433339414230334636
MS-MPPE-Recv-Key = 0x023bc092ddc84523b515fdb167f5be32
MS-MPPE-Send-Key = 0x93d347f317f8adf76964ca06744a94e3
MS-MPPE-Encryption-Policy = 0x00000002
MS-MPPE-Encryption-Types = 0x00000006
{code}

h3. Access-Accept, заблокирован, любая блокировка

{code:title=IPoE}
Sending Access-Accept of id 1 to 192.168.1.130 port 50181
Acct-Interim-Interval := 600
Framed-IP-Address := 100.64.0.2
Filter-Id := "1024/1024"
L4-Redirect = 1
{code}

{code:title=PPPoE, PAP}
Sending Access-Accept of id 1 to 192.168.1.130 port 54164
Framed-Protocol = PPP
Acct-Interim-Interval := 600
Framed-IP-Address := 10.100.0.2
Filter-Id := "1024/1024"
L4-Redirect = 1
{code}

{code:title=PPPoE, MS-CHAP2}
Sending Access-Accept of id 1 to 192.168.1.130 port 35918
Framed-Protocol = PPP
Acct-Interim-Interval := 600
Framed-IP-Address := 10.100.0.2
Filter-Id := "1024/1024"
L4-Redirect = 1
MS-CHAP2-Success = 0x01533d39314432323237433141353742363231443339433336334444424243353635353042443730393434
MS-MPPE-Recv-Key = 0x368a939a3bbec61aef450266efafff6b
MS-MPPE-Send-Key = 0xb73d88628a05d65e83f97bbf24459fe8
MS-MPPE-Encryption-Policy = 0x00000002
MS-MPPE-Encryption-Types = 0x00000006
{code}

h2. Состояние сессий и интерфейсов на Accel при активных абонентах

h3. Интерфейсы

{tip}
Заметьте, что:
* Интерфейса enp0s8 нет в выводе. Причина - на нём отсутствует адрес IPv4, так и должно быть.
* IP 100.64.0.1 одновременно на интерфейсах enp0s3 и ipoe0. Это тоже правильно - IP шлюза для абонентов IPoE должен быть на любом физичеком или bond интерфейсе, *кроме того, за которым абоненты находятся*
{tip}

{code:title=ip -4 a}
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
inet 192.168.1.130/24 brd 192.168.1.255 scope global enp0s3
valid_lft forever preferred_lft forever
inet 100.64.0.1/24 brd 100.64.0.255 scope global enp0s3
valid_lft forever preferred_lft forever
8: ppp0: <POINTOPOINT,UP,LOWER_UP> mtu 1492 qdisc htb state UNKNOWN group default qlen 3
inet 10.128.0.1 peer 10.100.0.2/32 scope global ppp0
valid_lft forever preferred_lft forever
9: ipoe0: <POINTOPOINT,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc htb state UNKNOWN group default qlen 100
inet 100.64.0.1 peer 100.64.0.2/32 scope global ipoe0
valid_lft forever preferred_lft forever
{code}

h3. Сессии

{code:title=accel-cmd show sessions}
ifname | username | calling-sid | ip | rate-limit | type | comp | state | uptime
--------+------------+-------------------+------------+------------+-------+------+--------+----------
ipoe0 | 100.64.0.2 | 08:00:27:a3:36:f3 | 100.64.0.2 | 1024/1024 | ipoe | | active | 00:00:24
ppp0 | test | 08:00:27:37:99:4e | 10.100.0.2 | 1024/1024 | pppoe | | active | 00:00:17
{code}