Пример. Accel-PPP, PPPoE + IPoE L2 ЧЕРНОВИК

Skip to end of metadata
Go to start of metadata
Вы просматриваете старую версию данной страницы. Смотрите текущую версию. Сравнить с текущим  |   просмотр истории страницы

Описание

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

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

Схема проверялась на 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

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

Нужно добавить одну строку ближе к концу файла. В принципе, можно и в самый конец, но разработчики 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
...

Скриншоты настроек 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 при активных абонентах

Интерфейсы

!!!TODO: очень запутанная формулировка про 100.64.0.1, переделать

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