Подключаем словарь аццел на стороне биллинга
/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