Пример. Accel-PPP, PPPoE + IPoE L2

Skip to end of metadata
Go to start of metadata

Описание

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

IPoE подразумевает работу в одном широковещательном сигменте с клиентами, авторизация происходит по первому пакету, если на IP ещё не существует сессии (L2, unclassified packet).

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

Настройка

Параметры серверов Accel и биллинга

  • Внешний 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
  • DNS для абонентов PPPoE: dns1=8.8.8.8, dns2=8.8.4.4

BRAS

Установка Accel и дополнительного ПО

Установите Accel по инструкции:

apt-get install -y build-essential cmake gcc linux-headers-`uname -r` git libpcre3-dev libssl-dev liblua5.1-0-dev
git clone https://github.com/accel-ppp/accel-ppp.git /opt/accel-ppp-code
mkdir /opt/accel-ppp-code/build
cd /opt/accel-ppp-code/build/
cmake -DBUILD_IPOE_DRIVER=TRUE -DBUILD_VLAN_MON_DRIVER=TRUE -DCMAKE_INSTALL_PREFIX=/usr -DKDIR=/usr/src/linux-headers-`uname -r` -DLUA=TRUE -DCPACK_TYPE=Debian10 ..
make
cpack -G DEB
dpkg -i accel-ppp.deb
mv /etc/accel-ppp.conf.dist /etc/accel-ppp.conf
systemctl enable accel-ppp
systemctl start accel-ppp

Установите дополнительное ПО, оно потребуется для диагностики абонентов после интеграции с биллингом:

Дополнительное ПО
apt install -y tcpdump

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

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

Зелёным обозначено что нужно поменять в конфигурационных файлах
Синим обозначено что поменять можно, но лучше оставить как в примере
Красным обозначено что менять не следует

  • [modules]
    • ippool - опциональный модуль, необходим для PPPoE, чтобы назначить IP шлюза на виртуальном интерфейсе. Если используется IPoE - можно отключить.
    • auth_mschap_v1 - авторизация PPPoE по MS CHAP v1, рекомендуется отключить для безопасности
    • auth_chap_md5 - авторизация PPPoE по CHAP, рекомендуется отключить для безопасности
    • auth_pap - авторизация PPPoE по CHAP, настоятельно рекомендуется отключить для безопасности
  • [core]
    • thread-count=1 - количество потоков, увеличение позволит плавно распределить нагрузку по ядрам, оптимальное число - количество процессоров/ядер сервера
  • [log]
    • log-file - путь к логу Accel, туда пишутся все сообщения
    • log-emerg - путь к логу для важных сообщений, при отладке схемы не пригодился, но указать его обязательно, согласно документации
    • log-fail-file - путь к логу неудачных авторизаций, так же не пригодился
    • per-user-dir - путь к логу авторизаций отдельных пользователей, очень упрощает отладку, рекомендуется использовать
    • per-session - если включено, лог отдельных
  • [radius]
    • nas-identifier - укажите название NAS
    • nas-ip-address - укажите IP, скоторого NAS-сервер будет отправлять запросы RADIUS-серверу
    • gw-ip-address - укажите IP шлюза для абонентов, используется как для PPP, так и для IPoE
    • dae-server - IP, порт и пароль CoA
    • server - укажите IP и пароль RADIUS, остальные праметры оставьте как в примере, первая строка - для Auth-Request
    • server - укажите IP и пароль RADIUS, остальные праметры оставьте как в примере, вторая строка для Accounting-Request
    • max-try - максимальное количество попыток авторизации, если RADIUS не отвечает, можно увеличить в больших сетях до 3х, рекомендуется вместо этого увеличивать timeout
    • timeout - время, в течение которого Accel ожидает ответ RADIUS-сервера, в больших сетях можно увеличить до 10
  • [ipoe]
    • interface=enp0s8 - IP интерфейса, за которым находятся абоненты
    • password - общий пароль IPoE
    • calling-sid - задаёт Calling-Station-Id в реквестах, возможные значения mac и ip; для дебага удобней MAC, так как IP известен из User-Name
    • check-mac-change - если включено, Accel сбросит сессию при изменении MAC клиента, рекомендуется включить
    • idle-timeout=45 - время, через которое сессия будет сброшена, если на интерфейсе прекратится поток трафика; рекомендуется установить около минуты, чтобы не создавать лишние запросы к RADIUS при перезагрузке оборудования абонента
    • unit-cache=10 - количество виртуальных интерфейсов, остающихся в кеше даже после завершения сессии абонента; рекомендуется оставить какое-то количество чтобы не создавать лишнюю нагрузку на сервер Accel
  • [pppoe]
    • interface=enp0s8 - имя интрфейса, за которым находятся абоненты
    • called-sid=mac - Calling-Station-Id, для PPP возможные варианты ifname, mac, ifname:mac. Рекомендуется использовать MAC
  • [ppp]
    • min-mtu=1280 - минимальный MTU, при котором Accel создаст сессию для абонента
    • mtu=1400 - MTU, корый назначит Accel, если MRU клиента неприемлем для Accel
    • mru=1400 - предпочтительный размер MRU
    • ccp=1 - рекомендуется, включает компрессию данных
    • mppe=prefer - шифрование данных по протоколу MPPE; рекомендуется prefer, для совместимости со старым или нестабильным оборудованием абонентов; в стабильной сети рекомендуется require
    • ipv6=deny - IPv6 в данной схеме не используется
    • lcp-echo-interval=5 - частота отправки LCP Echo
    • lcp-echo-failure=3 - рекомендуемое максимальное значение не отвеченных LCP Echo, после которого сессия будет разорвана
    • lcp-echo-timeout=45 - время, в течение которого Accel ожижает ответ клиента на LCP Echo
    • unit-cache=1 - количество виртуальных интерфейсов, которые Accel оставит в кеше при обрые сессий, рекомендуется увеличить в нестабильных сетях чтобы снизить нагрузку на сервер Aceel
    • unit-preallocate=1 - при включении опции, Accel создаст виртуальный интерфейс до авторизации сесси, этоможет помочь при отладке, если на одном сервере развёрнуто несколько Accel с разными схемами
  • [dns]
    • dns1 - первичный DNS-сервер, который будет отпарвляться PPPoE абонентам
    • dns2 - вторичный DNS-сервер, который будет отпарвляться PPPoE абонентам
  • [shaper]
    • up-limiter - тип шейпера исходящего трафика
    • down-limiter - тип шейпера входящего трафика
  • [connlimit]
    • limit - максимальное количество запросов авторизации от одного клиента в период времени, 10/min - до 10 за 1 минуту, защита от DOS атаки
    • burst - предельное значение попыток соединений, после которых Accel считает limit
    • timeout - количество секунд, после которых Accel перестаёт считать limit, пока абонент снова не достигнет значения burst

[modules]
ippool
auth_mschap_v1
auth_chap_md5
auth_pap
log_file
pppoe
ipoe
radius
pppd_compat
auth_mschap_v2
shaper

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

[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]
nas-identifier=accel-ppp
nas-ip-address=192.168.1.130
gw-ip-address=192.168.0.100
dae-server=192.168.1.130:3799,AccelCoASecret
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
sid-in-auth=1
max-try=1
timeout=3

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

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

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

[ppp]
min-mtu=1280
mtu=1400
mru=1400
ccp=1
mppe=prefer
ipv6=deny
lcp-echo-interval=5
lcp-echo-failure=3
lcp-echo-timeout=45
unit-cache=1
unit-preallocate=1
ipv4=require
verbose=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]
up-limiter=police
down-limiter=htb
verbose=1
attr=Filter-Id

[connlimit]
limit=10/min
burst=1
timeout=60

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

Нужно добавить одну строку в конец файла - атрибут для описания редиректа (блокировки абонента).

/usr/share/accel-ppp/radius/dictionary
...
ATTRIBUTE L4-Redirect              242 integer

Включение форварда трафика и пропуск серых сетей

Включите форвард трафика
sysctl -w net.ipv4.ip_forward=1

Чтобы послеперезагрузки форвард работал, откройте файл /etc/sysctl.conf и добавьте в конец строку:

Дополнительная строка в /etc/sysctl.conf
net.ipv4.ip_forward=1

Добавьте правила фаервола для пропуска трафика и маскарада серых сетей:

Необходимые правила фаервола
iptables -A FORWARD -j ACCEPT
iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
Настройка сохранения правил фаервола при загрузке сервера
apt-get install iptables-persistent -y
iptables-save > /etc/iptables/rules.v4

Блокировка должжников (ipset)

Установите IPSET и службу восстановления правил при загрузке сервера

Установка ipset
apt install -y ipset ipset-persistent

Добавьте список для заблокированных

Создание списка заблокированных и настройка восстановления при загрузке сервера
ipset create Block hash:ip
ipset save >  /etc/iptables/ipsets

Добавьте правило фаервола для блокировки трафика должников и повторно сохранине настройки фаервола для восстановления при загрузке сервера.

Правило блокировки должников и сохранение настройки фаервола
iptables -I FORWARD -m set --match-set Block src -j DROP
iptables-save > /etc/iptables/rules.v4

Отправка Netflow

Установите программу fprobe:

apt install -y fprobe

Billing

Словарь атрибутов FreeRADIUS в Carbon Billing

Создаёте папку и скопируйте туда текущий словарь (зачем это нужно Вы можете узнать из статьи Изменение системных файлов)

mkdir -p /app/asr_billing/cfg/usr/share/freeradius/
cp /app/asr_billing/usr/share/freeradius/dictionary /app/asr_billing/cfg/usr/share/freeradius/dictionary

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

/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
...

Когда измените файл, перезапустите биллинг, чтобы изменения применились:

/app/asr_billing/service restart

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

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

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

  • Скрипт реализует только основные команды: установка шейпера, блокировка (однинаковое поведение на любые виды блокировок) и снятие блокировки.
  • Команда user_info покажет данные BRAS и проведёт базовую сетевую диагностику, и при отсутствии связи с абонентом может выполняться 3-5 секунд.
  • События, вызываемые при авторизации, не будут отправлены - они не нужны, так как шейпер и статус блокировки в RADIUS атрибутах.
/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(){
        :
}

Прочая информация и примеры

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

Access-Request

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"
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"
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

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

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"
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"
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

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

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
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
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

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

Интерфейсы

Заметьте, что:
  • Интерфейса enp0s8 нет в выводе. Причина - на нём отсутствует адрес IPv4, так и должно быть.
  • IP 100.64.0.1 - это IP шлюза для IPoE абонентов, он одновременно настроен на интерфейсах enp0s3 и ipoe0. Это особенность работы Accel. IP шлюза должен быть настроен, но настроить его нужно на любом интерфейсе, кроме того за которым располагаются абоненты. Возможно, это особенность выбранной версии или тестовой среды.
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

Сессии

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
Введите метки, чтобы добавить к этой странице:
Please wait 
Ищите метку? просто начните печатать.