Настройка шлюза с squid+ограничением скорости HTB(Hierachical Token Bucket )+nDPI

Появилась надобность в шлюзе с ограничением скорости пользователей сети, блокировке закачек определенных расширений (.exe, .rar и т.д.), блокировке сайтов http и расширении возможностей пакетного фильтра iptables до фильтрации трафика 7го уровня. Была выбрана связка OpenSuse 13.1 squid+HTB(Hierachical Token Bucket)+nDPI Deep Packet Inspection (допиленный vel https://www.linux.org.ru/people/vel/profile>)

Итак, по порядку:

1. настройка правил пакетного фильтра iptables:

#!/bin/sh

# Переменные 
INET_IP="aa.bb.yy.zzz"
INET_IFACE="ens33"
IPTABLES="/usr/sbin/iptables"
LAN_IP="192.168.yyy.ххx"
LAN_IFACE="ens32"
LAN_NET="192.168.xxx.yyy/24"

# Модули iptables
/sbin/depmod -a
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_nat
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_state
/sbin/modprobe xt_ndpi //эта строка добавляется только при уже собранном и установленном пакете nDPI

#Включаем forwarding
echo "1" > /proc/sys/net/ipv4/ip_forward

# Очистка таблиц 
$IPTABLES -F
$IPTABLES -F -t nat
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT

#Заворачиваем HTTP трафик на SQUID 
$IPTABLES -t nat -A PREROUTING -i $LAN_IFACE -s $LAN_NET -p tcp --dport 80 -j REDIRECT --to-port 3129

#Блокировка bittorrenta и портов 
$IPTABLES -A FORWARD -s 192.168.yyy.xxx/24 -m ndpi --bittorrent -j DROP
#$IPTABLES -A FORWARD -m ipp2p --edk --kazaa --gnu --bit --apple --dc --soul --winmx --ares -j DROP
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -p tcp -s $LAN_NET --dport 10000:65535 -j REJECT

#Проброс портов 
$IPTABLES -t nat -A PREROUTING -p tcp -d $INET_IP --dport 25 -j DNAT --to-destination 192.168.yyy.ххх:25
$IPTABLES -t nat -A PREROUTING -p tcp -d $INET_IP --dport 110 -j DNAT --to-destination 192.168.yyy.ххх:110
$IPTABLES -t nat -A PREROUTING -p tcp -d $INET_IP --dport 143 -j DNAT --to-destination 192.168.yyy.ххх:143

$IPTABLES -t nat -A PREROUTING -p udp -m udp -d $INET_IP --dport 4000 -j DNAT --to-destination 192.168.yyy.ххх:3389
$IPTABLES -t nat -A POSTROUTING -p udp -m udp -s 192.168.yyy.ххх --sport 3389 -j SNAT --to-source $INET_IP:4000

$IPTABLES -t nat -A PREROUTING -p tcp -m tcp -d $INET_IP --dport 4001 -j DNAT --to-destination 192.168.yyy.ххх:3389
$IPTABLES -t nat -A POSTROUTING -p tcp -m tcp -s 192.168.yyy.xxx --sport 3389 -j SNAT --to-source $INET_IP:4001

$IPTABLES -t nat -A PREROUTING -p tcp -m tcp -d $INET_IP --dport 4002 -j DNAT --to-destination 192.168.yyy.xxx:3389
$IPTABLES -t nat -A POSTROUTING -p tcp -m tcp -s 192.168.xxx.yyy --sport 3389 -j SNAT --to-source $INET_IP:4002

#NAT via MASQ 
$IPTABLES -t nat -A POSTROUTING -s $LAN_NET -j MASQUERADE
#NAT via SNAT 
#$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $INET_IP

2. squid

zypper in squid3 //устанавливаем пакет с прокси-сервером

После этого пакет устанавливается в систему, конфигурационные файлы находятся в /etc/squid/
все основные настройки находятся в /etc/squid/squid.conf
удаляем в нем все, что есть и вносим в него следующие строки:

#Адрес сервера на страницах ошибок
visible_hostname address.com.ua

#Обслуживаемая прокси-сервером сеть
acl localnet src 192.168.yyy.xxx/24	# RFC1918 possible internal network

acl SSL_ports port 443
acl Safe_ports port 80		# http
acl Safe_ports port 21		# ftp
acl Safe_ports port 443		# https
acl Safe_ports port 70		# gopher
acl Safe_ports port 210		# wais
acl Safe_ports port 1025-65535	# unregistered ports
acl Safe_ports port 280		# http-mgmt
acl Safe_ports port 488		# gss-http
acl Safe_ports port 591		# filemaker
acl Safe_ports port 777		# multiling http
acl CONNECT method CONNECT

#custom Global-it's ACL's
#Путь к списку IP-адресов пользователей, для которых не действуют запреты
acl AdminsIP src "/etc/squid/AccessLists/AdminsIP.txt"
#Путь к списку запрещенных сайтов
acl RestrictedDomains dstdomain "/etc/squid/AccessLists/RestrictedDomains.txt"
#Путь к списку запрещенных расширений для скачивания
acl ad_group_rassh urlpath_regex -i "/etc/squid/AccessLists/rasshirenie.txt"

request_header_add X-koreamotors nocaptcha all

#Не отправлять заголовок X-Forwarded-For содержащий внутренний IP-адрес клиента
#forwarded_for transparent

#Не отправлять заголовок Via с именем и версией прокси-сервера
#via off

#
# Права доступа
#
http_access allow localhost
http_access deny !Safe_ports
# Deny CONNECT to other than SSL ports
http_access deny CONNECT !SSL_ports

#custom Global-it's settings
http_access allow AdminsIP
http_access deny RestrictedDomains
http_access deny ad_group_rassh
http_access allow localnet
http_access deny all

icp_access allow localnet
icp_access deny all

#При прозрачном проксировании может использоваться для управления кэшем
http_port 192.168.yyy.ххх:8887
#Локальный интерфейс, для трафика, перенаправленного пакетным фильтром
http_port 192.168.yyy.ххх:8888 intercept

#Email администратора, для отправки уведомлений об отказе кэша
#На практике, ни одного уведомления не получал
#Адрес также отображается на страницах ошибок
cache_mgr root@localhost

#Полностью отключить кеширование
cache deny all

#Путь и формат лог-файла, если не указать, лог-файл будет создан в /var/log/squid/access.log
#access_log daemon:/usr/local/squid/log/access.log squid

# Add any of your own refresh_pattern entries above these.
#
refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern -i (/cgi-bin/|\?) 0	0%	0
refresh_pattern .		0	20%	4320

файл /etc/squid/AccessLists/AdminsIP.txt содержит список адресов, которым все разрешено:

192.168.yyy.1
192.168.yyy.2
192.168.yyy.3
192.168.yyy.4

файл /etc/squid/AccessLists/RestrictedDomains.txt содержит заблокированные сайты. Точка в начале адреса блокирует доступ ко всем адресам в заданном домене.

.mail.ru
.bigmir.net
.vk.com
.www.odnoklassniki.ru
.instagram.com
.www.yaplakal.com
.bash.im

файл /etc/squid/AccessLists/rasshirenie.txt содержит блокированные расширения:

\.mp3$
\.exe$
\.mkv$
\.torrent$
\.Z$
\.dll$
\.cab$
\.vgf$
\.mpg$
\.mpeg$

запуск squid’а /etc/init.d/squid start
рестарт squid’а /etc/init.d/squid restart
перечитать настройки squid’а /etc/init.d/squid reload или squid -k reconfigure

3. собираем и устанавливаем nDPI

Нам будут нужны исходники iptables, xtables-addons с исходниками, ncurses-devel/
Первым делом скачиваем исходники ядра:

cd /usr/src/
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.14.5.tar.xz
tar xvJf linux-3.14.5.tar.xz
ln -s /usr/src/linux-3.14.5 /usr/src/linux

скачиваем nDPI исправленный Vel:

wget http://devel.aanet.ru/ndpi/nDPI-1.4.0.r7867_v2.tar.gz
tar -xvzf  nDPI-1.4.0.r7867_v2.tar.gz

накладываем патч на ядро:

cd /usr/src/linux
patch -p1 < ../nDPI-1.4.0.r7867_v2/ndpi-netfilter/kernel-patch/v3.14.5.diff

чтобы сформировать конфиг ядра выполняем

make menuconfig

и копируем в него настройки предыдущего ядра:

make oldconfig

открываем конфиг:

mcedit ./.config

Находим строчку NF_CONNTRACK_CUSTOM. Она должна иметь вид CONFIG_NF_CONNTRACK_CUSTOM=4 и меняем её на CONFIG_NF_CONNTRACK_CUSTOM=2 (лично у меня это строчка появлялась только после того как я выполнял make menuconfig и заходил в Networking Supportt; Networking Options; Network Packet Filtering Framework (Netfilter); Core Netfilter Configuration а потом просто выходил ничего не изменяя)

после этого собираем ядро и устанавливаем:

make && make modules_install && make install clean

после этого перезагружаемся, чтобы загрузить новое ядро

теперь когда система подготовлена — можно приступить к самому модулю nDPI:

cd /usr/src/nDPI-1.4.0.r7867_v2/ndpi-netfilter/  
make  
make install  
make modules_install
modprobe xt_ndpi

И проверяем с помощью lsmod | grep xt_ndpi. Если все нормально то в выводе увидите xt_ndpi
Правда я столкнулся с вот такой проблемой:

iptables v1.4.19.1: Couldn't load match `ndpi':No such file or directory

Есть пара вариантов:
1) iptables слинкован статически и он вообще не ищет модули
2) «pkg-config —variable=xtlibdir xtables» выдает неправильный путь.
Оба варианта проверяются через

strace -e stat,stat64 iptables -m ndpi --help >/dev/zero

pkg-config —variable=xtlibdir xtables сказал мне, что iptables ожидает увидеть модуль в /usr/lib64/xtables, скопировав туда libxt_ndpi.so все завелось.

Теперь можно смело использовать модуль:

 iptables -m ndpi -help
iptables v1.4.19.1
ndpi match options:
--unknown          (0x0) Match for unknown protocol packets.
--ftp_control      (0x1) Match for ftp_control protocol packets.
--mail_pop         (0x2) Match for mail_pop protocol packets.
--mail_smtp        (0x3) Match for mail_smtp protocol packets.
--mail_imap        (0x4) Match for mail_imap protocol packets.
--dns              (0x5) Match for dns protocol packets.
--ipp              (0x6) Match for ipp protocol packets.
--http             (0x7) Match for http protocol packets.
--mdns             (0x8) Match for mdns protocol packets.
--ntp              (0x9) Match for ntp protocol packets.
--netbios          (0xa) Match for netbios protocol packets.
--nfs              (0xb) Match for nfs protocol packets.
--ssdp             (0xc) Match for ssdp protocol packets.
--bgp              (0xd) Match for bgp protocol packets.
--snmp             (0xe) Match for snmp protocol packets.
--xdmcp            (0xf) Match for xdmcp protocol packets.
--smb              (0x10) Match for smb protocol packets.
--syslog           (0x11) Match for syslog protocol packets.
--dhcp             (0x12) Match for dhcp protocol packets.
--postgres         (0x13) Match for postgres protocol packets.
--mysql            (0x14) Match for mysql protocol packets.
--tds              (0x15) Match for tds protocol packets.
--direct_download_link (0x16) Match for direct_download_link protocol packets.
--mail_pops        (0x17) Match for mail_pops protocol packets.
--applejuice       (0x18) Match for applejuice protocol packets.
--directconnect    (0x19) Match for directconnect protocol packets.
--socrates         (0x1a) Match for socrates protocol packets.
--winmx            (0x1b) Match for winmx protocol packets.
--vmware           (0x1c) Match for vmware protocol packets.
--mail_smtps       (0x1d) Match for mail_smtps protocol packets.
--filetopia        (0x1e) Match for filetopia protocol packets.
--imesh            (0x1f) Match for imesh protocol packets.
--kontiki          (0x20) Match for kontiki protocol packets.
--openft           (0x21) Match for openft protocol packets.
--fasttrack        (0x22) Match for fasttrack protocol packets.
--gnutella         (0x23) Match for gnutella protocol packets.
--edonkey          (0x24) Match for edonkey protocol packets.
--bittorrent       (0x25) Match for bittorrent protocol packets.
--epp              (0x26) Match for epp protocol packets.
--avi              (0x27) Match for avi protocol packets.
--flash            (0x28) Match for flash protocol packets.
--ogg              (0x29) Match for ogg protocol packets.
--mpeg             (0x2a) Match for mpeg protocol packets.
--quicktime        (0x2b) Match for quicktime protocol packets.
--realmedia        (0x2c) Match for realmedia protocol packets.
--windowsmedia     (0x2d) Match for windowsmedia protocol packets.
--mms              (0x2e) Match for mms protocol packets.
--xbox             (0x2f) Match for xbox protocol packets.
--qq               (0x30) Match for qq protocol packets.
--move             (0x31) Match for move protocol packets.
--rtsp             (0x32) Match for rtsp protocol packets.
--mail_imaps       (0x33) Match for mail_imaps protocol packets.
--icecast          (0x34) Match for icecast protocol packets.
--pplive           (0x35) Match for pplive protocol packets.
--ppstream         (0x36) Match for ppstream protocol packets.
--zattoo           (0x37) Match for zattoo protocol packets.
--shoutcast        (0x38) Match for shoutcast protocol packets.
--sopcast          (0x39) Match for sopcast protocol packets.
--tvants           (0x3a) Match for tvants protocol packets.
--tvuplayer        (0x3b) Match for tvuplayer protocol packets.
--http_app_veohtv  (0x3c) Match for http_app_veohtv protocol packets.
--qqlive           (0x3d) Match for qqlive protocol packets.
--thunder          (0x3e) Match for thunder protocol packets.
--soulseek         (0x3f) Match for soulseek protocol packets.
--ssl_no_cert      (0x40) Match for ssl_no_cert protocol packets.
--irc              (0x41) Match for irc protocol packets.
--ayiya            (0x42) Match for ayiya protocol packets.
--unencryped_jabber (0x43) Match for unencryped_jabber protocol packets.
--msn              (0x44) Match for msn protocol packets.
--oscar            (0x45) Match for oscar protocol packets.
--yahoo            (0x46) Match for yahoo protocol packets.
--battlefield      (0x47) Match for battlefield protocol packets.
--quake            (0x48) Match for quake protocol packets.
--ip_vrrp          (0x49) Match for ip_vrrp protocol packets.
--steam            (0x4a) Match for steam protocol packets.
--halflife2        (0x4b) Match for halflife2 protocol packets.
--worldofwarcraft  (0x4c) Match for worldofwarcraft protocol packets.
--telnet           (0x4d) Match for telnet protocol packets.
--stun             (0x4e) Match for stun protocol packets.
--ip_ipsec         (0x4f) Match for ip_ipsec protocol packets.
--ip_gre           (0x50) Match for ip_gre protocol packets.
--ip_icmp          (0x51) Match for ip_icmp protocol packets.
--ip_igmp          (0x52) Match for ip_igmp protocol packets.
--ip_egp           (0x53) Match for ip_egp protocol packets.
--ip_sctp          (0x54) Match for ip_sctp protocol packets.
--ip_ospf          (0x55) Match for ip_ospf protocol packets.
--ip_ip_in_ip      (0x56) Match for ip_ip_in_ip protocol packets.
--rtp              (0x57) Match for rtp protocol packets.
--rdp              (0x58) Match for rdp protocol packets.
--vnc              (0x59) Match for vnc protocol packets.
--pcanywhere       (0x5a) Match for pcanywhere protocol packets.
--ssl              (0x5b) Match for ssl protocol packets.
--ssh              (0x5c) Match for ssh protocol packets.
--usenet           (0x5d) Match for usenet protocol packets.
--mgcp             (0x5e) Match for mgcp protocol packets.
--iax              (0x5f) Match for iax protocol packets.
--tftp             (0x60) Match for tftp protocol packets.
--afp              (0x61) Match for afp protocol packets.
--stealthnet       (0x62) Match for stealthnet protocol packets.
--aimini           (0x63) Match for aimini protocol packets.
--sip              (0x64) Match for sip protocol packets.
--truphone         (0x65) Match for truphone protocol packets.
--ip_icmpv6        (0x66) Match for ip_icmpv6 protocol packets.
--dhcpv6           (0x67) Match for dhcpv6 protocol packets.
--armagetron       (0x68) Match for armagetron protocol packets.
--crossfire        (0x69) Match for crossfire protocol packets.
--dofus            (0x6a) Match for dofus protocol packets.
--fiesta           (0x6b) Match for fiesta protocol packets.
--florensia        (0x6c) Match for florensia protocol packets.
--guildwars        (0x6d) Match for guildwars protocol packets.
--http_app_activesync (0x6e) Match for http_app_activesync protocol packets.
--kerberos         (0x6f) Match for kerberos protocol packets.
--ldap             (0x70) Match for ldap protocol packets.
--maplestory       (0x71) Match for maplestory protocol packets.
--mssql            (0x72) Match for mssql protocol packets.
--pptp             (0x73) Match for pptp protocol packets.
--warcraft3        (0x74) Match for warcraft3 protocol packets.
--world_of_kung_fu (0x75) Match for world_of_kung_fu protocol packets.
--meebo            (0x76) Match for meebo protocol packets.
--facebook         (0x77) Match for facebook protocol packets.
--twitter          (0x78) Match for twitter protocol packets.
--dropbox          (0x79) Match for dropbox protocol packets.
--gmail            (0x7a) Match for gmail protocol packets.
--google_maps      (0x7b) Match for google_maps protocol packets.
--youtube          (0x7c) Match for youtube protocol packets.
--skype            (0x7d) Match for skype protocol packets.
--google           (0x7e) Match for google protocol packets.
--dcerpc           (0x7f) Match for dcerpc protocol packets.
--netflow          (0x80) Match for netflow protocol packets.
--sflow            (0x81) Match for sflow protocol packets.
--http_connect     (0x82) Match for http_connect protocol packets.
--http_proxy       (0x83) Match for http_proxy protocol packets.
--citrix           (0x84) Match for citrix protocol packets.
--netflix          (0x85) Match for netflix protocol packets.
--lastfm           (0x86) Match for lastfm protocol packets.
--grooveshark      (0x87) Match for grooveshark protocol packets.
--skyfile_prepaid  (0x88) Match for skyfile_prepaid protocol packets.
--skyfile_rudics   (0x89) Match for skyfile_rudics protocol packets.
--skyfile_postpaid (0x8a) Match for skyfile_postpaid protocol packets.
--citrix_online    (0x8b) Match for citrix_online protocol packets.
--apple            (0x8c) Match for apple protocol packets.
--webex            (0x8d) Match for webex protocol packets.
--whatsapp         (0x8e) Match for whatsapp protocol packets.
--apple_icloud     (0x8f) Match for apple_icloud protocol packets.
--viber            (0x90) Match for viber protocol packets.
--apple_itunes     (0x91) Match for apple_itunes protocol packets.
--radius           (0x92) Match for radius protocol packets.
--windows_update   (0x93) Match for windows_update protocol packets.
--teamviewer       (0x94) Match for teamviewer protocol packets.
--tuenti           (0x95) Match for tuenti protocol packets.
--lotus_notes      (0x96) Match for lotus_notes protocol packets.
--sap              (0x97) Match for sap protocol packets.
--gtp              (0x98) Match for gtp protocol packets.
--upnp             (0x99) Match for upnp protocol packets.
--llmnr            (0x9a) Match for llmnr protocol packets.
--remote_scan      (0x9b) Match for remote_scan protocol packets.
--spotify          (0x9c) Match for spotify protocol packets.
--webm             (0x9d) Match for webm protocol packets.
--h323             (0x9e) Match for h323 protocol packets.
--openvpn          (0x9f) Match for openvpn protocol packets.
--noe              (0xa0) Match for noe protocol packets.
--ciscovpn         (0xa1) Match for ciscovpn protocol packets.
--teamspeak        (0xa2) Match for teamspeak protocol packets.
--tor              (0xa3) Match for tor protocol packets.
--skinny           (0xa4) Match for skinny protocol packets.
--rtcp             (0xa5) Match for rtcp protocol packets.
--rsync            (0xa6) Match for rsync protocol packets.
--oracle           (0xa7) Match for oracle protocol packets.
--corba            (0xa8) Match for corba protocol packets.
--ubuntuone        (0xa9) Match for ubuntuone protocol packets.
--whois_das        (0xaa) Match for whois_das protocol packets.
--collectd         (0xab) Match for collectd protocol packets.
--socks5           (0xac) Match for socks5 protocol packets.
--socks4           (0xad) Match for socks4 protocol packets.
--rtmp             (0xae) Match for rtmp protocol packets.
--ftp_data         (0xaf) Match for ftp_data protocol packets.
--wikipedia        (0xb0) Match for wikipedia protocol packets.
--msn              (0xb1) Match for msn protocol packets.
--amazon           (0xb2) Match for amazon protocol packets.
--ebay             (0xb3) Match for ebay protocol packets.
--cnn              (0xb4) Match for cnn protocol packets.
--dropbox          (0xb5) Match for dropbox protocol packets.
--skype            (0xb6) Match for skype protocol packets.
--viber            (0xb7) Match for viber protocol packets.
--yahoo            (0xb8) Match for yahoo protocol packets.
--pando            (0xb9) Match for pando protocol packets.
--megaco           (0xba) Match for megaco protocol packets.
--redis            (0xbb) Match for redis protocol packets.
--zmq              (0xbc) Match for zmq protocol packets.

4. Осталось ограничить скорость для наших пользователей сети:
Для этого будем использовать готовый скрипт:

wget http://sunet.dl.sourceforge.net/sourceforge/htbinit/htb.init-v0.8.5

Возможно, что его нужно будет подкорректировать так как нужно будет указать путь к утилите IP
и изменить переменную HTB_PATH= задав ей путь к директории в которой будут лежать файлы настройки скорости.
Я перенес его в /etc/init.d/ и переименовал в htb.init
Теперь сделаем его запускаемым:

chmod +x /etc/init.d/htb.init

Далее создадим файлы, которые будут описывать скорость:

cd /etc/htb/
touch ens32

и вносим в него:

DEFAULT=666 //метка на файл, создаваемый ниже, eth0-2:666 в который будет попадать весь трафик не попадающий ни под одно правило
R2Q=10 //точность шейпера. default 10

Создадим корневой класс:

touch ens32-2.root

Добавляем в него следующие строки:

RATE=100Mbit # гарантированная пропускная способность

Заказчик для которого я делал этот шлюз долгое время работал с скриптом для DUMMYNET под FreeBSD и решил сделать похожий скрипт:

# запускаем счётчик
i=2
# цикл по $i
while [ $i != 255 ]
do
touch ens32-2:$i
if [ $i -eq 48 -o $i -eq 11 -o $i -eq 53 -o $i -eq 57 -o $i -eq 70 -o $i -eq 71 -o $i -eq 78 -o $i -eq 86 -o $i -eq 87 -o $i\
 -eq 120 -o $i -eq 174 -o $i -eq 178 -o $i -eq 120 -o $i -eq 91 -o $i -eq 110 -o $i -eq 115 -o $i -eq 122 -o $i -eq 155 -o $i\
 -eq 211 -o $i -eq 212 -o $i -eq 213 -o $i -eq 224 -o $i -eq 225 -o $i -eq 240 -o $i -eq 241 -o $i -eq 242 -o $i -eq 243 -o $i\
 -eq 244 -o $i -eq 245 -o $i -eq 246 -o $i -eq 247 -o $i -eq 248 -o $i -eq 249 -o $i -eq 250 -o $i -eq 251 -o $i -eq 252 -o $i\
 -eq 253 -o $i -eq 254 -o $i -eq 45 -o ]
then
echo -e "RATE=100Mbit\\nCEIL=100Mbit\\nLEAF=sfq\\nRULE=*,192.168.0.$i\\nPRIO=1" > /etc/htb/ens32-2:$i
else
echo -e "RATE=1500Kbit\\nCEIL=1500Kbit\\nLEAF=sfq\\nRULE=*,192.168.0.$i\\nPRIO=1" > /etc/htb/ens32-2:$i
fi
# увеличиваем $i на единичку
i=$(($i+1))
done

Для каждого отдельного адреса создается отдельный файл с настройками скорости:
RATE=1500Kbit
CEIL=1500Kbit

А если адрес при проверке был указан в списке, то ему задавались настройки скорости:
RATE=100Mbit
CEIL=100Mbit

После выполнения скрипта проверяем нет ли ошибок:

/etc/init.d/htb.init compile

и если все в порядке, то:

/etc/init.d/htb.init start