Користувальницькькі налаштування

Налаштування сайту


mgaccel-ppp

Розбіжності

Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.

Посилання на цей список змін

Порівняння попередніх версій Попередня ревізія
Попередня ревізія
Остання ревізія По сторонах наступні версії
mgaccel-ppp [2019/12/20 13:18]
mgaccel-ppp [2023/07/27 10:37]
borisov
Рядок 1: Рядок 1:
 +====== Встановлення та налаштування Accel-ppp на прикладі Debian 9 ======
  
 +{{:accel-ppp-logo.png? |https://accel-ppp.org/wiki/doku.php?id=ru:start}}  [[https://accel-ppp.org/wiki/doku.php?id=ru:start|Официальная документация]]
 +===== Збірка та встановлення =====
 +
 +<code>
 +# apt-get update
 +# apt-get upgrade
 +# apt-get install -y build-essential git cmake gcc linux-headers-`uname -r` git libpcre3-dev libssl-dev liblua5.1-0-dev htop mc tcpdump vlan ethtool sudo
 +# git clone https://github.com/accel-ppp/accel-ppp /opt/accel-ppp-code
 +# mkdir /opt/accel-ppp-code/build
 +# cd /opt/accel-ppp-code/build/
 +# cmake -DBUILD_IPOE_DRIVER=TRUE -DBUILD_VLAN_MON_DRIVER=TRUE -DLUA=TRUE -DRADIUS=TRUE -DSHAPER=TRUE -DCMAKE_INSTALL_PREFIX=/usr -DKDIR=/usr/src/linux-headers-`uname -r` -DCPACK_TYPE=Debian9 ..
 +# make
 +# cpack -G DEB
 +# dpkg -i accel-ppp.deb
 +# mv /etc/accel-ppp.conf.dist /etc/accel-ppp.conf
 +# echo "ipoe" >> /etc/modules
 +# echo "vlan_mon" >> /etc/modules
 +# chmod +x /etc/init.d/accel-ppp
 +# systemctl enable accel-ppp.service
 +# echo "\$INCLUDE dictionary.accel-ppp" >> /usr/share/accel-ppp/radius/dictionary
 +</code>
 +
 +===== Налаштування =====
 +
 +
 +Lua скрипт для формування username-мів (/etc/accel-ppp.lua):
 +
 +<file config /etc/accel-ppp.lua>
 +#!lua
 +function macuser(pkt)
 +        return pkt:hdr('chaddr')
 +end
 +
 +function opt82_v1(pkt)
 +        v,b1,b2,b3,b4,b5,b6=string.unpack(pkt:agent_remote_id(),'bbbbbb')
 +        return string.format("%02x:%02x:%02x:%02x:%02x:%02x", b1,b2,b3,b4,b5,b6)
 +end
 +
 +function opt82_v2(pkt)
 +        if pkt:agent_circuit_id() ~= nil then
 +                if string.len(pkt:agent_remote_id()) ~= 0 then
 +                        v,b1,b2,b3,b4,b5,b6=string.unpack(pkt:agent_remote_id(),'bbbbbb')
 +                        return string.format("%02x:%02x:%02x:%02x:%02x:%02x", b1,b2,b3,b4,b5,b6)
 +                elseif (string.len(pkt:agent_remote_id()) == 0 and string.len(pkt:agent_circuit_id()) ~= 0) then
 +                        m1=string.sub(pkt:agent_circuit_id(),'-15','-14')
 +                        m2=string.sub(pkt:agent_circuit_id(),'-13','-12')
 +                        m3=string.sub(pkt:agent_circuit_id(),'-11','-10')
 +                        m4=string.sub(pkt:agent_circuit_id(),'-9','-8')
 +                        m5=string.sub(pkt:agent_circuit_id(),'-7','-6')
 +                        m6=string.sub(pkt:agent_circuit_id(),'-5','-4')
 +                        local username=m1..':'..m2..':'..m3..':'..m4..':'..m5..':'..m6
 +                 return username
 +                end
 + else
 +        return pkt:hdr('chaddr')
 +        end
 +end
 +
 +function username(pkt)
 + local username = string.sub(pkt:ifname(), string.find(pkt:ifname(), ".", 1, true)+1, 32)
 + return username
 +end
 +
 +
 +</file>
 +
 +
 +===== Logrotate =====
 +
 +Створимо конфігурацію для ротації логів (/etc/logrotate.d/accel-ppp): 
 +
 +<file config /etc/logrotate.d/accel-ppp>
 +/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
 +}
 +</file>
 +
 +
 +===== Firewall =====
 +Перевірте, що всі команди зі скрипта (vconfig, ifconfig, ethtool, iptables, ipset, dig, sysctl) у вас доступні. У разі відсутності будь-яких бінарників потрібно встановити їх самостійно. \\
 +Скрипт для запуску на автостарті. Наприклад у кронтаб:
 +
 +<file crontab>
 +@reboot /etc/firewall_start.sh
 +</file>
 +
 +<file firewall firewall_start.sh>
 +#!/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="1.1.1.1"
 +
 +# OUT інтерфейс (інтернет)
 +out_interface1="eth1"
 +
 +# IP SRC-NAT для користувачів
 +out_ext_ip1="public_ip_for_nat"
 +
 +# IP для редиректу на сторінку заглушки
 +REDIRECT_IP="10.100.1.2"
 +
 +# назва IPSETа для дозволених IP
 +allowed_ipset="allowed"
 +
 +# Список дозволених сайтів та IP
 +allowed_list=(
 +ubilling.isp
 +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 100.64.0.0/22 -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}\.[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
 +
 +
 +</file>
 +
 +===== Рекомендації =====
 +
 +-> MTU \\
 +Піднімати MTU необхідно тільки на qinq-інтерфейсі (bond і eth, що входять до нього), оскільки використовується зайвий тег. На саб-інтерфейсах з однією міткою можна не піднімати, оскільки поле vlan id і так у фреймі є і за рахунок тега не зростає. \\
 +\\ \\
 +-> Таблиця ARP \\
 +При кількостях сесій понад 700 і при режимі DHCP v4 необхідно правити sysctl, а саме розширювати таблицю ARP, так як нові ядра не пишуть лайку в dmesg і відбувається аномалія при параметрах за замовчуванням. \\
 +<file config /etc/sysctl.conf>
 +net.ipv4.neigh.default.gc_thresh1 = 4096
 +net.ipv4.neigh.default.gc_thresh2 = 8192
 +net.ipv4.neigh.default.gc_thresh3 = 12288
 +</file>
 +
 +-> Для роботи шейпера\полісера на прикладі eth1 \\
 +<code>
 +# cat /etc/network/interfaces.d/eth1
 +auto eth1
 +iface eth1 inet manual
 +    pre-up /sbin/ifconfig eth1 txqueuelen 10000
 +    pre-up /sbin/ifconfig eth1 mtu 9000
 +    pre-up /sbin/ethtool --offload eth1 rx off tx off 
 +    pre-up /sbin/ethtool -G eth1 tx 4096 rx 4096
 +    pre-up /sbin/ethtool -K eth1 tso off gso off gro off lro off
 +    pre-up /sbin/ethtool -K eth1 rxvlan off txvlan off
 +    pre-up /sbin/ethtool --set-priv-flags eth1 vlan-stag-rx on
 +</code>
 +
 +-> Розподіл мережевих переривань для QINQ трафіку \\ 
 +Потрібно поставити драйвера з [[https://github.com/serhepopovych/ixgbe/tree/ixgbe-5.6.3/double-vlan|гіта]] 
 +====== Підготовка FreeRADIUS ======
 +Не забуваємо про словник для нашого NAS. Правимо файл (на білінговому сервері!) /usr/local/etc/raddb/dictionary. \\
 +Розкоментуємо рядок із подальшим перезапуском freeradius.
 +<code>
 +$INCLUDE       /usr/local/etc/raddb/dictionary_preset/accel-ppp.dictionary
 +</code>
 +
 +Так само, не забуваємо, що додавання нових серверів доступу вимагає перезапуску FreeRADIUS:
 +<code>
 +# service radiusd restart
 +</code>
mgaccel-ppp.txt · Востаннє змінено: 2023/07/27 10:37 повз borisov