Подключаем словарь аццел на стороне биллинга

/usr/local/etc/raddb/dictionary

раскоментировать

$INCLUDE           /usr/local/etc/raddb/dictionary_preset/accel-ppp.dictionary

На биллинге создаем НАС

Смотрим ключ для данного наса

 Он будет использоваться в дальнейшей конфигурации

Рестартим радиус

# service radiusd restart

Редактируем НАС со след атрибутами

Тыцаем сохранить. Клонируем настройки.

eyJvcHRpb25zIjp7ImlkIjoiOCIsIm5hc2lkIjoiOSIsInVzZXJuYW1ldHlwZSI6ImxvZ2luIiwic2VydmljZSI6ImNvYSIsIm9ubHlhY3RpdmUiOiIwIiwicG9ydCI6IjM3OTkifSwiYXR0cmlidXRlcyI6eyI0NCI6eyJpZCI6IjQ0IiwibmFzaWQiOiI5Iiwic2NlbmFyaW8iOiJyZXBseSIsIm1vZGlmaWVyIjoiYWN0aXZlIiwiYXR0cmlidXRlIjoiUFBQRC1VcHN0cmVhbS1TcGVlZC1MaW1pdCIsIm9wZXJhdG9yIjoiPSIsImNvbnRlbnQiOiJ7U1BFRURVUH0ifSwiNDUiOnsiaWQiOiI0NSIsIm5hc2lkIjoiOSIsInNjZW5hcmlvIjoicmVwbHkiLCJtb2RpZmllciI6ImFjdGl2ZSIsImF0dHJpYnV0ZSI6IlBQUEQtRG93bnN0cmVhbS1TcGVlZC1MaW1pdCIsIm9wZXJhdG9yIjoiPSIsImNvbnRlbnQiOiJ7U1BFRURET1dOfSJ9LCI0MiI6eyJpZCI6IjQyIiwibmFzaWQiOiI5Iiwic2NlbmFyaW8iOiJyZXBseSIsIm1vZGlmaWVyIjoiYWxsIiwiYXR0cmlidXRlIjoiRnJhbWVkLUlQLUFkZHJlc3MiLCJvcGVyYXRvciI6Ij0iLCJjb250ZW50Ijoie0lQfSJ9LCI0MyI6eyJpZCI6IjQzIiwibmFzaWQiOiI5Iiwic2NlbmFyaW8iOiJyZXBseSIsIm1vZGlmaWVyIjoiYWxsIiwiYXR0cmlidXRlIjoiRnJhbWVkLUlQLU5ldG1hc2siLCJvcGVyYXRvciI6Ij0iLCJjb250ZW50IjoiMjU1LjI1NS4yNTUuMjU1In0sIjQxIjp7ImlkIjoiNDEiLCJuYXNpZCI6IjkiLCJzY2VuYXJpbyI6ImNoZWNrIiwibW9kaWZpZXIiOiJhbGwiLCJhdHRyaWJ1dGUiOiJDbGVhcnRleHQtUGFzc3dvcmQiLCJvcGVyYXRvciI6Ijo9IiwiY29udGVudCI6IntQQVNTV09SRH0ifSwiNjgiOnsiaWQiOiI2OCIsIm5hc2lkIjoiOSIsInNjZW5hcmlvIjoicmVwbHkiLCJtb2RpZmllciI6ImFsbCIsImF0dHJpYnV0ZSI6IkZpbHRlci1JZCIsIm9wZXJhdG9yIjoiPSIsImNvbnRlbnQiOiJ7U1RBVEV9In19LCJzZXJ2aWNlcyI6eyI5Ijp7ImlkIjoiNyIsIm5hc2lkIjoiOSIsInBvZCI6IntQUklOVEZ9ICdGcmFtZWQtSVAtQWRkcmVzcz0ge0lQfScgfCB7U1VET30ge1JBRENMSUVOVH0ge05BU0lQfTozNzk5IGRpc2Nvbm5lY3Qge05BU1NFQ1JFVH0iLCJjb2Fjb25uZWN0Ijoie1BSSU5URn0gJ0ZyYW1lZC1JUC1BZGRyZXNzPSB7SVB9JyB8IHtTVURPfSB7UkFEQ0xJRU5UfSB7TkFTSVB9OjM3OTkgZGlzY29ubmVjdCB7TkFTU0VDUkVUfSIsImNvYWRpc2Nvbm5lY3QiOiJ7UFJJTlRGfSAnRnJhbWVkLUlQLUFkZHJlc3M9IHtJUH0nIHwge1NVRE99IHtSQURDTElFTlR9IHtOQVNJUH06Mzc5OSBkaXNjb25uZWN0IHtOQVNTRUNSRVR9In19fQ

Должно получиться что то такое.

Очищаем атрибуты и делаем регенерацию базы.

Инсталим стандартно, дебиан с минимальным набором софта.

Логинимся рутом.

# apt-get update

# apt-get upgrade

# apt-get install sudo

# nano /etc/sudoers

Добавляем своего юзера с правами рут

# exit

# sudo su

Вводим пароль пользователя.

Инсталим нужный софт

# apt-get install net-tools vlan ipset dnsutils mc

Включаем IP Forwarding

# sysctl -w net.ipv4.ip_forward=1

Что-бы не слетел после ребута

# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf

Проверяем поддержку влан

# lsmod | grep 8021q

Если вывод пустой то подгружаем их

# modprobe 8021q

Чекаем интерфейсы

# ip a

приводим наш конфиг к нормальному виду  где ens192 смотрии в мир ens224 смотрит на киентов ens266 смотрит на биллинг.

Создаем пачку вланов на нужном интерфейсе. Так как юзаем пппое то адреса нам не нужны, для айпиое manual меняем на static и прописываем адреса.

#

source

/etc/network/interfaces.d/*

# The loopback network interface

auto lo

iface lo inet loopback

# The primary network interface

allow-hotplug ens192

iface ens192 inet static

address xxx.xxx.xxx.xxx/yy

gateway zzz.zzz.zzz.zzz

# dns-* options are implemented by the resolvconf package, if installed

dns-nameservers 8.8.8.8

dns-search our.isp.net

allow-hotplug ens224

iface ens224 inet static

address адрес сетевой которая смотрит на клиентов/ваша маска

allow-hotplug ens256

iface ens256 inet static

address адрес сетевой которая смотрит на биллинг/ваша маска

           

auto vlan101

iface vlan101 inet manual

#address

#netmask

vlan-raw-device ens224

auto vlan102

iface vlan102 inet manual

#address 192.168.1.200

#netmask 255.255.255.0

vlan-raw-device ens224

auto vlan103

iface vlan103 inet manual

#address 192.168.1.200

#netmask 255.255.255.0

vlan-raw-device ens224

auto vlan104

iface vlan104 inet manual

#address 192.168.1.200

#netmask 255.255.255.0

vlan-raw-device ens224

auto vlan105

iface vlan105 inet manual

#address 192.168.1.200

#netmask 255.255.255.0

vlan-raw-device ens224

auto vlan106

iface vlan106 inet manual

#address 192.168.1.200

#netmask 255.255.255.0

vlan-raw-device ens224

auto vlan107

iface vlan107 inet manual

#address 192.168.1.200

#netmask 255.255.255.0

vlan-raw-device ens224

auto vlan108

iface vlan108 inet manual

#address 192.168.1.200

#netmask 255.255.255.0

vlan-raw-device ens224

auto vlan109

iface vlan109 inet manual

#address 192.168.1.200

#netmask 255.255.255.0

vlan-raw-device ens224

Поднимаем интерфейсы

# ifup -a

Приступаем к установке аццеля

# apt-get install -y build-essential git cmake gcc linux-headers-`uname -r` git libpcre3-dev libssl-dev liblua5.1-0-dev

# git clone https://github.com/xebd/accel-ppp.git /opt/accel-ppp-code

# mkdir /opt/accel-ppp-code/build

# cd /opt/accel-ppp-code/build/

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

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

Обращаем внимание на параметр -DCPACK_TYPE=Debian он должен соответствовать реальности.

В конце строки обязательно оставляйте .. это указывает путь к исходному коду accel-ppp.

Компилируем.

# make

Если не успеваем за выводом, еще раз запускаем компиляцию и убеждаемся что нужные нам модули скомпилились.

# make

[  7%] Built target triton

[ 37%] Built target accel-pppd

[ 40%] Built target luasupp

[ 48%] Built target radius

[ 50%] Built target vlan-mon

[ 52%] Built target pptp

[ 57%] Built target pppoe

[ 60%] Built target l2tp

[ 61%] Built target sstp

[ 66%] Built target ipoe

[ 68%] Built target auth_chap_md5

[ 69%] Built target auth_pap

[ 70%] Built target auth_mschap_v1

[ 72%] Built target auth_mschap_v2

[ 74%] Built target log_tcp

[ 75%] Built target log_file

[ 77%] Built target log_syslog

[ 79%] Built target connlimit

[ 81%] Built target sigchld

[ 83%] Built target pppd_compat

[ 85%] Built target ipv6pool

[ 86%] Built target ippool

[ 88%] Built target chap-secrets

[ 89%] Built target logwtmp

[ 92%] Built target ipv6_dhcp

[ 93%] Built target ipv6_nd

[ 97%] Built target shaper

[ 98%] Built target accel-cmd

[ 99%] Built target ipoe_drv

[100%] Built target vlan_mon_drv

Упаковываем все в пакет

# cpack -G DEB

CPack: Create package using DEB

CPack: Install projects

CPack: - Run preinstall target for: accel-ppp

CPack: - Install project: accel-ppp

CPack: Create package

инсталлим

# dpkg -i accel-ppp.deb

Если получаем ошибку, значит вы не читаете документацию, а именно первые 6 строк.

dpkg: warning: 'ldconfig' not found in PATH or not executable

dpkg: warning: 'start-stop-daemon' not found in PATH or not executable

dpkg: error: 2 expected programs not found in PATH or not executable

Note: root's PATH should usually contain /usr/local/sbin, /usr/sbin and /sbin

# mv /etc/accel-ppp.conf.dist /etc/accel-ppp.conf

Чекаем интерфейсы

# ip a

Правим конфиг под нас

# nano /etc/accel-ppp.conf

[modules]path=/usr/lib64/accel-ppp

log_file

pppoe

auth_mschap_v2

radius

sigchld

pppd_compat

shaper

[core]

log-error=/var/log/accel-ppp/core.log

thread-count=4

[ppp]

verbose=1

min-mtu=1000

mtu=1400

mru=1400

[lcp]

echo-interval=30

echo-failure=3

[common]

single-session=replace

[pppoe]

interface=ens192

interface=vlan101

interface=vlan102

interface=vlan103

interface=vlan104

interface=vlan105

interface=vlan106

interface=vlan107

interface=vlan108

interface=vlan109

[dns]

dns1=8.8.4.4

dns2=8.8.8.8

[radius]

dictionary=/usr/local/share/accel-ppp/radius/dictionary

dictionary=/usr/local/share/accel-ppp/radius/radius.dict

nas-identifier=accel-ppp

nas-ip-address=адрес сетевой которая смотрит на биллинг

gw-ip-address=адрес сетевой которая смотрит на клиентов

auth-server=адрес биллинга:1812,ключ радиуса

acct-server=адрес биллинга:1813,ключ радиуса

dae-server=адрес сетевой которая смотрит на биллинг:3799,ключ радиуса

 verbose=1

[client-ip-range]

10.0.0.0/24

[log]

log-file=/var/log/accel-ppp/accel-ppp.log

log-emerg=/var/log/accel-ppp/emerg.log

og-fail-file=/var/log/accel-ppp/auth-fail.log

copy=1

level=1

[pppd-compat]

ip-up=/etc/ppp/if-up

ip-down=/etc/ppp/if-down

radattr-prefix=/var/run/radattr [shaper]

#may need: ethtool -K eth0 tso off ufo off gso off gro off lro off

up-limiter=police

down-limiter=tbf

attr-down=PPPD-Downstream-Speed-Limit

attr-up=PPPD-Upstream-Speed-Limit

verbose=1

[cli]

telnet=127.0.0.1:2001

verbose=1

В силу того что аццель не умеет ipset через коа, то рулить юзерами будем скриптами up/down указанными в секции [pppd-compat] нашего конфига.

# mkdir /etc/ppp

# nano /etc/ppp/if-up

#!/bin/bash

IP=`/usr/bin/awk '/Framed-IP-Address/ {print $2}' /var/run/radattr.$1`

STATE=`/usr/bin/awk '/Filter-Id/ {print $2}' /var/run/radattr.$1`

if [[ "$STATE" == "PASSIVE" ||  "$STATE" == "DOWN"  || "$STATE" == "OFF-LINE" || "$STATE" == "NOT-EXIST" ]];

then

/usr/sbin/ipset -A disabled $IP 2>/dev/null

/usr/sbin/ipset -D active $IP 2>/dev/null

else

/usr/sbin/ipset -D disabled $IP 2>/dev/null

/usr/sbin/ipset -A active $IP 2>/dev/null

fi

# chmod +x /etc/ppp/if-up

# nano /etc/ppp/if-down

#!/bin/bash

IP=`/usr/bin/awk '/Framed-IP-Address/ {print $2}' /var/run/radattr.$1`

/usr/sbin/ipset -D disabled $IP 2>/dev/null

/usr/sbin/ipset -D active $IP 2>/dev/null

# chmod +x /etc/ppp/if-down

Зачастую при установке либо обновлении аццель затирает папку со словарями потому проверяем

# ls /usr/local/share/accel-ppp/radius/

Если такового нет, не страшно.

# mkdir -p /usr/local/share/accel-ppp/radius/

# cp /opt/accel-ppp-code/accel-pppd/radius/dict/* /usr/local/share/accel-ppp/radius/

Создаем свой словарь атрибутов, чтобы аццель понимал шейпы получаемые от радиуса

# nano /usr/local/share/accel-ppp/radius/radius.dict

ATTRIBUTE PPPD-Upstream-Speed-Limit 230 integer

ATTRIBUTE PPPD-Downstream-Speed-Limit 231 integer

добавляем в автозапуск

#systemctl enable accel-ppp

Заливаем фаервол

#nano /etc/init.d/firewall

#!/bin/bash

#

# firewall

#

# chkconfig: - 97 20

#

### BEGIN INIT INFO

# Provides:firewall

# Required-Start:        $network

# Required-Stop:

# Default-Start: 2 3 4 5

# Default-Stop:  0 1 6

# Description:   firewall builder

### END INIT INFO

 

lock_path=/var/lock/firewall.lock

 

# Список IPSETов

ipset_list=(

disabled

)

 

VC=`which vconfig`

IFC=`which ifconfig`

ETT=`which ethtool`

IPT=`which iptables`

IPS=`which ipset`

DIG=`which dig`

CTL=`which sysctl`

 

DNS_lookup="8.8.8.8"

 

# OUT интерфейс (интернет)

out_interface1="сетевая которая смотрит в интернет"

 

# IP SRC-NAT для пользователей

out_ext_ip1="внешний ip наса"

 

# IP для редиректа на страницу заглушку

REDIRECT_IP="ip заглушки"

 

# название IPSETа для разрешенных IP

allowed_ipset="allowed"

 

# Список разрешенных сайтов и IP

allowed_list=(

Адрес биллинга

8.8.8.8

8.8.4.4

www.liqpay.com

liqpay.com

static.liqpay.com

ecommerce.liqpay.com

api.privatbank.ua

login.privatbank.ua

privat24.privatbank.ua

www.privat24.ua

privat24.ua

liqpay.com

www.liqpay.com

static.liqpay.com

ecommerce.liqpay.com

fonts.googleapis.com

ajax.googleapis.com

my-payments-p24.privatbank.ua

themes.googleusercontent.com

www.google-analytics.com

google-analytics.com

ssl.google-analytics.com

widget.siteheart.com

static.siteheart.com

www.googleadservices.com

stats.g.doubleclick.net

googleads.g.doubleclick.net

qrapi.privatbank.ua

js.honeybadger.io

socauth.privatbank.ua

www.googletagmanager.com

st.privatbank.ua

services.privatbank.ua

mypayments.privatbank.ua

client.siteheart.com

fonts.gstatic.com

esapi.siteheart.com

crm.privatbank.ua

)

 

postrouting() {

    # Очищаем NAT

    $IPT -t nat -F POSTROUTING

 

    # NAT для пользователей

    $IPT -t nat -A POSTROUTING -s 10.0.0.0/8 -o $out_interface1 -j SNAT --to-source $out_ext_ip1 --persisten

    echo "POSTROUTING done"

}

 

input() {

    $IPT -F INPUT

 

    # Если используете Fail2ban SSH

    $IPT -N fail2ban-ssh

    $IPT -A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh

    $IPT -A INPUT -i eth1 -s "mgmt_net" -j ACCEPT

    $IPT -A INPUT -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT

    $IPT -A INPUT -p UDP -m state --state ESTABLISHED,RELATED -j ACCEPT

    $IPT -A INPUT -p TCP -m multiport --dports 6881:6889 -m state --state NEW -j DROP

    $IPT -A INPUT -p UDP -m multiport --dports 6881:6889 -j DROP

    $IPT -A INPUT -p TCP -m multiport --dports 49001 -m state --state NEW -j DROP

    $IPT -A INPUT -p UDP -m multiport --dports 49001 -j DROP

    $IPT -A INPUT -p TCP -m multiport --dports 135,137,138,139,445 -j DROP

    echo "INPUT done"

}

 

raw_rules() {

    # очищаем RAW таблицы

    $IPT -t raw -F PREROUTING

    $IPT -t raw -F OUTPUT

 

    echo "RAW rules done"

}

 

forward() {

    # Очищаем FORWARD

    $IPT -F FORWARD

 

    # Пропускаем трафик к разрешенным IP

      $IPT -A FORWARD -m set --match-set $allowed_ipset dst -j ACCEPT

 

    # Блокируем трафик пользователей в IPSETах

    for ipset_name in ${ipset_list[*]}

    do

    $IPT -A FORWARD -m set --match-set $ipset_name src -j REJECT --reject-with icmp-proto-unreach

    done

 

    echo "FORWARD done"

}

 

prerouting() {

    # Очищаем PREROUTING

    $IPT -t nat -F PREROUTING

 

    # Пропускаем трафик к разрешенным IP

    $IPT -t nat -A PREROUTING -m set --match-set $allowed_ipset dst -j ACCEPT

 

    # Перенаправляем пользователей из IPSETов на страницы заглушки

    $IPT -t nat -A PREROUTING -m set --match-set disabled src -p tcp --dport 80 -j DNAT --to-destination $REDIRECT_IP:80

 

    echo "PREROUTING done"

}

 

allow() {

    # Очищаем IPSET разрешенных IP

    $IPS -F $allowed_ipset

 

    for row in ${allowed_list[*]}

    do

   # проверяем запись из списка разрешенных, явлияется ли она IP адресом

    if [[ $row =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]];

    then

    # добавляем этот IP в список разрешенных

    $IPS add $allowed_ipset $row > /dev/null 2>&1

    else

    # запись оказалась доменом, резолвим его IP через dig

      for ip in `$DIG $row +short @$DNS_lookup`

    do

    # добавляем полученные через dns IP адрес в список разрешенных

    $IPS add $allowed_ipset $ip > /dev/null 2>&1

    done

    fi

    done

 

    echo "ALLOWED done"

}

 

start() {

    if [ -f $lock_path ]; then

      echo "Firewall is running"

      exit 0

    else

      touch $lock_path

    fi

 

    echo "Start building firewall"

 

    for ipset_name in ${ipset_list[*]}

    do

      $IPS -N $ipset_name iphash > /dev/null 2>&1

    done

 

    $IPS -N active iphash > /dev/null 2>&1

    $IPS -N $allowed_ipset iphash > /dev/null 2>&1

 

    allow

    input

    forward

    prerouting

    postrouting

    raw_rules

 

    $CTL -p > /dev/null 2>&1

 

    echo "Firewall rules created"

}

 

stop() {

    if [ ! -f $lock_path ]; then

      echo "Firewall is stoped"

      exit 0

    else

      rm -f $lock_path

    fi

 

    $IPT -F INPUT

    $IPT -F FORWARD

    $IPT -t nat -F

    $IPT -t mangle -F

    $IPT -t raw -F PREROUTING

    $IPT -t raw -F OUTPUT

 

    $IPT -P FORWARD ACCEPT

 

    echo "FORWARD/NAT/RAW flushed"

 

    $CTL -p > /dev/null 2>&1

}

 

show() {

    $IPT -L INPUT -v -n --line-numbers

    $IPT -L FORWARD -v -n --line-numbers

    $IPT -t nat -L PREROUTING -v -n --line-numbers

    $IPT -t nat -L POSTROUTING -v -n --line-numbers

    $IPT -t raw -L -v -n --line-numbers

    $IPS list $allowed_ipset

}

 

case "$1" in

  start)

        start

        ;;

  stop)

        stop

        ;;

  restart)

        stop

        start

        ;;

  allow)

        allow

        ;;

  input)

        input

        ;;

  forward)

        forward

        ;;

  pre)

        prerouting

        ;;

  post)

        postrouting

        ;;

  raw)

        raw_rules

        ;;

  show)

        show

        ;;

  *)

        echo "Usage: $0 {start|stop|restart|allow|input|forward|pre|post|raw|show}"

esac

Обращаем внимание на # NAT для пользователей, где указываем какую клиентскую подсеть натить

Делаем исполняемым

# chmod +x /etc/init.d/firewall

# bash /etc/init.d/firewall start

добавляем в автозагрузку

# /lib/systemd/systemd-sysv-install enable firewall

смотрим или создались таблички

# ipset list

Name: disabled

Type: hash:ip

Revision: 4

Header: family inet hashsize 1024 maxelem 65536

Size in memory: 88

References: 2

Number of entries: 0

Members:

Name: active

Type: hash:ip

Revision: 4

Header: family inet hashsize 1024 maxelem 65536

Size in memory: 88

References: 0

Number of entries: 0

Members:

в эти таблички будут попадать юзеры скриптами if-up if-down

пробуем запустить аццель

# service accel-ppp start

Чекаем логи

# cat /var/log/accel-ppp/core.log

# cat /var/log/accel-ppp/emerg.log

# cat /var/log/accel-ppp/accel-ppp.log

Должно быть чисто.

Типичная ошибка, юзер не подключается с ошибкой авторизации и в логе radius: out of memory -Проверьте пути к словарям и наличие самих словарей

Настраиваем ротацию логов

# nano /etc/logrotate.d/accel-ppp

/var/log/accel-ppp/*.log {

        missingok

        sharedscripts

        postrotate

                test -r /var/run/accel-pppd.pid && kill -HUP `cat /var/run/accel-pppd.pid`

        endscript

}

Ребутимся, подключаем юзера.

На стороне наса проверяем или корректно выдался шейп

# telnet 127.0.0.1 2001

# show sessions

s