Сборка и установка accel-ppp

В этой статье я приведу пример сборки и установки accel-ppp в Ubuntu Server.

Требования accel-ppp такие:
Современный дистрибутив Linux
Ядро версии 2.6.25 или старше
cmake не младше версии 2.6
libcrypto-0.9.8 или старше (openssl-0.9.8)
libpcre
net-snmp-5.x (Для snmp)
liblua5.1 (для IPoE c DHCP option 82)

Проверим версии установленных компонентов:

sudo lsb_release -a
sudo uname -r
sudo openssl version
sudo apt show libpcre3-dev libssl-dev snmp liblua5.1

Обновим систему и становим необходимые компоненты:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install linux-headers-`uname -r` build-essential cmake libnl-3-dev libnl-utils libssl-dev libpcre3-dev libnet-snmp-perl libtritonus-bin lua5.1 liblua5.1-0-dev snmp

Скачаем свежий исходный код accel-ppp:

sudo apt-get install git
cd /opt/
sudo git clone git://git.code.sf.net/p/accel-ppp/code accel-ppp-code

Или отсюда (смотря где свежее):

sudo git clone https://github.com/xebd/accel-ppp.git

Пример добавления патча:

cd /opt/accel-ppp-code/
wget https://ixnfo.com/example_patch.diff
patch -p1 < example_patch.diff

Приведу пример сборки и установки accel-ppp (VLAN_MON_DRIVER можно не устанавливать если на сервере не используются VLAN):

sudo mkdir /opt/accel-ppp-code/build
cd /opt/accel-ppp-code/build
sudo cmake -DCMAKE_INSTALL_PREFIX=/usr -DKDIR=/usr/src/linux-headers-`uname -r` -DRADIUS=TRUE -DSHAPER=TRUE -DLOG_PGSQL=FALSE -DNETSNMP=FALSE -DLUA=TRUE -DBUILD_IPOE_DRIVER=TRUE -DBUILD_VLAN_MON_DRIVER=TRUE -DCPACK_TYPE=Ubuntu18 -DCMAKE_BUILD_TYPE=Release /opt/accel-ppp-code
sudo make
sudo make install

Хочу заметить что в новых версиях acel-ppp используются новые версии библиотек, которые например новее тех что в Ubuntu 16, из-за чего могут быть проблемы, поэтому рекомендую устанавливать acel-ppp на новых операционных системах.
Например в Ubuntu 16 новый accel-ppp не устанавливается с ошибкой:

dpkg: зависимости пакетов не позволяют настроить пакет accel-ppp:
accel-ppp зависит от libc6 (>= 2.24), однако:
Версия libc6:amd64 в системе — 2.23-0ubuntu11.
accel-ppp зависит от libssl1.0.0 (>= 1.0.2t), однако:
Версия libssl1.0.0:amd64 в системе — 1.0.2g-1ubuntu4.15.

Если LUA не версии 5.1, то укажем версию вместо «TRUE», например:

-DLUA=5.3

Можно добавить оптимизацию (про оптимизацию можно прочитать тут https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html):

-DCMAKE_C_FLAGS="-g -O2"

После команды установки в /usr/local/ у меня отобразилась следующая информация:

Install the project…
— Install configuration: «Debug»
— Installing: /lib/modules/4.4.0-116-generic/extra/ipoe.ko
— Installing: /lib/modules/4.4.0-116-generic/extra/vlan_mon.ko
— Installing: /etc/accel-ppp.conf.dist
— Installing: /etc/init.d/accel-ppp
— Installing: /etc/default/accel-ppp
— Installing: /usr/lib/systemd/system/accel-ppp.service
— Installing: /var/log/accel-ppp
— Installing: /usr/local/sbin/accel-pppd
— Set runtime path of «/usr/local/sbin/accel-pppd» to «/usr/local/lib64/accel-ppp»
— Installing: /usr/local/share/man/man5/accel-ppp.conf.5
— Installing: /usr/local/lib64/accel-ppp/libluasupp.so
— Installing: /usr/local/lib64/accel-ppp/libradius.so
— Set runtime path of «/usr/local/lib64/accel-ppp/libradius.so» to «/usr/local/lib64/accel-ppp»
— Installing: /usr/local/share/accel-ppp/radius/dictionary.alcatel
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc4818
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc2868
— Installing: /usr/local/share/accel-ppp/radius/dictionary.dhcp
— Installing: /usr/local/share/accel-ppp/radius/dictionary
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc3580
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc2867
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc2865
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc2866
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc4675
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc4679
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc3576
— Installing: /usr/local/share/accel-ppp/radius/dictionary.cisco
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc4072
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc5176
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc2869
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc4849
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc3162
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc4372
— Installing: /usr/local/share/accel-ppp/radius/dictionary.microsoft
— Installing: /usr/local/lib64/accel-ppp/libtriton.so
— Installing: /usr/local/lib64/accel-ppp/libvlan-mon.so
— Installing: /usr/local/lib64/accel-ppp/libpptp.so
— Installing: /usr/local/lib64/accel-ppp/libpppoe.so
— Set runtime path of «/usr/local/lib64/accel-ppp/libpppoe.so» to «/usr/local/lib64/accel-ppp»
— Installing: /usr/local/lib64/accel-ppp/libl2tp.so
— Installing: /usr/local/share/accel-ppp/l2tp/dictionary.rfc2661
— Installing: /usr/local/share/accel-ppp/l2tp/dictionary
— Installing: /usr/local/share/accel-ppp/l2tp/dictionary.rfc3931
— Installing: /usr/local/lib64/accel-ppp/libsstp.so
— Installing: /usr/local/lib64/accel-ppp/libipoe.so
— Set runtime path of «/usr/local/lib64/accel-ppp/libipoe.so» to «/usr/local/lib64/accel-ppp»
— Installing: /usr/local/lib64/accel-ppp/libauth_pap.so
— Installing: /usr/local/lib64/accel-ppp/libauth_chap_md5.so
— Installing: /usr/local/lib64/accel-ppp/libauth_mschap_v1.so
— Installing: /usr/local/lib64/accel-ppp/libauth_mschap_v2.so
— Installing: /usr/local/lib64/accel-ppp/liblog_file.so
— Installing: /usr/local/lib64/accel-ppp/liblog_tcp.so
— Installing: /usr/local/lib64/accel-ppp/liblog_syslog.so
— Installing: /usr/local/lib64/accel-ppp/libpppd_compat.so
— Set runtime path of «/usr/local/lib64/accel-ppp/libpppd_compat.so» to «/usr/local/lib64/accel-ppp»
— Installing: /usr/local/lib64/accel-ppp/libippool.so
— Installing: /usr/local/lib64/accel-ppp/libipv6pool.so
— Installing: /usr/local/lib64/accel-ppp/libsigchld.so
— Installing: /usr/local/lib64/accel-ppp/libchap-secrets.so
— Installing: /usr/local/lib64/accel-ppp/liblogwtmp.so
— Installing: /usr/local/lib64/accel-ppp/libconnlimit.so
— Installing: /usr/local/lib64/accel-ppp/libipv6_dhcp.so
— Installing: /usr/local/lib64/accel-ppp/libipv6_nd.so
— Installing: /usr/local/lib64/accel-ppp/libshaper.so
— Installing: /usr/local/bin/accel-cmd
— Installing: /usr/local/share/man/man1/accel-cmd.1

При необходимости загрузим модули:

lsmod | grep ipoe
sudo modprobe ipoe
sudo cp ./drivers/ipoe/driver/ipoe.ko /lib/modules/`uname -r`/kernel/net
sudo depmod -a
sudo cp ./drivers/vlan_mon/driver/vlan_mon.ko /lib/modules/`uname -r`/kernel/net
sudo depmod -a
sudo modprobe ipoe
sudo modprobe vlan_mon
lsmod | grep ipoe
lsmod | grep vlan_mon

Чтобы модули ipoe и vlan_mon загружались при запуске системы, откроем в текстовом редакторе файл /etc/modules:

sudo nano /etc/modules

И добавим:

ipoe
vlan_mon

Скопируем пример файла конфигурации accel-ppp и заполним содержимым в зависимости от потребностей:

sudo cp /etc/accel-ppp.conf.dist /etc/accel-ppp.conf
sudo nano /etc/accel-ppp.conf
sudo nano /etc/accel-ppp.lua
sudo nano /usr/share/accel-ppp/radius/dictionary

Справка по конфигурации:

man accel-ppp.conf

Сети с управляемыми коммутаторами и т.д. которые Accel должен пропускать при start=up, укажем в секции «ipoe» так:

local-net=10.0.0.0/24

Сети для клиентов укажем так (например шлюз и маска берется отсюда, IP из биллинга):

gw-ip-address=172.16.0.1/19

Если нужно использовать req-limit только для auth, а для acct убрать лимит, чтобы не образовывалась большая очередь, то Radius сервер можно указать так:

server=127.0.0.1,pass,auth-port=0,req-limit=50,fail-timeout=0,max-fail=0,acct-timeout=0,weight=1
server=127.0.0.1,pass,acct-port=0,req-limit=0,fail-timeout=0,max-fail=0,acct-timeout=0,weight=1

Время DHCP аренды (время продления IP = lease-time/2):

lease-time=600
max-lease-time=660
renew-time=300

Пример для L3 схемы:

interface=eth1,mode=L3,start=dhcpv4,shared=1,ifcfg=1,proxy-arp=1

Если использовать схему L3, то я прописывал маршруты к IP шлюзов (vlan interfaces) на свиче и указывал их в /etc/network/interfaces чтобы они были после перезапуска системы (где 10.0.0.2 L3 свич, а 10.0.0.1 сервер с accel-ppp):

post-up /bin/ip route add 172.16.0.1 via 10.0.0.2
post-up /bin/ip route add 172.18.0.1 via 10.0.0.2

Замечу, что если использовать одновременно схему L2 и L3 с авторизацией по MAC, и клиент из сети L3 включит свое устройство в сети L2, то сеть L3 перестанет работать, так как accel-ppp поднимет IP адрес шлюза для клиента.

Пример указания интерфейсов VLAN от 200 по 1299 через регулярные выражения PCRE, VLAN интерфейсы должны быть созданы в системе заранее, можно создать не все что указаны в конфигурации accel-ppp, но потом при добавлении в системе, необходимо будет выполнить accel-cmd reload (при необходимости, правильность регулярных выражений можно проверить на специальных сайтах, например regex101.com):

interface=re:^vlan[2-9][0-9][0-9]$,mode=L2,start=dhcpv4,shared=1,ifcfg=1,ip-unnumbered=1,proxy-arp=1
interface=re:^vlan1[0-2][0-9][0-9]$,mode=L2,start=dhcpv4,shared=1,ifcfg=1,ip-unnumbered=1,proxy-arp=1

Можно исключить из регулярного выражения VLAN, например VLAN 501 (спасибо Dimka88 за пример):

interface=re:(?!(^vlan501$))(^vlan[2-9][0-9][0-9]+$),mode=L2,start=dhcpv4,shared=1,ifcfg=1,ip-unnumbered=1,proxy-arp=1
interface=vlan501,mode=L3,start=dhcpv4,shared=1,ifcfg=1,proxy-arp=1

proxy-arp=0 — отключен (по умолчанию)
proxy-arp=1 — отвечает на arp запросы, если запрашиваемый IP не принадлежит другой сессии на том-же интерфейсе (если shared=1)
proxy-arp=2 — отвечает на arp запросы, если запрашиваемый IP принадлежит сессии на том-же интерфейсе, то отвечает адресом этой сессии, иначе адресом сервера.
proxy-arp=3 — всегда отвечает на arp запросы адресом своего интерфейса (сервера), то есть весь трафик пойдет через accel-ppp.

Accel-ppp умеет старт по DHCP и неклассифицированному пакету, можно указать одновременно:

start=up,start=dhcp

Если старт только по DHCP, и чтобы после Session-Timeout клиент не сидел без интернета пока вновь не поднимется сессия, то есть очень полезный режим мягкого завершения сессий:

soft-terminate=1

Если используется биллинг Abills, то Acct-Interim-Interval, обычно передается из поля Alive сервера доступа, 600 секунд по умолчанию.

В секции «core» укажем thread-count равно например количеству ядер на одном процессоре:

thread-count=8

Если нужны дополнительные операции при старте и завершении сессий, то можно расскомментировать pppd_compat и написать скрипты:

sudo nano /etc/ppp/ip-up
sudo nano /etc/ppp/ip-down

Параметры которые можно вывести через echo:

$1 - Interface name
$4 - Tunnel GW IP address
$5 - Delegated IP address to the client
$6 - Calling Station ID

Запустить вручную и завершить accel-ppp можно так:

sudo /usr/sbin/accel-pppd -d -p /var/run/accel-pppd.pid -c /etc/accel-ppp.conf
sudo netstat -tulpn | grep accel
sudo ps ax|grep accel
sudo killall accel-pppd

При установке accel-ppp создаются скрипты автозапуска в /etc/init.d/accel-ppp и /usr/lib/systemd/system/accel-ppp.service, чтобы активировать автозапуск при старте системы, выполним:

sudo chmod +x /etc/init.d/accel-ppp
sudo systemctl is-enabled accel-ppp.service
sudo systemctl enable accel-ppp.service

Кстати в скрипте /usr/lib/systemd/system/accel-ppp.service указано «Restart=always» и если допустим необходимо останавливать accel с заверением сессий, то укажем «Restart=on-failure» и выполним команду «systemctl daemon-reload».

В дальнейшем accel-ppp можно остановить или перезапустить:

telnet 127.0.0.1 2000
shutdown hard
sudo /etc/init.d/accel-ppp stop
sudo /etc/init.d/accel-ppp start
sudo /etc/init.d/accel-ppp restart
sudo /etc/init.d/accel-ppp status

sudo systemctl stop accel-ppp.service
sudo systemctl start accel-ppp.service
sudo systemctl restart accel-ppp.service
sudo systemctl status accel-ppp.service

Создадим конфигурацию для ротации логов:

nano /etc/logrotate.d/accel-ppp

И добавим содержимое (после чего, логи старше 3 дней будут удаляться автоматически):

/var/log/accel-ppp/*.log {
daily
rotate 3
missingok
sharedscripts
postrotate
test -r /var/run/accel-pppd.pid && kill -HUP `cat /var/run/accel-pppd.pid`
endscript
}

Если файлы логов очень большие, то можно вручную запустить logrotate:

logrotate --force /etc/logrotate.d/accel-ppp

Или очистить так:

echo "" > /var/log/accel-ppp/emerg.log
echo "" > /var/log/accel-ppp/auth-fail.log
echo "" > /var/log/accel-ppp/accel-ppp.log

Если accel-ppp работает также в качестве DHCP сервера, то можно это проверить, а также cli и dae:

sudo netstat -tulpn | grep :67
sudo netstat -tulpn | grep :2000
sudo netstat -tulpn | grep :2001
sudo netstat -tulpn | grep :3799

Пример ловли пакетов для анализа проблем через tcpdump и dhcpdump:

sudo tcpdump port 67 or port 68 -e -n
sudo tcpdump ether host e0:cb:4e:c3:7c:44
sudo tcpdump -n -i vlan501 -e -vv

sudo dhcpdump -i ens2f1 -h 00:26:18:f9:00:80
sudo dhcpdump -i vlan207 -h 00:30:4f:6e:00:47

Приведу несколько примеров просмотра логов в том числе и в реальном времени:

tail -F /var/log/accel-ppp/accel-ppp.log
tail -f /var/log/accel-ppp/accel-ppp.log | grep 192.168.1.5
tail -F /var/log/accel-ppp/accel-ppp.log | grep e0:00:4e:00:7c:44
less /var/log/accel-ppp/accel-ppp.log
less /var/log/accel-ppp/accel-ppp.log | grep 192.168.1.5
tail -F /var/log/accel-ppp/auth-fail.log
tail -F /var/log/accel-ppp/core.log
tail -F /var/log/accel-ppp/emerg.log

Можно посчитать количество сессий:

ifconfig | grep ipoe | wc -l
tc class show dev ipoe0

Можно подключиться к консоли accel-ppp (при запросе пароля введем тот что указан в конфигурации в блоке cli):

telnet 127.0.0.1 2000

Приведу пример команд:

show sessions
show sessions match ip 10.55.
show sessions match username 2c:56:dc:3b:f6:00
terminate ip 10.10.0.179 soft
terminate ip 10.10.0.179 hard
show stat
help

Если изменялся конфигурационный файл, то некоторые изменения можно применить для новых сессий не перезапуская accel-ppp, выполнив команду:

reload

Можно получить результат команды из linux так:

accel-cmd -P secret show sessions
accel-cmd -H192.168.2.1 -P password show sessions match ip 10.55.
accel-cmd -H192.168.2.1 -P password show stat
accel-cmd show sessions | grep 192.168.1.5

Посмотреть установленную версию accel-ppp можно так:

accel-cmd -V

Смотрим ответ команды и сверяем по ссылке
https://sourceforge.net/p/accel-ppp/code/ci/6c514056471dfdf030d69fb9fda443047a8cc964/log/?path=
чтобы понять за какое число код Accel-ppp, например у меня отобразилось (судя по Commit 890560, Accel-pp собран из кода за 2018-03-06 10:09:36):

accel-cmd 89056070effd890afcefaefcd3ee257dc1a447ee

Еще можно посмотреть версию так:

git describe --tags

На Debian 10 возможно прийдется в файле /lib/udev/ifupdown-hotplug добавить ipoe*, чтобы получилось:

# these interfaces generate hotplug events *after* they are brought up
case $INTERFACE in
        ppp*|ippp*|isdn*|plip*|lo|irda*|ipsec*|ipoe*)

Смотрите также мои статьи:

Вливайтесь в общение

1 комментарий

Добавить комментарий

  1. Спасибо за подробный маунал, продолжение хотелось бы со связкой радиус сервера

Больше на IT Blog

Оформите подписку, чтобы продолжить чтение и получить доступ к полному архиву.

Continue reading