В этой статье я приведу пример сборки и установки 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*)
Смотрите также мои статьи:
- Как обновить accel-ppp
- Сборка Accel-ppp в debug
- Установка Accel-ppp в Ubuntu 18
- Настройка сети в Linux
- Загрузка и выгрузка модулей в Linux
- Скрипты ip-up и ip-down с ipset для Accel-ppp
- Как включить или отключить Proxy ARP в Linux
- Установка и настройка accel-ppp (IPoE) для ABillS
- Подавление DHCP серверов (dhcdrop)
- Причина сообщений «HTB: quantum of class 10001 is big. Consider r2q change»
- Изменение CPU Scaling Governor в Linux
- Как откатить версию ядра в Ubuntu
- Мониторинг системных процессов через htop
- Как выдать IP адреса без авторизации
Спасибо за подробный маунал, продолжение хотелось бы со связкой радиус сервера