Инструменты пользователя

Инструменты сайта


Боковая панель

Разделы

Общее описание
История изменений
Рекомендации к обновлению
Планы на будущее
Известные проблемы
Онлайн демо
Случайная статья
Видео
Помощь проекту
Люди

FAQ


mgaccel-ppp

Установка и настройка Accel-ppp на примере Debian 9

Сборка и установка

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

Настройка

Lua скрипт для формирования username-ов (/etc/accel-ppp.lua):

/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

Logrotate

Создадим конфигурацию для ротации логов (/etc/logrotate.d/accel-ppp):

/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
}

Firewall

Проверьте что все команды из скрипта (vconfig, ifconfig, ethtool, iptables, ipset, dig, sysctl) у вас доступны. В случае отсутствия каких-либо бинарников нужно установить их самостоятельно.
Скрипт для запуска на автостарте. Например в кронтаб:

@reboot /etc/firewall_start.sh
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}$ ]];
		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

Рекомендации

→ MTU
Поднимать MTU необходимо, только на qinq интерфейсе(bond и входящие в него eth).Так как используется лишний тег. На саб-интерфейсах с одной меткой можно не поднимать, так как поле vlan id и так во фрейме есть и за счет тега не растет.


→ Таблица ARP
При количествах сессий более 700 и при режиме DHCP v4 необходимо править sysctl, а именно расширять таблицу ARP, так как новые ядра не пишут ругань в dmesg и происходит аномалия при параметрах по умолчанию.

/etc/sysctl.conf
net.ipv4.neigh.default.gc_thresh1 = 4096
net.ipv4.neigh.default.gc_thresh2 = 8192
net.ipv4.neigh.default.gc_thresh3 = 12288

→ Для работы шейпера\полисера на примере eth1

# 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

→ Распределение сетевых прерываний для QINQ траффика
Нужно поставить драйвера с гита

Подготовка FreeRADIUS

Не забываем про словарь для нашего NAS. Правим файл (на биллинговом сервере!) /usr/local/etc/raddb/dictionary.
Раскомментируем строку с последующим перезапуском freeradius.

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

Так же, не забываем, что добавление новых серверов доступа требует перезапуска FreeRADIUS:

# service radiusd restart
mgaccel-ppp.txt · Последние изменения: 2019/12/23 13:15 — l1ght