Настройка PPPoE сервера на базе Debian 7.9 и Accel-PPP

Настройка PPPoE сервера на базе Debian 7.9 и Accel-PPP


В данной статье рассмотрим всесторонний тюнинг сервера, для предоставления доступа к сети Интернет, по технологии PPPoE.
ОБЩИЕ РЕКОМЕНДАЦИИ - ИЗУЧИТЬ ПЕРЕД НАСТРОЙКОЙ
Аппаратная составляющая.
Сетевая карта
Для серверов с нагрузкой до 2Гб/сек рекомендуется использовать многопортовые карты на чипе Intel 82576, из расчета 1 порт – 1 ядро физическое процессора. Это связанно с особенностями обработки pppoe трафика на 1 прерывании каждого порта. Однако, используя технологии RPS и RFS, от этого правила можно отступить.
В случае, если вы планируете использовать 10Гб интерфейсы, рекомендуется использовать сетевые карты c чипом Intel 82599, распределение прерываний на все ядра процессоров, а также обязательное использование технологий RPS и RFS
Процессор
Для высокопроизводительных маршрутизаторов подходят практически любые процессора Intel х64.
Настоятельно рекомендуется отключать виртуализацию и Hyper threading, только так возможно получить максимум производительности для маршрутизатора. Также, необходимо отключать Intel SpeedStep Technology, которая динамически изменяет частоту процессора.
ОЗУ
Оперативная память практически не используется, поэтому ее объём критически не важен, однако рассчитывайте хотя бы на 4Гб.
Прочее:
Рекомендуется использовать серверное железо, сертифицированное для применения на территории РФ или аналогичные серверные системы. Это повысит надежность системы. Однако, вы можете использовать и любое другое железо, на свой страх и риск.
Программная часть
ОС:
В качестве ОС для сервера доступа рекомендуется использовать Debian 7.9 х64. Эта ветка ОС Debian зарекомендовала себя особой стабильностью. Однако, если по каким-либо причинам использование Debian невозможно, используйте другой дистрибутив Linux, с оглядкой на рекомендации данной статьи.
Ядро:
Стандартное ядро версии 3.2 использовать не рекомендуется, потому что оно достаточно устаревшее. Рекомендуем использовать ядро версии 3.16 или выше. Установку рекомендуется проводить из репозитория backports, а если предполагается использование ядра более нового, чем 3.16, то перед установкой соберите из него .deb пакет. Так, в случае каких-либо проблем, вам будет легче откатиться на более раннюю версию ядра.
Драйвера:
Несмотря на то, что в предыдущих шагах РЕКОМЕНДОВАНО обновление ядра, вместе с которым повышалась и версия драйвера сетевой, однако для более стабильной работы рекомендуется использовать последнюю стабильную версию драйвера.
NAT:
Совмещать NAT и сервер доступа крайне не рекомендуется, потому что обе операции достаточно ресурсоемкие, однако это возможно. Но не забудьте, что для наиболее производительного NAT необходимо тщательно отстраивать sysctl вашей системы и обязательно оптимизировать настройки сетевого стека.
Также, очень важно, чтобы все IP, которые вы будете использовать в NAT, были повешены на lo:x как алиасы. Это позволит сэкономить порядка 15% процессорных ресурсов и использовать их по прямому назначению.
Приступим к настройке.


Вводные данные:
Сервер с 2 сетевыми интерфейсами, intel pro 1000
ОС: Debian 7.9
Ядро: 3.2


Первым делом, установим необходимые для работы новой системы, пакеты:
apt-get install mtr atop htop mc tcpdump vlan ethtool sudo


Затем, обновим ядро системы.
Добавим репозиторий backports в /etc/apt/sources.list
deb http://ftp.ru.debian.org/debian wheezy-backports main


Обновим данные о пакетах
apt-get update


Обновим все пакеты в системе до актуальных версий из backports
apt-get -t wheezy-backports upgrade

Выясним, доступен ли необходимый набор пакетов в репозитории
apt-cache search linux-image


В результате будет что-то подобное:
linux-headers-3.2.0-4-amd64 - Header files for Linux 3.2.0-4-amd64
linux-headers-3.2.0-4-rt-amd64 - Header files for Linux 3.2.0-4-rt-amd64
linux-image-3.2.0-4-amd64 - Linux 3.2 for 64-bit PCs
linux-image-3.2.0-4-amd64-dbg - Debugging symbols for Linux 3.2.0-4-amd64
linux-image-3.2.0-4-rt-amd64 - Linux 3.2 for 64-bit PCs, PREEMPT_RT
linux-image-3.2.0-4-rt-amd64-dbg - Debugging symbols for Linux 3.2.0-4-rt-amd64
linux-image-2.6-amd64 - Linux for 64-bit PCs (dummy package)
linux-image-amd64 - Linux for 64-bit PCs (meta-package)
linux-image-rt-amd64 - Linux for 64-bit PCs (meta-package), PREEMPT_RT
linux-headers-3.16.0-0.bpo.4-amd64 - Header files for Linux 3.16.0-0.bpo.4-amd64
linux-image-3.16.0-0.bpo.4-amd64 - Linux 3.16 for 64-bit PCs
linux-image-3.16.0-0.bpo.4-amd64-dbg - Debugging symbols for Linux 3.16.0-0.bpo.4-amd64
linux-image-amd64-dbg - Debugging symbols for Linux amd64 configuration (meta-package)

Из всего этого разнообразия нас интересуют только 2 пакета:
linux-headers-3.16.0-0.bpo.4-amd64 - Header files for Linux 3.16.0-0.bpo.4-amd64
linux-image-3.16.0-0.bpo.4-amd64 - Linux 3.16 for 64-bit PCs


Устанавливаем:
apt-get install linux-image-3.16.0-0.bpo.4-amd64 linux-headers-3.16.0-0.bpo.4-amd64


Перезагружаемся!


Как только сервер снова стал доступен - проверяем версию ядра:
root@bras-pppoe:~# uname -a
Linux bras-pppoe 3.16.0-0.bpo.4-amd64 #1 SMP Debian 3.16.7-ckt20-1+deb8u3~bpo70+1 (2016-01-19) x86_64 GNU/Linux


Обновим драйвера на сетевую карту:
Инструкция по обновлению драйверов почти идентична для всех вендоров.
Узнаем, какой именно драйвер использует сетевая:
ethtool -i ethX - где Х - номер интерфейса используемой сетевой карты.


Вывод будет примерно таким:
driver: e1000
version: 7.3.21-k8-NAPI
firmware-version:
bus-info: 0000:02:01.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no


Драйвера e1000 можно скачать
https://sourceforge.net/projects/e1000/
Драйвера igb
https://sourceforge.net/projects/e1000/files/igb%20stable/
Драйвера ixgbe
https://sourceforge.net/projects/e1000/files/ixgbe%20stable/
Интрукцию по сборке найдете внутри архива с драйвером.


Завершив обновление драйверов, выполним еще одну перезагрузку.
После перезагрузки, обязательно убедитесь, что загрузилась новая версия драйвера сетевой.

Теперь перейдем к установке Accel-PPP
Установим необходимые пакеты:
apt-get install git make libnl-dev libnl-utils gcc cmake  libcrypto++-dev libcrypto++9 libcrypto++-utils lua5.1 liblua5.1-0-dev  libpcre++-dev  libpcre++0 libpcre3  libpcrecpp0 libsnmp-dev snmp snmpd  iftop iptraf ipset libipset-dev


Теперь получим свежую версию Accel-PPP
cd /root/
git clone git://git.code.sf.net/p/accel-ppp/code accel-ppp.git


Сконфигурируем и установим
#cd /usr/local/src
#cmake /root/accel-ppp.git -DKDIR=/usr/src/linux-headers-`uname -r` -DBUILD_DRIVER=FALSE -DRADIUS=TRUE -DNETSNMP=TRUE -DSHAPER=TRUE -DLOG_PGSQL=FALSE
#make
#make install
Установка завершена.


Для удобства эксплуатации вам необходимо поместить в /etc/init.d/ следующий скрипт

##INIT SCRIPT START
#!/bin/sh
# /etc/init.d/accel-pppd: set up the accel-ppp server
### BEGIN INIT INFO
# Provides:          accel-ppp
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO

set -e

PATH=/bin:/usr/bin:/sbin:/usr/sbin

. /lib/lsb/init-functions

#if test -f /etc/default/accel-ppp; then
#    . /etc/default/accel-ppp
#fi

#if [ -z "$ACCEL_PPPD_OPTS" ]; then
ACCEL_PPPD_OPTS=" -d -c /etc/accel-ppp.conf -p /var/run/accel-pppd.pid"
#fi

case "$1" in
  start)
log_daemon_msg "Starting PPtP/L2TP/PPPoE server" "accel-pppd"
if start-stop-daemon --start --quiet --oknodo --exec /usr/local/sbin/accel-pppd -- $ACCEL_PPPD_OPTS; then
   log_end_msg 0
else
   log_end_msg 1
fi
  ;;
  restart)
log_daemon_msg "Restarting PPtP/L2TP/PPPoE server" "accel-pppd"
start-stop-daemon --stop --quiet --oknodo --retry 180 --pidfile /var/run/accel-pppd.pid
if start-stop-daemon --start --quiet --oknodo --exec /usr/local/sbin/accel-pppd -- $ACCEL_PPPD_OPTS; then
   log_end_msg 0
else
   log_end_msg 1
fi
  ;;

  stop)
log_daemon_msg "Stopping PPtP/L2TP/PPPoE server" "accel-pppd"
start-stop-daemon --stop --quiet --oknodo --retry 180 --pidfile /var/run/accel-pppd.pid
log_end_msg 0
  ;;

  status)
status_of_proc /usr/local/sbin/accel-pppd "accel-pppd"
  ;;
  *)
    log_success_msg "Usage: /etc/init.d/accel-ppp {start|stop|status|restart}"
    exit 1
    ;;
esac

exit 0



###INIT SCRIPT END


Начнем настройку.
##Begin##
[modules]
log_file


#pptp
#l2tp
pppoe


#auth_mschap_v2
#auth_mschap_v1
auth_chap_md5
auth_pap

radius
#chap-secrets
pppd_compat
shaper
#connlimit
#vlan-mon

[core]
log-error=/var/log/accel-ppp/core.log
###Укажите количество потоков, с которым запустится accel.
thread-count=4

[ppp]
verbose=0
min-mtu=1280
mtu=1480
mru=1480
ipv4=require
ipv6=deny
lcp-echo-interval=18
lcp-echo-failure=5

[auth]
#any-login=0
#noauth=0

[pppoe]
verbose=1
###Укажите AC-NAME
ac-name=brass1
#service-name=yyy
#pado-delay=0
#pado-delay=0,100:100,200:200,-1:500
#called-sid=mac
#tr101=1
#padi-limit=0
#sid-uppercase=0
##Интерфейсы, на которых слушаем pppoe
interface=vlan30
##Можно указать и вот так.
#interface=re:vlan[2-6][0-9][0-9]

##Укажите свои DNS - для повышения качества используйте собственные кеширующие сервера.
[dns]
dns1=172.16.0.1
dns2=172.16.1.1

[radius]
dictionary=/usr/local/share/accel-ppp/radius/dictionary
##Укажите адрес для тунеля. IP должен быть серым и нигде не задействован.
gw-ip-address=172.88.88.88
nas-identifier=BRAS1
##Укажите ниже адресс BRAS который будет использоваться для связи с биллингом по RADIUS
nas-ip-address=NAS_IP_ADDRESS
server=BILLING_IP_ADDRESS,RADIUS_SECRET,auth-port=1812,acct-port=1813,req-limit=0,fail-time=1
##Используйте строку ниже, чтобы работать с RADIUS-Cache
#server=127.0.0.1,RADIUS_SECRET,auth-port=1812,acct-port=1813,req-limit=0,fail-time=2,backup
dae-server=0.0.0.0:3799,RADIUS_SECRET
verbose=0
timeout=3
max-try=3
acct-delay-time=0

[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
#log-debug=/dev/stdout
#syslog=accel-pppd,daemon
#log-tcp=127.0.0.1:3000
copy=1
level=3

#Если вам необходимо передать сессии дополнительные параметры - используйте механизм compat
[pppd-compat]
#ip-pre-up=/etc/ppp/ip-pre-up
ip-up=/etc/ppp/ip-up
ip-down=/etc/ppp/ip-down
ip-change=/etc/ppp/ip-change
radattr-prefix=/var/run/radattr
verbose=1

[chap-secrets]
#gw-ip-address=192.168.100.1
#chap-secrets=/etc/ppp/chap-secrets
#encrypted=0
#username-hash=md5

[shaper]
attr=Filter-Id
ifb=ifb0
up-limiter=htb
down-limiter=htb
cburst=1375000
r2q=10
quantum=1500
leaf-qdisc=sfq perturb 10
verbose=0

[cli]
verbose=1
telnet=127.0.0.1:2000
tcp=127.0.0.1:2001
#password=123



##END##



Завершив настройку accel-ppp в конфиге, перейдем к настройке в интерфейсе биллинга.
Настройку в самом биллинге делаем по этой инструкции
https://wiki.mikbill.ru/billing/nas_access_server/accel_ppp


Перейдем к оптимизации NAT

Стандартный конфиг sysctl не работает вообще, поэтому в конец файла /etc/sysctl.conf вносим следующие строки.

##Включает форвард пакетов (!)
net.ipv4.ip_forward=1

#Отключаем IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

##Отключаем фильрацию пакетов по SRC_addr|default
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0

##Увеличиваем размер arp
net.ipv4.neigh.default.gc_thresh1 = 4096
net.ipv4.neigh.default.gc_thresh2 = 8192
net.ipv4.neigh.default.gc_thresh3 = 12288

##Увеличиваем размер таблицы nf_conntrack_max
##описание тут: https://wiki.mikbill.ru/billing/howto/nf_conntrack_table_full_dropping_packet
net.ipv4.netfilter.ip_conntrack_max=1572864
net.netfilter.nf_conntrack_max=1572864

##Отключаем лишние ошибки в dmesg
##По необходимости, после дебага.
#net.core.warnings=0

##Уменьшим таймаут отслеживаемых соединением.
net.netfilter.nf_conntrack_generic_timeout = 300
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 60
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 60
net.netfilter.nf_conntrack_tcp_timeout_established = 600
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 45
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close = 10
net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 300
net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 300
net.netfilter.nf_conntrack_udp_timeout = 30
net.netfilter.nf_conntrack_udp_timeout_stream = 60
net.netfilter.nf_conntrack_icmp_timeout = 30
net.netfilter.nf_conntrack_events_retry_timeout = 15
net.netfilter.nf_conntrack_checksum=0
net.ipv4.netfilter.ip_conntrack_checksum=0
net.core.dev_weight = 16
net.core.netdev_budget = 256
net.core.netdev_max_backlog = 16000




Базовый тюнинг NAT завершен.


Теперь необходимо подстроить сетевой стек.

Для каждой сетевой, которая будет под нагрузкой, прописываем следующий конфиг
Можно поместить в rc.local

##Поднимаем MTU на сетевой.
##Обязательно поднимите MTU и на коммутаторе. Или включите Jumbo_frame
/sbin/ifconfig ethX mtu 9000

##Увеличим размер очереди tx
##1G - 1000
##10G 10000
/sbin/ifconfig ethX txqueuelen 1000

##Отключаем offload`s, чтобы работали шейпера
/sbin/ethtool --offload ethX rx off tx off
/sbin/ethtool -K ethX rxvlan off txvlan off

##Увеличим буферы, чтобы избежать дропов
##Убедитесь, что ваша сетевая поддерживает такой размер буфера: ethtool -g ethX
/sbin/ethtool -G ethX tx 2048 rx 2048

##Отключим автоопределение скорости порта.
/sbin/ethtool -A ethX autoneg off rx off tx off


###NAT
#Укажем размер хеш-таблицы для nf_conntrack
#Параметр может варьироваться в зависимости от размера кеша вашего CPU
#В идеале необходимо добиться минимальных значений cache-misses в perf stat
echo 1193572 > /sys/module/nf_conntrack/parameters/hashsize

Для равномерного распределения нагрузки от pppoe трафика включаем RPS и RFS
Делаем также для всех интерфейсов под нагрузкой.
Тоже помещаем в rc.local или в параметры /etc/network/interfaces

echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
echo 2048 > /sys/class/net/ethX/queues/rx-0/rps_flow_cnt
echo ffff > /sys/class/net/ethX/queues/rx-0/rps_cpu


И не забудьте распределить прерывания сетевых таким образом, чтобы прерывания одной сетевой обслуживались на разных ядрах одного и того же процессора.
Пример:https://wiki.mikbill.ru/billing/howto/ether_irq_balance_linux

Используя этот скрипт не забудьте остановить, выключить и удалить службу irqbalance


Общая настройка сервера завершена.

Напоследок несколько рекомендаций

1) Используйте в NAT как можно больше реальников - это позволит сделать NAT меннее проблемным для ваших клиентов.
2) Не используйте правило iptables persistent - оно создает лишнюю нагрузку по сравнению со статическим NAT
3) Используйте только свои кеширующие DNS - это повысит скорость открываемых страниц.
4) каждый раз, когда изменяете правила NAT, применяйте правила sysctl
5) Каждый реальник, используемый для NАТ, обязательно повесьте как alias либо на Uplink, если он один, либо на Loopback

Автор Виталий Ткаченко

Комментарии

Популярные сообщения из этого блога

Accel-ppp команды

mikbill расшифровка завершений сессий

Zabbix agent установка и настройка