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

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


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>