Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.
Порівняння попередніх версій Попередня ревізія | Наступна ревізія По сторонах наступні версії | ||
setupubuntuserver1010 [2013/02/25 10:55] |
setupubuntuserver1010 [2022/09/24 14:39] 127.0.0.1 зовнішнє редагування |
||
---|---|---|---|
Рядок 1: | Рядок 1: | ||
+ | **Установка Stargazer+Ubilling на Ubuntu Server 10.10** | ||
+ | |||
+ | ====== Установка требуемого внешнего ПО на сервер с Ubilling ====== | ||
+ | |||
+ | < | ||
+ | apt-get install mysql-server-core-5.1 mysql-client-core-5.1 libmysqlclient16 libmysqlclient-dev apache2 mysql-server expat libexpat-dev php5-cli libapache2-mod-php5 php5-mysql dhcp3-server build-essential bind9 bandwidthd softflowd | ||
+ | </ | ||
+ | При установке программ вас попросят ввести пароль для root от mysql. | ||
+ | |||
+ | |||
+ | **Включаем мод в php:** | ||
+ | < | ||
+ | |||
+ | **Редактируем / | ||
+ | < | ||
+ | User_Alias BILLING = www-data | ||
+ | BILLING | ||
+ | </ | ||
+ | |||
+ | |||
+ | **Делаем симлинк на Bandwindthd** | ||
+ | < | ||
+ | ln -fs / | ||
+ | </ | ||
+ | |||
+ | |||
+ | ======= Установка IPSET ======= | ||
+ | |||
+ | **1. Качаем архив IPSET 4.x версии он нормально работает на Maverick (в последних версиях 12.04 можно установить через apt-get install ipset)** | ||
+ | [[http:// | ||
+ | |||
+ | **2. Распаковываем: | ||
+ | < | ||
+ | |||
+ | **3. Заходим в папку собираем и включаем: | ||
+ | < | ||
+ | cd ipset-4.5/ | ||
+ | |||
+ | make && make install && make clean | ||
+ | |||
+ | depmod && depmod -A | ||
+ | modprobe ip_set | ||
+ | </ | ||
+ | Всё должно пройти без ошибок. | ||
+ | |||
+ | И собственно всё.. Ipset уже готов служить вам =) | ||
+ | |||
+ | ======= Установка и настройка Htb ======= | ||
+ | |||
+ | 0. Качаем Htb: [[http:// | ||
+ | |||
+ | 1. В скрипте htb.init проверяем и корректируем по вкусу переменные HTB_PATH, HTB_CACHE, TC, IP, MP. | ||
+ | |||
+ | 2. < | ||
+ | |||
+ | 3. cd / | ||
+ | touch eth0 | ||
+ | touch eth1 | ||
+ | touch eth0-2.root | ||
+ | touch eth1-2.root | ||
+ | </ | ||
+ | |||
+ | |||
+ | nano eth0 < | ||
+ | DEFAULT=0 | ||
+ | R2Q=100 | ||
+ | </ | ||
+ | |||
+ | nano eth1 | ||
+ | < | ||
+ | DEFAULT=0 | ||
+ | R2Q=100 | ||
+ | </ | ||
+ | |||
+ | nano eth0-2.root | ||
+ | < | ||
+ | RATE=100Mbit | ||
+ | CEIL=100Mbit | ||
+ | </ | ||
+ | |||
+ | nano eth1-2.root | ||
+ | < | ||
+ | RATE=100Mbit | ||
+ | CEIL=100Mbit | ||
+ | </ | ||
+ | |||
+ | **Проверить работу скрипта htb.init, кроме спидтестов, | ||
+ | < | ||
+ | tc class show dev ВАШ_ИНТЕРФЕЙС | ||
+ | tc qdisc show dev ВАШ_ИНТЕРФЕЙС | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ======= Установка Stargazer ======= | ||
+ | < | ||
+ | mkdir / | ||
+ | cd / | ||
+ | wget http:// | ||
+ | tar zxvf stg-2.407-p1.tar.gz | ||
+ | cd stg-2.407-p1/ | ||
+ | ./build | ||
+ | make install | ||
+ | cd ../sgconf && ./build && make && make install | ||
+ | cd ../ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ======= Редактирование конфигов и настройка опций ======= | ||
+ | |||
+ | |||
+ | **Редактируем конфиг / | ||
+ | __Вот здесь очень сомнительное место. Возможно стоит его не рассматривать.__ | ||
+ | Сделайте симлинк на cap_nf и remote_script из / | ||
+ | и желательно удалить линк на cap_ether говорят он не вменяемый =) | ||
+ | И давайте сразу создадим директорию под логи - для удобства: | ||
+ | |||
+ | < | ||
+ | rm / | ||
+ | ln -fs / | ||
+ | mkdir / | ||
+ | </ | ||
+ | __ | ||
+ | Конец сомнительного места.__ | ||
+ | |||
+ | < | ||
+ | ################################################################################ | ||
+ | # Stargazer Configuration file # | ||
+ | ################################################################################ | ||
+ | |||
+ | # путь к логфайлу | ||
+ | LogFile = / | ||
+ | |||
+ | |||
+ | # путь к pid | ||
+ | PIDFile = / | ||
+ | |||
+ | |||
+ | # файл с описанием класов трафика | ||
+ | Rules = / | ||
+ | |||
+ | |||
+ | # время записи детальной статистики в базу | ||
+ | DetailStatWritePeriod = 1/4 | ||
+ | |||
+ | |||
+ | # время сброса счетчиков трафика в базу | ||
+ | StatWritePeriod = 10 | ||
+ | |||
+ | |||
+ | # день снятия абонплаты | ||
+ | DayFee = 1 | ||
+ | |||
+ | |||
+ | # это последний день месяца? | ||
+ | DayFeeIsLastDay = no | ||
+ | |||
+ | |||
+ | # день обнуления счетчиков трафика | ||
+ | DayResetTraff = 1 | ||
+ | |||
+ | |||
+ | # " | ||
+ | SpreadFee = no | ||
+ | |||
+ | |||
+ | # позволять пользователю доступ если у него остался предоплаченый трафик? | ||
+ | FreeMbAllowInet = no | ||
+ | |||
+ | |||
+ | # писать стоимость предоплаченого трафика? | ||
+ | WriteFreeMbTraffCost = yes | ||
+ | |||
+ | |||
+ | # снимать полную абонплату ежемесячно? | ||
+ | FullFee = yes | ||
+ | |||
+ | |||
+ | # названия класов трафика относительно / | ||
+ | < | ||
+ | DirName0 = Internet | ||
+ | DirName1 = Local | ||
+ | DirName2 = | ||
+ | DirName3 = | ||
+ | DirName4 = | ||
+ | DirName5 = | ||
+ | DirName6 = | ||
+ | DirName7 = | ||
+ | DirName8 = | ||
+ | DirName9 = | ||
+ | </ | ||
+ | ExecutersNum = 1 | ||
+ | |||
+ | |||
+ | # путь модулей | ||
+ | ModulesPath = / | ||
+ | |||
+ | |||
+ | # модуль хранения данных | ||
+ | < | ||
+ | # хост MySQL | ||
+ | dbhost = localhost | ||
+ | # имя базы | ||
+ | dbname = stg | ||
+ | # логин пользователя MySQL | ||
+ | dbuser = root | ||
+ | # пароль пользователя MySQL | ||
+ | rootdbpass = ваш_пароль | ||
+ | </ | ||
+ | < | ||
+ | |||
+ | |||
+ | # модуль авторизации AlwaysOnline (рекомендуется) | ||
+ | <Module auth_ao> | ||
+ | </ | ||
+ | |||
+ | |||
+ | # модуль авторизации штатного авторизатора stargazer | ||
+ | <Module auth_ia> | ||
+ | Port = 5555 | ||
+ | UserDelay = 60 | ||
+ | UserTimeout = 65 | ||
+ | FreeMb = cash | ||
+ | </ | ||
+ | |||
+ | |||
+ | # модуль коллектора трафика NetFlow | ||
+ | <Module conf_sg> | ||
+ | Port = 5555 | ||
+ | </ | ||
+ | |||
+ | <Module cap_nf> | ||
+ | TCPPort = 42111 | ||
+ | UDPPort = 42111 | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | **Редактируем конфиг / | ||
+ | < | ||
+ | |||
+ | ALL | ||
+ | ALL | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | **И так первый запуск stargazer' | ||
+ | < | ||
+ | |||
+ | **Теперь проверим создались ли базы в MySQL** | ||
+ | < | ||
+ | |||
+ | В ответ должны увидеть это: | ||
+ | < | ||
+ | Tables_in_stg | ||
+ | |||
+ | admins | ||
+ | messages | ||
+ | stat | ||
+ | tariffs | ||
+ | users | ||
+ | </ | ||
+ | |||
+ | |||
+ | **Выключаем stargazer: | ||
+ | < | ||
+ | |||
+ | **Теперь можно приступить к установке Ubilling' | ||
+ | |||
+ | < | ||
+ | mkdir billing | ||
+ | cd billing | ||
+ | wget http:// | ||
+ | tar zxvf ub.tgz | ||
+ | </ | ||
+ | |||
+ | **Тут у меня возникала проблема с правами на файлы..** | ||
+ | < | ||
+ | chmod -R 0777 content/ config/ multinet/ exports/ remote_nas.conf vservices.php | ||
+ | </ | ||
+ | |||
+ | |||
+ | **Заливаем дамп mysql из ubilling:** | ||
+ | < | ||
+ | |||
+ | **Проверяем что дамп залит: | ||
+ | < | ||
+ | В ответ увидим много таблиц: | ||
+ | < | ||
+ | +-----------------+ | ||
+ | | Tables_in_stg | | ||
+ | +-----------------+ | ||
+ | | address | | ||
+ | | admins | | ||
+ | | ahenassign | | ||
+ | | apt | | ||
+ | | build | | ||
+ | | cardbank | | ||
+ | | cardbrute | | ||
+ | | cashtype | | ||
+ | | cfitems | | ||
+ | | cftypes | | ||
+ | | city | | ||
+ | | contracts | | ||
+ | | contrahens | | ||
+ | | cpe | | ||
+ | | cpetypes | | ||
+ | | dhcp | | ||
+ | | directions | | ||
+ | | dshape_time | | ||
+ | | emails | | ||
+ | | employee | | ||
+ | | jobs | | ||
+ | | jobtypes | | ||
+ | | logs_11_2011 | | ||
+ | | messages | | ||
+ | | modem_templates | | ||
+ | | modems | | ||
+ | | nas | | ||
+ | | nethosts | | ||
+ | | networks | | ||
+ | | notes | | ||
+ | | payments | | ||
+ | | phones | | ||
+ | | realname | | ||
+ | | services | | ||
+ | | servtariff | | ||
+ | | speeds | | ||
+ | | stat | | ||
+ | | street | | ||
+ | | switches | | ||
+ | | switchmodels | | ||
+ | | tags | | ||
+ | | tagtypes | | ||
+ | | tariffs | | ||
+ | | taskman | | ||
+ | | userreg | | ||
+ | | users | | ||
+ | | userspeeds | | ||
+ | | vcash | | ||
+ | | vcashlog | | ||
+ | | vservices | | ||
+ | | weblogs | | ||
+ | +-----------------+ | ||
+ | </ | ||
+ | |||
+ | **Редактируем конфиг в ubilling: / | ||
+ | |||
+ | < | ||
+ | ;Хост БД | ||
+ | server = " | ||
+ | ;порт MySQL | ||
+ | port = " | ||
+ | ;логин пользователя MySQL | ||
+ | username = " | ||
+ | ;его пароль | ||
+ | password = " | ||
+ | ;имя базы | ||
+ | db = " | ||
+ | character = " | ||
+ | prefix = " | ||
+ | |||
+ | **Редактирем конфиг в ubilling / | ||
+ | < | ||
+ | ; метод взаимодействия со stargazer | ||
+ | baseconf = sgconfxml | ||
+ | |||
+ | ; путь к sgconf | ||
+ | SGCONF=/ | ||
+ | |||
+ | ; путь к sgconf_xml | ||
+ | SGCONFXML=/ | ||
+ | |||
+ | ; хост на котором запущен stargazer | ||
+ | STG_HOST=localhost | ||
+ | |||
+ | ; порт конфигуратора | ||
+ | STG_PORT=5555 | ||
+ | |||
+ | ; порт XMLRPC | ||
+ | XMLRPC_PORT=8081 | ||
+ | |||
+ | ; логин администратора stargazer (по умолчанию admin) | ||
+ | STG_LOGIN=admin | ||
+ | |||
+ | ; пароль администратора stargazer (по умолчанию 1234567) | ||
+ | STG_PASSWD=123456 | ||
+ | |||
+ | ;Пути окружения | ||
+ | ;путь к sudo | ||
+ | SUDO=/ | ||
+ | |||
+ | ;путь к top в пакетном режиме | ||
+ | TOP = / | ||
+ | |||
+ | ;путь к cat | ||
+ | CAT=/ | ||
+ | |||
+ | ;путь к grep | ||
+ | GREP=/ | ||
+ | |||
+ | ;путь к RC скрипту isc-dhcpd | ||
+ | RC_DHCPD=/ | ||
+ | |||
+ | STGPID=/ | ||
+ | |||
+ | ;путь к uptime | ||
+ | UPTIME=/ | ||
+ | |||
+ | ;путь к ping | ||
+ | PING=/ | ||
+ | |||
+ | ;путь к PHPSysInfo | ||
+ | PHPSYSINFO=phpsysinfo/ | ||
+ | |||
+ | STGNASHUP=1 | ||
+ | |||
+ | ;язык по умолчанию | ||
+ | LANG = ru | ||
+ | |||
+ | ; | ||
+ | TASKBAR_ICON_SIZE = 64 | ||
+ | |||
+ | ; опции регистрации новых пользователей | ||
+ | ; регистрировать новых пользователей со случайным MAC | ||
+ | REGRANDOM_MAC=1 | ||
+ | |||
+ | ; регистрировать новых пользователей с флагом " | ||
+ | REGALWONLINE=1 | ||
+ | |||
+ | ; регистрировать новых пользователей с отключенной детальной статистикой | ||
+ | REGDISABLEDSTAT=1 | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | **Не забываем указать путь на будующий " | ||
+ | < | ||
+ | </ | ||
+ | |||
+ | |||
+ | **Создаём симлинки на каталог и файл - без них ни чего не заработает =)** | ||
+ | < | ||
+ | ln -fs / | ||
+ | ln -fs / | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | **Копируем стандартные скрипты из Ubilling в stargazer и выставляем на них права.** | ||
+ | < | ||
+ | cp -f / | ||
+ | chmod a+x / | ||
+ | </ | ||
+ | |||
+ | |||
+ | **Редактируем / | ||
+ | < | ||
+ | host = localhost | ||
+ | username = root | ||
+ | password = ваш_проль | ||
+ | database = stg | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | **Запускаем stargazer** | ||
+ | < | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ====== Создание зоны .isp, редактирование хостов и DHCP ====== | ||
+ | |||
+ | ** Редактируем файл / | ||
+ | < | ||
+ | include "/ | ||
+ | include "/ | ||
+ | include "/ | ||
+ | |||
+ | zone " | ||
+ | type master; | ||
+ | file "/ | ||
+ | }; | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | **Создаём файл и редактируем его** | ||
+ | < | ||
+ | cd /etc/bind/ | ||
+ | touch db.isp | ||
+ | nano db.isp | ||
+ | </ | ||
+ | |||
+ | |||
+ | **Содержимое / | ||
+ | < | ||
+ | $TTL 3h | ||
+ | @ IN SOA billing.isp. root.billing.isp. 1 1d 12h 1w 3h | ||
+ | |||
+ | isp. IN NS billing.isp. | ||
+ | |||
+ | billing A 172.16.0.1 # | ||
+ | stat A 172.16.0.1 # | ||
+ | nas1 A 172.16.0.1 # | ||
+ | |||
+ | </ | ||
+ | |||
+ | ** Редактируем / | ||
+ | < | ||
+ | acl isp { | ||
+ | 172.16.0.0/ | ||
+ | }; | ||
+ | options { | ||
+ | directory "/ | ||
+ | |||
+ | auth-nxdomain no; # conform to RFC1035 | ||
+ | listen-on-v6 { any; }; | ||
+ | allow-query {" | ||
+ | }; | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | **Настройка хостов в Apache2 / | ||
+ | < | ||
+ | < | ||
+ | ServerName billing.isp | ||
+ | DocumentRoot "/ | ||
+ | AddDefaultCharset utf-8 | ||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | ServerName stat.isp | ||
+ | DocumentRoot "/ | ||
+ | AddDefaultCharset utf-8 | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | ServerName nas1.isp | ||
+ | DocumentRoot "/ | ||
+ | AddDefaultCharset utf-8 | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | **Настройка DHCP | ||
+ | Чтобы dhcp заработал нужно отредактировать / | ||
+ | < | ||
+ | INTERFACES=" | ||
+ | </ | ||
+ | Это интерфейс на котором у нас в дальнейшем будут раздаваться IP адреса для абонентов. | ||
+ | |||
+ | |||
+ | **Редактируем / | ||
+ | < | ||
+ | option domain-name " | ||
+ | option domain-name-servers 172.16.0.1; | ||
+ | default-lease-time 3600; | ||
+ | max-lease-time 43200; | ||
+ | authoritative; | ||
+ | ddns-update-style none; | ||
+ | log-facility local7; | ||
+ | one-lease-per-client true; | ||
+ | deny duplicates; | ||
+ | shared-network ourisp { | ||
+ | subnet 172.16.0.0 netmask 255.255.192.0 { | ||
+ | default-lease-time 3600; | ||
+ | option domain-name " | ||
+ | option subnet-mask 255.255.192.0; | ||
+ | option routers 172.16.0.1; | ||
+ | include "/ | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | **Для того чтобы логировать не известные МАК' | ||
+ | < | ||
+ | !dhcpd | ||
+ | | ||
+ | </ | ||
+ | |||
+ | |||
+ | ** Делаем шаманское движение, | ||
+ | |||
+ | Редактируем nano / | ||
+ | Добавляем туда следующее: | ||
+ | < | ||
+ | / | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | |||
+ | **После чего перезапускаем службы: | ||
+ | < | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ======= Переходим к web интерфейсу - Настройка ======= | ||
+ | |||
+ | ** | ||
+ | http:// | ||
+ | Login: admin Password: demo (Желательно сменить пароль)** | ||
+ | |||
+ | |||
+ | **1. Добавляем классы трафика.** | ||
+ | < | ||
+ | Справочники ---> Классы трафика: | ||
+ | |||
+ | №.0 Название класса: | ||
+ | №.1 Название класса: | ||
+ | </ | ||
+ | |||
+ | |||
+ | **2. Добавляем сети.** | ||
+ | < | ||
+ | Справочники ---> Сети | ||
+ | |||
+ | Начальная ІР: 172.16.0.11 Последний ІР: 172.16.63.255 | ||
+ | Тип сети: dhcpstatic | ||
+ | Network/ | ||
+ | |||
+ | Услуги. | ||
+ | Название услуги: | ||
+ | </ | ||
+ | |||
+ | |||
+ | **3. Создаём правило раздачи DHCP** | ||
+ | < | ||
+ | Справочники ---> DHCP | ||
+ | |||
+ | Сеть: 172.16.0.0/ | ||
+ | Имя конфига DHCP: ethernet.conf | ||
+ | </ | ||
+ | < | ||
+ | option domain-name " | ||
+ | option domain-name-servers 172.16.0.1; | ||
+ | default-lease-time 3600; | ||
+ | max-lease-time 43200; | ||
+ | authoritative; | ||
+ | ddns-update-style none; | ||
+ | log-facility local7; | ||
+ | one-lease-per-client true; | ||
+ | deny duplicates; | ||
+ | |||
+ | shared-network ourisp { | ||
+ | {SUBNETS} | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | **Создаём безлимитный тариф.** | ||
+ | < | ||
+ | Справочники ---> Тарифы | ||
+ | Создать новый тариф | ||
+ | |||
+ | Название тарифа: | ||
+ | Абонплата: | ||
+ | Предоплаченный трафик: | ||
+ | Подсчет трафика: | ||
+ | Стоимость заморозки: | ||
+ | Цена не зависит от времени: | ||
+ | Без порога: | ||
+ | </ | ||
+ | |||
+ | |||
+ | **5. Делаем ограничение по скорости для нашего тарифа.** | ||
+ | < | ||
+ | Справочники ---> Скорость тарифов | ||
+ | |||
+ | Делаем скоростные ограничения 1мб/c | ||
+ | Скорость загрузки: | ||
+ | Скорость отгрузки: | ||
+ | </ | ||
+ | |||
+ | |||
+ | **Добавляем наш будущий сервер доступа " | ||
+ | < | ||
+ | Справочники ---> Сервера доступа (NAS) | ||
+ | |||
+ | Сеть: 172.16.0.0/ | ||
+ | Тип сервера доступа: | ||
+ | IP: 172.16.0.1 | ||
+ | Имя сервера доступа: | ||
+ | Ссылка на Bandwidthd: http:// | ||
+ | </ | ||
+ | |||
+ | ======= Скрипты автозапуска ======= | ||
+ | |||
+ | ** Создаём файл в / | ||
+ | < | ||
+ | touch / | ||
+ | chmod a+x / | ||
+ | nano / | ||
+ | </ | ||
+ | |||
+ | ** Содержимое / | ||
+ | < | ||
+ | |||
+ | #! /bin/sh | ||
+ | # / | ||
+ | |||
+ | ######################################################################## | ||
+ | ######################## | ||
+ | |||
+ | HTB="/ | ||
+ | IPT="/ | ||
+ | IPS="/ | ||
+ | WAN_IP=" | ||
+ | IF_WORLD=" | ||
+ | SQL="/ | ||
+ | WEB="/ | ||
+ | DHCP="/ | ||
+ | BAND="/ | ||
+ | STAR="/ | ||
+ | SOFTD="/ | ||
+ | #Softflowd для разных подсетей | ||
+ | SOFT="/ | ||
+ | |||
+ | ######################################################################## | ||
+ | # Что будет происходить и запускаться при старте: | ||
+ | ######################################################################## | ||
+ | case " | ||
+ | | ||
+ | |||
+ | echo "###################################################################################" | ||
+ | echo "###################################################################################" | ||
+ | echo "########################### | ||
+ | echo "###################################################################################" | ||
+ | echo "###################################################################################" | ||
+ | |||
+ | # | ||
+ | $SQL restart | ||
+ | $WEB restart | ||
+ | $DHCP restart | ||
+ | |||
+ | ###################################################################################### | ||
+ | |||
+ | # | ||
+ | echo 1 > / | ||
+ | |||
+ | # Создаём списки для подсети: | ||
+ | $IPS -N FFIN ipmap --network 172.16.0.0/ | ||
+ | $IPS -N FSNAT ipmap --network 172.16.0.0/ | ||
+ | $IPS -N FSNATDROP ipmap --network 172.16.0.0/ | ||
+ | |||
+ | |||
+ | ##################################### | ||
+ | # # | ||
+ | # | ||
+ | # # | ||
+ | ##################################### | ||
+ | |||
+ | # Создание правил доступа к социальным сетям (разрешённые IP адреса) | ||
+ | $IPS -N WHITE iptree | ||
+ | $IPS -A WHITE 172.16.0.30 | ||
+ | $IPS -A WHITE 172.16.0.38 | ||
+ | $IPS -A WHITE 172.16.0.39 | ||
+ | $IPS -A WHITE 172.16.0.41 | ||
+ | $IPS -A WHITE 172.16.0.42 | ||
+ | $IPS -A WHITE 172.16.0.43 | ||
+ | $IPS -A WHITE 172.16.0.44 | ||
+ | $IPS -A WHITE 172.16.0.45 | ||
+ | $IPS -A WHITE 172.16.0.46 | ||
+ | $IPS -A WHITE 172.16.0.51 | ||
+ | $IPS -A WHITE 172.16.0.64 | ||
+ | |||
+ | # | ||
+ | $IPS -N SOCIAL iptree | ||
+ | $IPS -A SOCIAL 217.20.152.240 | ||
+ | $IPS -A SOCIAL 87.240.131.99 | ||
+ | $IPS -A SOCIAL 87.240.143.242 | ||
+ | $IPS -A SOCIAL 87.240.188.249 | ||
+ | $IPS -A SOCIAL 93.186.224.240 | ||
+ | $IPS -A SOCIAL 93.186.224.243 | ||
+ | |||
+ | # Разрешаем Белому списку посейщать социальные сети | ||
+ | $IPT -t filter -A FORWARD -m set --set WHITE src -m set --set SOCIAL dst -j ACCEPT | ||
+ | |||
+ | # Запрещаем всем не вошедшим в белый список посейщать социальные сети | ||
+ | $IPT -t filter -A FORWARD -m set --set SOCIAL dst -j DROP | ||
+ | |||
+ | |||
+ | |||
+ | # Добавляем наши адреса в NAT таблицу | ||
+ | #(172) | ||
+ | $IPT -t nat -A POSTROUTING -m set --set FSNAT src -o $IF_WORLD -j SNAT --to-source $WAN_IP | ||
+ | $IPT -t filter -I FORWARD -m set --set FFIN src,dst -j ACCEPT | ||
+ | $IPT -t filter -I FORWARD -m set --set FFIN dst,src -j ACCEPT | ||
+ | $IPT -t filter -I FORWARD -m set --set FSNATDROP src,dst -j DROP | ||
+ | $IPT -t filter -I FORWARD -m set --set FSNATDROP dst,src -j DROP | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ############################################################################################ | ||
+ | |||
+ | # Запускаем Bandwindthd | ||
+ | $BAND start | ||
+ | |||
+ | # Запускаем HTB (Шейпер) | ||
+ | $HTB start | ||
+ | |||
+ | # Запускаем прослушку Softflowd для (172) | ||
+ | $SOFT | ||
+ | |||
+ | |||
+ | # Запускаем Stargazer | ||
+ | $STAR | ||
+ | |||
+ | echo "###################################################################################" | ||
+ | echo "###################################################################################" | ||
+ | echo "#################################### | ||
+ | echo "###################################################################################" | ||
+ | echo "###################################################################################" | ||
+ | ;; | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ######################################################################################## | ||
+ | ######################################################################################## | ||
+ | # Что будет происходить при остановке скрипта: | ||
+ | ######################################################################################## | ||
+ | |||
+ | stop) | ||
+ | echo "###################################################################################" | ||
+ | echo "###################################################################################" | ||
+ | echo "############################# | ||
+ | echo "###################################################################################" | ||
+ | echo "###################################################################################" | ||
+ | |||
+ | |||
+ | # | ||
+ | killall stargazer | ||
+ | |||
+ | # | ||
+ | tc qdisc del dev eth1 root #(172) | ||
+ | |||
+ | # | ||
+ | $SOFTD stop | ||
+ | |||
+ | # | ||
+ | $BAND stop | ||
+ | |||
+ | # | ||
+ | $HTB stop | ||
+ | |||
+ | |||
+ | |||
+ | # Чистим правила в таблицах Iptables и удаляем списки IPSET | ||
+ | |||
+ | #(172) | ||
+ | $IPT -F | ||
+ | $IPT -F -t nat | ||
+ | $IPS -F FFIN | ||
+ | $IPS -X FFIN | ||
+ | $IPS -F FSNAT | ||
+ | $IPS -X FSNAT | ||
+ | $IPS -F FSNATDROP | ||
+ | $IPS -X FSNATDROP | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | # Удаляем конфигурацию доступа к социальным сетям | ||
+ | $IPS -X SOCIAL | ||
+ | $IPS -X WHITE | ||
+ | |||
+ | # | ||
+ | rm -rf / | ||
+ | |||
+ | echo "###################################################################################" | ||
+ | echo "###################################################################################" | ||
+ | echo "#################################### | ||
+ | echo "###################################################################################" | ||
+ | echo "###################################################################################" | ||
+ | |||
+ | ;; | ||
+ | *) | ||
+ | echo " | ||
+ | exit 1 | ||
+ | ;; | ||
+ | esac | ||
+ | |||
+ | exit 0 | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | |||
+ | |||
+ | |||
+ | **Теперь делаем рестарт и после него проверяем как всё запустилось** | ||
+ | < | ||
+ | shutdown -r now | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ======= Скрипты OnConnect - OnDisconnect + Htb + IPSET ======= | ||
+ | |||
+ | ** Скрипт OnConnect из стандартного набора ubilling совсем капельку отредактирован мной (путь к логам отредактирован, | ||
+ | < | ||
+ | |||
+ | #!/bin/bash | ||
+ | #OnConnect | ||
+ | IFUP=" | ||
+ | IFDOWN=" | ||
+ | |||
+ | |||
+ | ########################### | ||
+ | LOGIN=$1 | ||
+ | IP=$2 | ||
+ | CASH=$3 | ||
+ | ID=$4 | ||
+ | SPEED=`/ | ||
+ | UPSPEED=`/ | ||
+ | MAC=`/ | ||
+ | SCOUNT=" | ||
+ | |||
+ | IPT="/ | ||
+ | IPS="/ | ||
+ | tc="/ | ||
+ | arpcmd="/ | ||
+ | cur_date=`date \+\%Y.\%m.\%d` | ||
+ | cur_time=`date \+\%H: | ||
+ | |||
+ | # DELETE RULEZ | ||
+ | ###################################################################### | ||
+ | $IPT -t nat -D PREROUTING --src $IP --dst 0.0.0.0/0 -p tcp --dport 80 -j DNAT --to-destination 172.16.0.1 | ||
+ | $IPT -t filter -D INPUT -s $IP -j ACCEPT | ||
+ | while [ $? -eq 0 ] | ||
+ | do | ||
+ | $IPT -t filter -D INPUT -s $IP -j ACCEPT | ||
+ | done | ||
+ | |||
+ | $IPT -t filter -D FORWARD -s $IP -j ACCEPT | ||
+ | while [ $? -eq 0 ] | ||
+ | do | ||
+ | $IPT -t filter -D FORWARD -s $IP -j ACCEPT | ||
+ | done | ||
+ | |||
+ | $IPT -t filter -D FORWARD -d $IP -j ACCEPT | ||
+ | while [ $? -eq 0 ] | ||
+ | do | ||
+ | $IPT -t filter -D FORWARD -d $IP -j ACCEPT | ||
+ | done | ||
+ | |||
+ | $IPT -t filter -D OUTPUT -d $IP -j ACCEPT | ||
+ | while [ $? -eq 0 ] | ||
+ | do | ||
+ | $IPT -t filter -D OUTPUT -d $IP -j ACCEPT | ||
+ | done | ||
+ | ####################################################################### | ||
+ | |||
+ | # fix user mac to ip | ||
+ | $arpcmd -d $IP $MAC | ||
+ | while [ $? -eq 0 ] | ||
+ | do | ||
+ | $arpcmd -d $IP $MAC | ||
+ | done | ||
+ | $arpcmd -s $IP $MAC | ||
+ | |||
+ | ############################ | ||
+ | |||
+ | declare -i mark1=$ID+101 | ||
+ | declare -i mark2=$ID+4101 | ||
+ | |||
+ | $IPT -t mangle -A FORWARD -d $IP -j MARK --set-mark $mark1 | ||
+ | $IPT -t mangle -A FORWARD -s $IP -j MARK --set-mark $mark2 | ||
+ | |||
+ | |||
+ | ############################################ | ||
+ | ########## 1subnet | ||
+ | #Download | ||
+ | $tc class add dev $IFDOWN parent 1:1 classid 1:$mark1 htb rate $SPEED$SCOUNT | ||
+ | $tc filter add dev $IFDOWN parent 1: protocol ip prio 3 handle $mark1 fw classid 1:$mark1 | ||
+ | |||
+ | #Upload | ||
+ | $tc class add dev $IFUP parent 1:1 classid 1:$mark2 htb rate $UPSPEED$SCOUNT | ||
+ | $tc filter add dev $IFUP parent 1: protocol ip prio 3 handle $mark2 fw classid 1:$mark2 | ||
+ | ############################################# | ||
+ | |||
+ | |||
+ | |||
+ | ## Интернет для (172) | ||
+ | $IPS -D FSNATDROP $IP | ||
+ | while [ $? -eq 0 ] | ||
+ | do | ||
+ | $IPS -D FSNATDROP $IP | ||
+ | done | ||
+ | $IPS -A FFIN $IP | ||
+ | $IPS -A FSNAT $IP | ||
+ | |||
+ | |||
+ | # | ||
+ | ################################################ | ||
+ | |||
+ | # DAY/NIGHT switcher | ||
+ | /bin/echo $SPEED: | ||
+ | |||
+ | |||
+ | # ADD TO LOG | ||
+ | echo " | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ** Скрипт OnDisconnect из стандартного набора ubilling совсем капельку отредактирован мной (путь к логам отредактирован, | ||
+ | < | ||
+ | |||
+ | |||
+ | #!/bin/bash | ||
+ | # OnDisconnect | ||
+ | IFUP=" | ||
+ | IFDOWN=" | ||
+ | |||
+ | LOGIN=$1 | ||
+ | IP=$2 | ||
+ | CASH=$3 | ||
+ | ID=$4 | ||
+ | SPEED=`/ | ||
+ | UPSPEED=`/ | ||
+ | SCOUNT=" | ||
+ | |||
+ | IPT="/ | ||
+ | IPS="/ | ||
+ | tc="/ | ||
+ | |||
+ | |||
+ | # TIME FORMAT | ||
+ | cur_date=`date \+\%Y.\%m.\%d` | ||
+ | cur_time=`date \+\%H: | ||
+ | |||
+ | # DELETE RULEZ IPT | ||
+ | ###################################################################### | ||
+ | $IPT -t filter -D INPUT -s $IP -j ACCEPT | ||
+ | while [ $? -eq 0 ] | ||
+ | do | ||
+ | $IPT -t filter -D INPUT -s $IP -j ACCEPT | ||
+ | done | ||
+ | |||
+ | $IPT -t filter -D FORWARD -s $IP -j ACCEPT | ||
+ | while [ $? -eq 0 ] | ||
+ | do | ||
+ | $IPT -t filter -D FORWARD -s $IP -j ACCEPT | ||
+ | done | ||
+ | |||
+ | $IPT -t filter -D FORWARD -d $IP -j ACCEPT | ||
+ | while [ $? -eq 0 ] | ||
+ | do | ||
+ | $IPT -t filter -D FORWARD -d $IP -j ACCEPT | ||
+ | done | ||
+ | |||
+ | $IPT -t filter -D OUTPUT -d $IP -j ACCEPT | ||
+ | while [ $? -eq 0 ] | ||
+ | do | ||
+ | $IPT -t filter -D OUTPUT -d $IP -j ACCEPT | ||
+ | done | ||
+ | |||
+ | ######################### | ||
+ | |||
+ | declare -i mark1=$ID+101 | ||
+ | declare -i mark2=$ID+4101 | ||
+ | |||
+ | |||
+ | if [ -n " | ||
+ | then | ||
+ | $IPT -t mangle -D FORWARD -d $IP -j MARK --set-mark $mark1 | ||
+ | while [ $? = 0 ] | ||
+ | do | ||
+ | $IPT -t mangle -D FORWARD -d $IP -j MARK --set-mark $mark1 | ||
+ | done | ||
+ | fi | ||
+ | |||
+ | if [ -n " | ||
+ | then | ||
+ | $IPT -t mangle -D FORWARD -s $IP -j MARK --set-mark $mark2 | ||
+ | while [ $? = 0 ] | ||
+ | do | ||
+ | $IPT -t mangle -D FORWARD -s $IP -j MARK --set-mark $mark2 | ||
+ | done | ||
+ | fi | ||
+ | |||
+ | ############################################################################# | ||
+ | |||
+ | #Download | ||
+ | $tc filter del dev $IFDOWN parent 1: protocol ip prio 3 handle $mark1 fw classid | ||
+ | $tc class del dev $IFDOWN parent 1:1 classid 1:$mark1 htb rate $SPEED$SCOUNT | ||
+ | |||
+ | #Upload | ||
+ | $tc filter del dev $IFUP parent 1: protocol ip prio 3 handle $mark2 fw classid 1 : | ||
+ | $tc class del dev $IFUP parent 1:1 classid 1:$mark2 htb rate $UPSPEED$SCOUNT | ||
+ | |||
+ | ############################################################################ | ||
+ | |||
+ | |||
+ | ## Отключить интернет (172) | ||
+ | $IPS -D FFIN $IP | ||
+ | while [ $? -eq 0 ] | ||
+ | do | ||
+ | $IPS -D FFIN $IP | ||
+ | done | ||
+ | $IPS -D FSNAT $IP | ||
+ | while [ $? -eq 0 ] | ||
+ | do | ||
+ | $IPS -D FSNAT $IP | ||
+ | done | ||
+ | $IPS -A FSNATDROP $IP | ||
+ | |||
+ | |||
+ | ############################################################################ | ||
+ | |||
+ | |||
+ | $IPT -t nat -A PREROUTING --src $IP --dst 0.0.0.0/0 -p tcp --dport 80 -j DNAT --to-destination 172.16.0.1 | ||
+ | |||
+ | |||
+ | |||
+ | # DAY/NIGHT switcher | ||
+ | /bin/rm / | ||
+ | |||
+ | |||
+ | echo " | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ======= Пробуем стартовать ======= | ||
+ | Для начала остановим систему через скрипт bil: | ||
+ | < | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | Ну а теперь запустим эту систему: | ||
+ | < | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | В теории всё должно работать. | ||
+ | |||
+ | |||
+ | ======= Приколюхи от Ubilling: ======= | ||
+ | |||
+ | |||
+ | ** колонка " | ||
+ | |||
+ | 1. Лезем в конфиг / | ||
+ | < | ||
+ | DN_ONLINE_DETECT=1 | ||
+ | </ | ||
+ | |||
+ | 2. Убеждаемся что в скриптах OnConnect/ | ||
+ | OnConnect | ||
+ | < | ||
+ | /bin/echo $SPEED: | ||
+ | </ | ||
+ | |||
+ | OnDisconnect | ||
+ | < | ||
+ | /bin/rm / | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | 3. Делаем симлинк на папку: | ||
+ | < | ||
+ | ln -fs / | ||
+ | </ | ||
+ | |||
+ | 4. Радуемся звёздочкам =) | ||
+ | |||
+ | ======= Мой alter.ini ======= | ||
+ | < | ||
+ | |||
+ | ;Опции поиска новых MAC адресов | ||
+ | ;Если у вас в сети используються только статические пулы хостов DHCP переменная NMLEASES должна выглядеть как / | ||
+ | NMLEASES = / | ||
+ | |||
+ | ; | ||
+ | NMLEASEMARK=" | ||
+ | |||
+ | ; | ||
+ | NMREP_INMACCHG=1 | ||
+ | |||
+ | Отображать новые MAC адреса в виде выпадающего списка | ||
+ | SIMPLENEWMACSELECTOR=1 | ||
+ | |||
+ | ; | ||
+ | PROFILE_PLUGINS=1 | ||
+ | |||
+ | ; | ||
+ | CITY_DISPLAY=1 | ||
+ | |||
+ | ; | ||
+ | ZERO_TOLERANCE=1 | ||
+ | |||
+ | ; | ||
+ | DOCSIS_SUPPORT=0 | ||
+ | |||
+ | ; | ||
+ | DOCSIS_MODEM_NETID=2 | ||
+ | |||
+ | ; Пути к исходным и скомпилированным конфигам модемов | ||
+ | docsis_cm_source=multinet/ | ||
+ | docsis_cm_bin=multinet/ | ||
+ | |||
+ | ; | ||
+ | AGENTS_ASSIGN=1 | ||
+ | |||
+ | ; Включать експорт оплат? (например в 1С) | ||
+ | EXPORT_ENABLED=1 | ||
+ | |||
+ | ; | ||
+ | ; | ||
+ | DEFAULT_ASSIGN_AGENT=1 | ||
+ | |||
+ | ;Время начала и конца суток | ||
+ | EXPORT_FROM_TIME=00: | ||
+ | EXPORT_TO_TIME=23: | ||
+ | |||
+ | ; | ||
+ | EXPORT_FORMAT=xml | ||
+ | |||
+ | ; Експортировать только положительные оплаты? | ||
+ | EXPORT_ONLY_POSITIVE=1 | ||
+ | |||
+ | ; | ||
+ | EXPORT_TEMPLATE=config/ | ||
+ | EXPORT_TEMPLATE_HEAD=config/ | ||
+ | EXPORT_TEMPLATE_END=config/ | ||
+ | |||
+ | ; | ||
+ | EXPORT_ENCODING=utf-8 | ||
+ | IMPORT_ENCODING=utf-8 | ||
+ | |||
+ | ; | ||
+ | TRAFFSIZE= Gb | ||
+ | |||
+ | ; | ||
+ | TARIFFCHGRESET=1 | ||
+ | |||
+ | ; | ||
+ | PASSWORDSHIDE=0 | ||
+ | |||
+ | ; | ||
+ | DN_ONLINE_DETECT=0 | ||
+ | |||
+ | ; | ||
+ | TRANSLATE_PAYMENTS_NOTES=0 | ||
+ | |||
+ | ; | ||
+ | HIGHLIGHT_IMPORTANT=1 | ||
+ | |||
+ | ; | ||
+ | NMCHANGE=0 | ||
+ | |||
+ | ; | ||
+ | ONLINE_LIGHTER=1 | ||
+ | |||
+ | ; | ||
+ | OPENPAYZ_SUPPORT=0 | ||
+ | |||
+ | ; | ||
+ | OPENPAYZ_MANUAL=1 | ||
+ | |||
+ | ;ID типа платежа под с которым будут вноситься оплаты в ручном режиме | ||
+ | OPENPAYZ_CASHTYPEID=1 | ||
+ | |||
+ | ; | ||
+ | HIGHLIGHT_TODAY_PAYMENTS=1 | ||
+ | |||
+ | ; | ||
+ | ONLINE_FILTERS_EXT=1 | ||
+ | |||
+ | ;При удалении пользователя не трогать его договор в целях обеспечения уникальности | ||
+ | STRICT_CONTRACTS_PROTECT=1 | ||
+ | |||
+ | ; | ||
+ | STRICT_CONTRACTS_UNIQUE=1 | ||
+ | |||
+ | ; | ||
+ | CATV_ENABLED=0 | ||
+ | |||
+ | ; | ||
+ | ONLINE_LAT=1 | ||
+ | |||
+ | ; | ||
+ | MASSSEND_ENABLED=1 | ||
+ | |||
+ | ; | ||
+ | MASSSEND_SAFE=1 | ||
+ | |||
+ | ; Максимально допустимый уровень кредита, | ||
+ | STRICT_CREDIT_LIMIT=DISABLED | ||
+ | |||
+ | ; Включено ли связывание пользователей (ака корпоративные пользователи)? | ||
+ | USER_LINKING_ENABLED=1 | ||
+ | |||
+ | ; Поле для связывания (IP, login… или еще какое-то) | ||
+ | USER_LINKING_FIELD=" | ||
+ | |||
+ | ;ID доп. поля профиля по которому определяется факт связанности | ||
+ | USER_LINKING_CFID=24 | ||
+ | |||
+ | ; Репликация тарифа родительского пользователя на дочерних | ||
+ | USER_LINKING_TARIFF=1 | ||
+ | |||
+ | ; Репликация денежных операций родительского пользователя на дочерних | ||
+ | USER_LINKING_CASH=1 | ||
+ | |||
+ | ; Репликация кредита родительского пользователя на дочерних | ||
+ | USER_LINKING_CREDIT=1 | ||
+ | |||
+ | ;Путь к логфайлу stargazer | ||
+ | STG_LOG_PATH=/ | ||
+ | |||
+ | ;Путь к arping | ||
+ | ARPING=/ | ||
+ | |||
+ | ; | ||
+ | ARPING_IFACE=-i vlan101 | ||
+ | |||
+ | ; | ||
+ | ARPDIAG_ENABLED=1 | ||
+ | |||
+ | ;Путь к логу arpwatch | ||
+ | ARPDIAG_LOG=/ | ||
+ | |||
+ | ;Опция отвечающая за то, какие таблички должны быть исключены при бекапе БД | ||
+ | NOBACKUPTABLESLIKE=logs_, | ||
+ | |||
+ | ;Может ли пользователь изменять размер иконок в панели задач? | ||
+ | TB_ICONCUSTOMSIZE=1 | ||
+ | |||
+ | ; | ||
+ | MACCHANGERANDOMDEFAULT=1 | ||
+ | |||
+ | ; Если значение установлено в 1 - будет вызван ресет пользователя при изменении любого кастомного поля профиля | ||
+ | RESETONCFCHANGE=1 | ||
+ | RESETONTAGCHANGE=1 | ||
+ | |||
+ | ; Показывать ли уведомление о новых тикетах в «Панели задач»? | ||
+ | TB_NEWTICKETNOTIFY=1 | ||
+ | |||
+ | Включен ли импорт банковских выписок? | ||
+ | BS_ENABLED=1 | ||
+ | |||
+ | ; | ||
+ | BS_INCHARSET=" | ||
+ | BS_OUTCHARSET=" | ||
+ | |||
+ | ;Опции импорта банковских выписок (черная магия, руками не трогать) | ||
+ | BS_OPTIONS=" | ||
+ | |||
+ | ;Тип оплат для денег разнесенных автоматом по выпискам | ||
+ | BS_CASHTYPE=1 | ||
+ | |||
+ | ;Режим высокой производительности модуля «Онлайн»: | ||
+ | ; | ||
+ | ;не вызывая своим видом возрастания нагрузки на сервер, | ||
+ | ONLINE_HP_MODE=1 | ||
+ | |||
+ | ; Запрет на редактирование логинов-паролей-айпишек при регистрации, | ||
+ | SAFE_REGMODE=1 | ||
+ | |||
+ | ; | ||
+ | TICKETS_PERPAGE=50 | ||
+ | |||
+ | ; | ||
+ | NDS_ENABLED=0 | ||
+ | |||
+ | ;ID тега обозначающего пользователя плательщика НДС | ||
+ | NDS_TAGID=9 | ||
+ | |||
+ | ; | ||
+ | NDS_TAX_PERCENT=20 | ||
+ | |||
+ | ; | ||
+ | FAST_CASH_LINK=0 | ||
+ | |||
+ | ; | ||
+ | MTSIGMON_ENABLED=0 | ||
+ | |||
+ | ; | ||
+ | SIGREQ_ENABLED=0 | ||
+ | |||
+ | ;Время в минутах по прошествию которого все свитчи будут перепинговываться. | ||
+ | SW_PINGTIMEOUT=2 | ||
+ | |||
+ | ; | ||
+ | TB_SWITCHMON=1 | ||
+ | |||
+ | ; | ||
+ | REMOTEAPI_ENABLED=1 | ||
+ | |||
+ | ; | ||
+ | RADIUST_ENABLED=0 | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | ======= Источники и автор статьи: | ||
+ | |||
+ | |||
+ | **Основные источники информации которые помогли написать эту инструкцию: | ||
+ | |||
+ | local.com.ua | ||
+ | |||
+ | wiki.ubilling.net.ua | ||
+ | |||
+ | habrahabr.ru | ||
+ | |||
+ | |||
+ | **Автор инструкции: | ||