Знову нагадуємо: вже має бути налаштований КупаГен.
Далі підключаємо словник accel-ppp на стороні Убіллінга, для чого у файлі:
/usr/local/etc/raddb/dictionary
нам потрібно знайти і розкоментувати (або додати, у разі відсутності) такий рядок:
$INCLUDE /usr/local/etc/raddb/dictionary_preset/accel-ppp.dictionary
Ключ для новоствореного НАСу, який нам знадобиться в процесі подальшої конфігурації, можна знайти тут:
А ми, тим часом, рестартимо радіус на “Убіллінговому” сервері
# service radiusd restart
І повертаємося до нашого новоствореного НАСу та відкриваємо форму редагування “NAS КупаГен “.
Вказуємо такі опції та натискаємо кнопку “Зберегти “:
Далі все на тій же формі редагування “NAS КупаГен “ натискаємо кнопку “Клонувати конфігурацію NAS “. Побачимо щось схоже:
і у виділене на скріншоті поле для введення (хоча воно там узагалі-то і так - єдине) вставляємо наступний текст (так, це вже преконфігуровані дефолтні атрибути - все для людей!):
eyJvcHRpb25zIjp7ImlkIjoiOCIsIm5hc2lkIjoiOSIsInVzZXJuYW1ldHlwZSI6ImxvZ2luIiwic2VydmljZSI6ImNvYSIsIm9ubHlhY3RpdmUiOiIwIiwicG9ydCI6IjM3OTkifSwiYXR0cmlidXRlcyI6eyI0NCI6eyJpZCI6IjQ0IiwibmFzaWQiOiI5Iiwic2NlbmFyaW8iOiJyZXBseSIsIm1vZGlmaWVyIjoiYWN0aXZlIiwiYXR0cmlidXRlIjoiUFBQRC1VcHN0cmVhbS1TcGVlZC1MaW1pdCIsIm9wZXJhdG9yIjoiPSIsImNvbnRlbnQiOiJ7U1BFRURVUH0ifSwiNDUiOnsiaWQiOiI0NSIsIm5hc2lkIjoiOSIsInNjZW5hcmlvIjoicmVwbHkiLCJtb2RpZmllciI6ImFjdGl2ZSIsImF0dHJpYnV0ZSI6IlBQUEQtRG93bnN0cmVhbS1TcGVlZC1MaW1pdCIsIm9wZXJhdG9yIjoiPSIsImNvbnRlbnQiOiJ7U1BFRURET1dOfSJ9LCI0MiI6eyJpZCI6IjQyIiwibmFzaWQiOiI5Iiwic2NlbmFyaW8iOiJyZXBseSIsIm1vZGlmaWVyIjoiYWxsIiwiYXR0cmlidXRlIjoiRnJhbWVkLUlQLUFkZHJlc3MiLCJvcGVyYXRvciI6Ij0iLCJjb250ZW50Ijoie0lQfSJ9LCI0MyI6eyJpZCI6IjQzIiwibmFzaWQiOiI5Iiwic2NlbmFyaW8iOiJyZXBseSIsIm1vZGlmaWVyIjoiYWxsIiwiYXR0cmlidXRlIjoiRnJhbWVkLUlQLU5ldG1hc2siLCJvcGVyYXRvciI6Ij0iLCJjb250ZW50IjoiMjU1LjI1NS4yNTUuMjU1In0sIjQxIjp7ImlkIjoiNDEiLCJuYXNpZCI6IjkiLCJzY2VuYXJpbyI6ImNoZWNrIiwibW9kaWZpZXIiOiJhbGwiLCJhdHRyaWJ1dGUiOiJDbGVhcnRleHQtUGFzc3dvcmQiLCJvcGVyYXRvciI6Ijo9IiwiY29udGVudCI6IntQQVNTV09SRH0ifSwiNjgiOnsiaWQiOiI2OCIsIm5hc2lkIjoiOSIsInNjZW5hcmlvIjoicmVwbHkiLCJtb2RpZmllciI6ImFsbCIsImF0dHJpYnV0ZSI6IkZpbHRlci1JZCIsIm9wZXJhdG9yIjoiPSIsImNvbnRlbnQiOiJ7U1RBVEV9In19LCJzZXJ2aWNlcyI6eyI5Ijp7ImlkIjoiNyIsIm5hc2lkIjoiOSIsInBvZCI6IntQUklOVEZ9ICdGcmFtZWQtSVAtQWRkcmVzcz0ge0lQfScgfCB7U1VET30ge1JBRENMSUVOVH0ge05BU0lQfTozNzk5IGRpc2Nvbm5lY3Qge05BU1NFQ1JFVH0iLCJjb2Fjb25uZWN0Ijoie1BSSU5URn0gJ0ZyYW1lZC1JUC1BZGRyZXNzPSB7SVB9JyB8IHtTVURPfSB7UkFEQ0xJRU5UfSB7TkFTSVB9OjM3OTkgZGlzY29ubmVjdCB7TkFTU0VDUkVUfSIsImNvYWRpc2Nvbm5lY3QiOiJ7UFJJTlRGfSAnRnJhbWVkLUlQLUFkZHJlc3M9IHtJUH0nIHwge1NVRE99IHtSQURDTElFTlR9IHtOQVNJUH06Mzc5OSBkaXNjb25uZWN0IHtOQVNTRUNSRVR9In19fQ
не забуваємо відмітити чекбокс під текстовим полем, який підтверджує те, що ми таки усвідомлюємо, що робимо, і натискаємо кнопку “Зберегти”. Наступним кроком - очищаємо атрибути і робимо регенерацію бази (так, саме в такій послідовності):
Інсталюємо, стандартно, Debian із мінімальним набором софту. Логінимося під рутом і-і-і-і-і:
# 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
Приводимо наш конфіг /etc/network/interfaces до нормального вигляду, де:
Створюємо пачку VLANів на потрібному інтерфейсі. Оскільки ми юзаємо PPPoE, то IP адреси на цих VLANах нам не потрібні. У випадку ж з IPoE manual у визначенні інтерфейсу міняємо на static і вказуємо IP адреси:
auto vlan102 # тут не manual, a static iface vlan102 inet static # тут не забуваємо вказати адреси address 192.168.1.200 netmask 255.255.255.0 vlan-raw-device ens224
Нижче наведено конфіг /etc/network/interfaces цілком:
# 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 netmask yyy.yyy.yyy.yyy 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 !!!!- тут адреса мережевого інтерфейсу, котрий дивиться на клієнтів -!!!! netmask !!!!- тут маска адреси, котра дивиться на клієнтів -!!!! allow-hotplug ens256 iface ens256 inet static address !!!!- тут адреса мережевого інтерфейсу, котрий дивиться на біллінг -!!!! netmask !!!!- тут маска адреси, котра дивиться на білінг -!!!! 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
та переходимо до встановлення accel-ppp
# 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, який потрібен і для PPPoE і для IPoE.
# 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 log-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
З огляду на те, що accel-ppp не вміє ipset через CoA, то рулити користувачами будемо скриптами 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
Далі:
# 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-up # 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
Автор даного мануалу - Себастьян Перейро