Это старая версия документа!
Установка Accel-ppp на Debian 7
Подготовка сервера
Установим необходимые для работы новой системы, пакеты:
apt-get install mtr atop htop mc tcpdump vlan ethtool sudo chkconfig
Обновим ядро системы:
Добавим репозиторий 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
Перезагружаем сервер
reboot
После проверяем версию ядра:
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
Установка Accel-ppp
Установим необходимые пакеты:
apt-get install git make libnl-dev libnl-utils gcc cmake lua5.1 liblua5.1-0-dev apt-get install libcrypto++-dev libcrypto++9 libcrypto++-utils libpcre++-dev libpcre++0 libpcre3 libpcrecpp0 apt-get install libsnmp-dev iftop iptraf ipset libipset-dev
Создадим и перейдем в директорию для исходников accel:
mkdir -p /var/accel-ppp/ cd /var/accel-ppp/
Скачаем последнюю версию accel:
git clone git://git.code.sf.net/p/accel-ppp/code accel-ppp.git
Конфигурируем исходники:
cd /usr/local/src cmake /var/accel-ppp/accel-ppp.git -DKDIR=/usr/src/linux-headers-`uname -r` -DBUILD_DRIVER=FALSE -DRADIUS=TRUE -DNETSNMP=FALSE -DSHAPER=TRUE -DLOG_PGSQL=FALSE -DLUA=TRUE -DBUILD_IPOE_DRIVER=TRUE -DBUILD_VLAN_MON_DRIVER=TRUE make make install
Добавляем собранный модуль ipoe в систему:
cp /usr/local/src/drivers/ipoe/driver/ipoe.ko /lib/modules/`uname -r`/kernel/net
если нужен vlan_mon:
cp /usr/local/src/drivers/vlan_mon/driver/vlan_mon.ko /lib/modules/`uname -r`/kernel/net
Обновляем информацию о модулях системы:
depmod -a
Установим опции для роутинга и L4-Redirect:
echo "100 accel/ipoe" >> /etc/iproute2/rt_protos echo "100 accel/ipoe" >> /etc/iproute2/rt_tables
Настройка конфигов Accel-ppp
Полное описание конфига Accel-ppp.
Примеры других вариантов авторизации
Пример конфига Accel для работы в режиме IPoE L2, start=dhcp
nano /etc/accel-ppp.conf
[modules] log_file radius shaper sigchld ipoe [core] log-error=/var/log/accel-ppp/core.log thread-count=2 [ipoe] #check-mac-change=0 username=lua:macuser lua-file=/etc/accel-ppp.lua lease-time=300 max-lease-time=302 #attr-dhcp-opt82=DHCP-Option82 #attr-dhcp-opt82-remote-id=AccelRemoteId #attr-dhcp-opt82-circuit-id=AccelCircuitId attr-dhcp-client-ip=Framed-IP-Address attr-dhcp-router-ip=DHCP-Router-IP-Address attr-dhcp-mask=DHCP-Mask attr-l4-redirect=L4-Redirect attr-l4-redirect-ipset=L4-Redirect-ipset l4-redirect-ipset=l4 shared=1 ifcfg=1 mode=L2 start=dhcpv4 proto=100 #proxy-arp=1 #proxy-arp=0 — отключен (по умолчанию) #proxy-arp=1 — отвечает на arp запросы, если запрашиваемый IP не принадлежит другой сессии на том-же интерфейсе (если shared=1) #proxy-arp=2 — отвечает на arp запросы, если запрашиваемый IP принадлежит сессии на том-же интерфейсе, то отвечает адресом этой сессии, иначе адресом сервера. #proxy-arp=3 — всегда отвечает на arp запросы адресом своего интерфейса (сервера), то есть весь трафик пойдет через accel-ppp. interface=re:^eth1\.[0-9][0-9][0-9]$ verbose=1 [dns] dns1=4.2.2.2 dns2=8.8.8.8 [radius] dictionary=/usr/local/share/accel-ppp/radius/dictionary nas-identifier=Accel-IPoE nas-ip-address=10.0.0.2 server=10.0.0.1,secret,auth-port=1812,acct-port=1813,req-limit=0,fail-time=0 dae-server=0.0.0.0:3799,secret verbose=1 timeout=10 max-try=9 acct-timeout=0 acct-delay-time=0 [shaper] attr=Filter-Id #Day/Night shaper #time-range=1,1:00-3:00 #time-range=2,3:00-5:00 #time-range=3,5:00-7:00 ifb=ifb0 up-limiter=htb down-limiter=htb cburst=1375000 r2q=10 quantum=1500 leaf-qdisc=sfq perturb 10 verbose=0 [client-ip-range] disable [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=/var/log/accel-ppp/debug.log copy=1 level=4 [cli] telnet=127.0.0.1:2000 tcp=127.0.0.1:2001
LUA скрипт, для обработки MAC / Opt82:
nano /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
Радиус атрибуты:
nano /usr/local/share/accel-ppp/radius/dictionary
ATTRIBUTE DHCP-Router-IP-Address 241 ipaddr ATTRIBUTE DHCP-Mask 242 integer ATTRIBUTE L4-Redirect 243 integer ATTRIBUTE L4-Redirect-ipset 244 string ATTRIBUTE DHCP-Option82 245 octets #ATTRIBUTE DHCP-Agent-Circuit-Id 1 octets #ATTRIBUTE DHCP-Agent-Remote-Id 2 octets ATTRIBUTE AccelRemoteId 246 octets ATTRIBUTE AccelCircuitId 247 octets #ATTRIBUTE DHCP-Attr-272 272 ipaddr
Параметры для Logrotate:
nano /etc/logrotate.d/accel
/var/log/accel-ppp/*.log { daily rotate 7 missingok sharedscripts postrotate test -r /var/run/accel-pppd.pid && kill -HUP `cat /var/run/accel-pppd.pid` endscript }
Настройка NAT
Изменим размер хеша conntrack:
echo "options nf_conntrack hashsize=1193572" > /etc/modprobe.d/nf_conntrack.conf
в /etc/sysctl.conf добавить:
net.ipv4.ip_forward=1 net.ipv4.neigh.default.gc_thresh1 = 4096 net.ipv4.neigh.default.gc_thresh2 = 8192 net.ipv4.neigh.default.gc_thresh3 = 12288 net.ipv4.netfilter.ip_conntrack_max=1572864 net.netfilter.nf_conntrack_max = 1572864 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_icmpv6_timeout = 30 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 vm.swappiness = 10 vm.dirty_background_ratio = 5 vm.dirty_ratio = 10 net.ipv4.conf.all.proxy_arp=0
Выполняем sysctl -p если выдало ошибки, подключите модули:
nf_conntrack nf_conntrack_ipv4
Для создания правил iptables, можете воспользоваться скриптом создания iptables для Accel
Подключение модулей
nano /etc/modules
# модуль ipoe для L2/L3 ipoe # модуль для QinQ #vlan_mon # для работы vlan 8021q # для корректной работы шейперов sch_netem # для работы VPN ip_gre ip_nat_pptp ip_conntrack_pptp
Init скрипт
nano /etc/init.d/accel
#!/bin/sh # /etc/init.d/accel-pppd: set up the accel-ppp server ### BEGIN INIT INFO # Provides: accel-ppp # Required-Start: $networking # Required-Stop: $networking # 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="-c /etc/accel-ppp.conf" 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 -- -d -p /var/run/accel-pppd.pid $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 -- -d -p /var/run/accel-pppd.pid $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 {start|stop|status|restart}" exit 1 ;; esac exit 0
Даем права запуска:
chmod +x /etc/init.d/accel
Настройка автозагрузки
Автозапуск Accel:
chkconfig accel on
Настройка сети
Для всех реальных IP которые будут использоваться для NAT в качестве SRC-NAT для абонентов, должны быть созданы алиас интерфейсы с этими IP адресами для избежания проблем с зависанием сервера.
Пример на loopback интерфейсе:
auto lo:1 iface lo:1 inet static address 91.92.93.1 netmask 255.255.255.255 auto lo:2 iface lo:2 inet static address 91.92.93.2 netmask 255.255.255.255 auto lo:3 iface lo:3 inet static address 91.92.93.3 netmask 255.255.255.255 auto lo:4 iface lo:4 inet static address 91.92.93.4 netmask 255.255.255.255
Настройка сетевых карт
Для лучшей производительности сетевой карты, необходимо подкорректировать некоторые из её стандартных значений.
Не все сетевые карты поддерживают эти значения, так что будьте аккуратны, ссылка на статью с настройкой.
IRQ Affinity (Прерывания)
Для настройки можно использовать данный скрипт
GRUB ( для 2+ процессоров )
Для корректной работы Accel на сервераx с 2+ процессорами, в параметры GRUB следует добавить:
nano /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet processor.max_cstate=1 intel_idle.max_cstate=0"
после чего выполнить:
update-grub