# 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
Lua скрипт для формування username-мів (/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
Створимо конфігурацію для ротації логів (/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 }
Перевірте, що всі команди зі скрипта (vconfig, ifconfig, ethtool, iptables, ipset, dig, sysctl) у вас доступні. У разі відсутності будь-яких бінарників потрібно встановити їх самостійно.
Скрипт для запуску на автостарті. Наприклад у кронтаб:
@reboot /etc/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
→ MTU
Піднімати MTU необхідно тільки на qinq-інтерфейсі (bond і eth, що входять до нього), оскільки використовується зайвий тег. На саб-інтерфейсах з однією міткою можна не піднімати, оскільки поле vlan id і так у фреймі є і за рахунок тега не зростає.
→ Таблиця ARP
При кількостях сесій понад 700 і при режимі DHCP v4 необхідно правити sysctl, а саме розширювати таблицю ARP, так як нові ядра не пишуть лайку в dmesg і відбувається аномалія при параметрах за замовчуванням.
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 трафіку
Потрібно поставити драйвера з гіта
Не забуваємо про словник для нашого NAS. Правимо файл (на білінговому сервері!) /usr/local/etc/raddb/dictionary.
Розкоментуємо рядок із подальшим перезапуском freeradius.
$INCLUDE /usr/local/etc/raddb/dictionary_preset/accel-ppp.dictionary
Так само, не забуваємо, що додавання нових серверів доступу вимагає перезапуску FreeRADIUS:
# service radiusd restart