Сборка и установка 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

Приведу пример сборки и установки 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/local -DKDIR=/usr/src/linux-headers-`uname -r` -DRADIUS=TRUE -DSHAPER=TRUE -DLOG_PGSQL=FALSE -DLUA=TRUE -DBUILD_IPOE_DRIVER=TRUE -DBUILD_VLAN_MON_DRIVER=TRUE /opt/accel-ppp-code
sudo make
sudo make install

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

— Install configuration: «»
— 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: /etc/accel-ppp.conf.dist
— 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.rfc2869
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc2867
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc4372
— Installing: /usr/local/share/accel-ppp/radius/dictionary.alcatel
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc3576
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc2866
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc4072
— Installing: /usr/local/share/accel-ppp/radius/dictionary.microsoft
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc4675
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc3580
— Installing: /usr/local/share/accel-ppp/radius/dictionary.dhcp
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc4818
— Installing: /usr/local/share/accel-ppp/radius/dictionary
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc5176
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc4679
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc2868
— Installing: /usr/local/share/accel-ppp/radius/dictionary.cisco
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc2865
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc4849
— Installing: /usr/local/share/accel-ppp/radius/dictionary.rfc3162
— 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.rfc3931
— Installing: /usr/local/share/accel-ppp/l2tp/dictionary.rfc2661
— Installing: /usr/local/share/accel-ppp/l2tp/dictionary
— 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/local/share/accel-ppp/radius/dictionary

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

man accel-ppp.conf

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

local-net=10.0.0.0/24

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

gw-ip-address=172.16.0.1/19

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

lease-time=600
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

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

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

sudo /usr/local/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 можно создать скрипт:

sudo nano /etc/init.d/accel-ppp

И добавить в него содержимое:

#!/bin/sh
# /etc/init.d/accel-ppp: set up the accel-ppp server
### BEGIN INIT INFO
# Provides:          accel-ppp
# Required-Start:    $networking
# Required-Stop:     $networking
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO

set -e

PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/sbin;
ACCEL_PPTPD=`which accel-pppd`
. /lib/lsb/init-functions

if test -f /etc/default/accel-ppp; then
    . /etc/default/accel-ppp
fi

if [ -z $ACCEL_PPPTD_OPTS ]; then
  ACCEL_PPTPD_OPTS="-c /etc/accel-ppp.conf"
fi

case "$1" in
  start)
        log_daemon_msg "Starting accel-ppp server" "accel-pppd"
        if [ x`lsmod |awk /ipoe/'{print $1}'` = x ]; then
          insmod /usr/src/accel-ppp-build/drivers/ipoe/driver/ipoe.ko
        fi
        if start-stop-daemon --start --quiet --oknodo --exec $ACCEL_PPTPD -- -d -p /var/run/accel-pppd.pid $ACCEL_PPTPD_OPTS; then
            log_end_msg 0
        else
            log_end_msg 1
        fi
  ;;
  restart)
        log_daemon_msg "Restarting accel-ppp server" "accel-pppd"
        if [ x`lsmod |awk /ipoe/'{print $1}'` = x ]; then
          insmod /usr/src/accel-ppp-build/drivers/ipoe/driver/ipoe.ko
        fi
        start-stop-daemon --stop --quiet --oknodo --retry 180 --pidfile /var/run/accel-pppd.pid
        if start-stop-daemon --start --quiet --oknodo --exec $ACCEL_PPTPD -- -d -p /var/run/accel-pppd.pid $ACCEL_PPTPD_OPTS; then
            log_end_msg 0
        else
            log_end_msg 1
        fi
  ;;

  stop)
        log_daemon_msg "Stopping accel-ppp server" "accel-pppd"
        start-stop-daemon --stop --quiet --oknodo --retry 180 --pidfile /var/run/accel-pppd.pid
        log_end_msg 0
  ;;

  status)
    do_status
  ;;
  *)
    log_success_msg "Usage: /etc/init.d/accel-ppp {start|stop|status|restart}"
    exit 1
    ;;
esac

exit 0

Сделаем исполняемым и добавим а автозапуск:

sudo chmod +x /etc/init.d/accel-ppp
sudo update-rc.d accel-ppp defaults

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

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

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

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

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

sudo netstat -tulpn | grep :67

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

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

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

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

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

reload

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

accel-cmd -P secret show sessions
accel-cmd show sessions | grep 192.168.1.5

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

accel-cmd -V

Смотрим ответ команды и сверяем по Commit чтобы понять за какое число код Accel-ppp, например у меня отобразилось (судя по Commit 890560, Accel-pp собран из кода за 2018-03-06 10:09:36):

accel-cmd 89056070effd890afcefaefcd3ee257dc1a447ee

Смотрите также мои статьи:
Настройка сети в Linux
Загрузка и выгрузка модулей в Linux
Скрипты ip-up и ip-down с ipset для Accel-ppp
Как включить или отключить Proxy ARP в Linux
Установка и настройка accel-ppp (IPoE) для ABillS
Причина сообщений «HTB: quantum of class 10001 is big. Consider r2q change»

Подписаться на IT Blog (RU) по Email
Subscribe to IT Blog (EN) by Email

Did my article help you? How about buying me a cup of coffee as an encouragement? Buy me a coffe.

Один комментарий к “Сборка и установка accel-ppp”

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

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