====== Связка pfSense и NetUP 5+ (utm5) для самых маленьких + примеры автоматизации ======
В моем примере это все будет разворачиваться на Proxmox'e: \\
- контейнер с **Debian10 (Buster)** (согласно рекомендациям в [[https://www.netup.ru/ru/utm5/utm5docs/5.5-021-release-web/index.html#installation_requirements|документации]] биллинга)\\
- виртуалка с **pfSense 2.6.0-RELEASE** \\
Авторизация пользователей (клиентов) будет осуществляться по MAC адресу \\
Пользователь может получить настройки по DHCP или самостоятельно прописать статику \\
Для связки будем использовать настройки firewall, возможно есть более правильные решения, \\
но учитывая что меня попросили хорошие знакомые сделать это еще вчера на pfSense и utm5 (а их я вижу впервые), делаю на уровне моего понимания. \\
Как это все будет работать... \\
При изменении состояния клиента(включен/выключен) будет вызываться скрипт \\
/usr/sbin/pfsense \\
который будет по ssh с использованием ключа(без ввода пароля) выполнять команды на сервере на котором установлен pfSense \\
т.е. биллинг отправляет команды на роутер, через который работают клиенты. \\
В данной конфигурации предусмотрены включение/отключение доступа в интернет и шейпинг скорости.
====== Подготовка pfSense ======
Откроем веб интерфейс и перейдем в \\
**Система** -> **Расширенные** -> **Доступ Администратора** \\
И поставим галочку рядом с **Включить Безопасную Оболочку (SSH)**
{{:utm5:pfsense.png.png?direct&400|}}
Обязательно внизу страницы нажимаем кнопку Сохранить \\
Теперь переходим \\
**Сервисы** > **DHCP Сервер** > **LAN** \\
Ставим галочку **Включить Сервер DHCP на интерфейсе LAN** \\
**Отклонить неизвестных клиентов** - **Allow known clients from only this interface** \\
**Статический ARP** - ставим галочку **Включить статические записи ARP** \\
Остальное настройте по своему усмотрению \\
{{:utm5:pfsense5.png?direct&400|}}
{{:utm5:pfsense6.png?direct&400|}}
Нажимаем **Сохранение**
Далее зайдем по ssh и добавим пользователя с логином **utm5**
adduser -d
Username: utm5
Full name: billing
Uid (Leave empty for default):
Login group [utm5]:
Login group is utm5. Invite utm5 into other groups? []:
Login class [default]:
Shell (sh csh tcsh ssh_tunnel_shell scponly scponlyc nologin) [sh]:
Home directory [/utm5]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]: yes
Use an empty password? (yes/no) [no]: no
Use a random password? (yes/no) [no]: no
Enter password:
Enter password again:
Lock out the account after creation? [no]:
Username : utm5
Password : *****
Full Name : billing
Uid : 1001
Class :
Groups : utm5
Home : /utm5
Home Mode :
Shell : /bin/sh
Locked : no
OK? (yes/no): yes
adduser: INFO: Successfully added (utm5) to the user database.
Add another user? (yes/no): no
Goodbye!
Установим sudo
pkg update
pkg install sudo
Откроем файл
vi /etc/group
Добавим нашего пользователя в группу wheel
wheel:*:0:root,utm5
shif + ; \\
введите wq и нажмите enter \\
Откроем файл
visudo
*если получаете ошибку, что команда не найдена введите exit и еще раз выберите 8) Shell
Раскомментируем строчку (для удаления символа нажмите d и стрелочка вправо)
%wheel ALL=(ALL) NOPASSWD: ALL
Нажать Esc \\
Ввести wq \\
Нажать Enter
Перейдем в директорию
cd /etc/phpshellsessions/
Загрузим скрипты для автоматизации
fetch 'http://devnoc.ru/doku.php/pfsense?do=export_code&codeblock=0' -o make_limiters
fetch 'http://devnoc.ru/doku.php/pfsense?do=export_code&codeblock=1' -o make_aliases
fetch 'http://devnoc.ru/doku.php/pfsense?do=export_code&codeblock=2' -o make_fw_rules
fetch 'http://devnoc.ru/doku.php/pfsense?do=export_code&codeblock=3' -o static_list
Можно это все натыкать сделать вручную через веб интерфейс, но зачем? \\
Сгенерируем лимитеры
/usr/local/sbin/pfSsh.php playback make_limiters
Посмотреть результат можно в веб интерфейсе \\
**Межсетевой экран** > **Трафик Шейпер** > **Лимитеры**
Перейдем в директорию
cd /usr/local/www
Загрузим скрипт для автоматизации
fetch 'http://devnoc.ru/doku.php/utm5/utm5_and_pfsense?do=export_code&codeblock=0' -o make_shapers_list.pl
#!/usr/local/bin/perl
use strict;
use warnings;
use Data::Dumper;
mkdir('shapers');
my @s_list = ('1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '15', '20', '25', '30', '40', '50', '60', '70', '80', '90', '100', '150', '200', '250', '300', '500', '1000');
foreach my $e (@s_list)
{
open(FILE, '>', 'shapers/s' . $e . 'mbit.txt');
close(FILE);
}
Сделаем файл исполняемым
chmod +x make_shapers_list.pl
Сгенерируем списки
./make_shapers_list.pl
Удалим скрипт
rm make_shapers_list.pl
И так, что мы сейчас сделали... \\
Этот скрипт создает директорию /usr/local/www/shapers/ с множеством пустых файлов, эти файлы в будущем будут являться списками IP адресов для создания алиасов типа **Таблица Единых указателей ресурсов (IP)** \\
Сгенерируем алиасы
/usr/local/sbin/pfSsh.php playback make_aliases
Посмотреть результат можно в веб интерфейсе \\
**Межсетевой экран** > **Алиасы** > **Единый указатель ресурса**
Сгенерируем список правил firewall
/usr/local/sbin/pfSsh.php playback make_fw_rules
В моем случае это lan \\
/usr/local/sbin/pfSsh.php playback make_fw_rules lan
Посмотреть результат можно в веб интерфейсе \\
**Межсетевой экран** > **Правила** > **LAN** \\
Перейдем в директорию
cd /usr/sbin
Загрузим скрипт для управления списками ip адресов
fetch 'http://devnoc.ru/doku.php/utm5/utm5_and_pfsense?do=export_code&codeblock=1' -o iplistcfg
#!/usr/local/bin/perl
use strict;
use warnings;
use Data::Dumper;
use constant DIR_FILE_LIST => '/usr/local/www/shapers/';
my $action = (defined($ARGV[0]) and $ARGV[0] =~ m/^(add|del)$/) ? shift(@ARGV) : die "[USE]: iplistcfg \n";
my $ip = (defined($ARGV[0]) and $ARGV[0] =~ m/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/) ? shift(@ARGV) : die "[USE]: iplistcfg \n";
my $file_list = (defined($ARGV[0]) and $ARGV[0] =~ m/^[[A-z0-9_]+\.txt$/) ? shift(@ARGV) : die "[USE]: iplistcfg \n";
my $list;
open(FILE, "<", DIR_FILE_LIST . $file_list) or die "$! : ${\DIR_FILE_LIST}$file_list";
while() { $list .= $_; }
close(FILE);
if($action eq 'add' and $list !~ m/^$ip$/m) { $list .= "$ip\n"; }
if($action eq 'del' and $list =~ m/^$ip\n$/m) { $list =~ s/^$ip\n?//m; }
open(FILE, ">", DIR_FILE_LIST . $file_list) or die "$! : ${\DIR_FILE_LIST}$file_list";
print FILE $list;
close(FILE);
system('sudo /etc/rc.update_urltables now forceupdate');
Сделаем файл исполняемым
chmod +x iplistcfg
Вернемся в веб интерфейс и откроем \\
**Межсетевой экран** > **Правила** > **LAN** \\
Добавим новое правило
**Действие** - **Отвергнуть** \\
**Протокол** - **Любой** \\
**Источник** - **Сеть** (из которой клиентам будете выдавать адреса) \\
{{:utm5:pfsense2.png?direct&400|}}
Нажимаем **Сохранение**
Расположите правило в самом конце списка правил, зажмите мышкой этой правило и передвиньте вниз \\
и не забываем нажать **Применить изменения** \\
Отключим правило **Default allow LAN to any rule** \\
{{:utm5:pfsense3.png?direct&400|}}
{{:utm5:pfsense4.png?direct&400|}}
Нажимаем **Сохранение** и не забываем нажать **Применить изменения** \\
На этом преднастройка pfSense завершена \\
====== Настройка utm5 ======
Вернемся на сервер где у нас расположен биллинг и перейдем в директорию
root@billing:~# cd /netup/utm5/
Откроем файл конфигурации модуля firewall
root@billing:/netup/utm5# nano rfw5.cfg
Отредактируем строки
rfw_name=pfsense
rfw_password=rfw
*Измените rfw_password если ранее меняли пользователю rwf пароль \\
Заменим строку
firewall_path=/sbin/ipfw
На
firewall_path=/sbin/pfsense
Перейдем в директорию
root@billing:/netup/utm5# cd /usr/sbin/
Загрузим скрипт
wget http://devnoc.ru/doku.php/utm5/utm5_and_pfsense?do=export_code&codeblock=2
#!/bin/sh
ssh utm5@ "$*"
Откроем файл
root@billing:/usr/sbin# nano pfsense
Замените на lan ip адрес pfsense(адрес веб интерфейса по умолчанию)\\
Сделаем файл исполняемым
root@billing:/usr/sbin# chmod +x pfsense
Сгенерируем ключ(Enter, Enter, Enter)
root@billing:/usr/sbin# ssh-keygen
И скопируем его на сервер pfSens'a
root@billing:/usr/sbin# ssh-copy-id utm5@
Теперь вы можете сказать
root@billing:/usr/sbin# ssh utm5@ ifconfig
И убедиться, что команда будет выполнена на сервере pfSense \\
Это нужно для того, чтобы биллинг мог отправлять команды на сервер на котором у нас установлен pfSense и тем самым управлять.
Откроем
root@billing:/usr/sbin# nano /etc/ssh/ssh_config
И перед Host * добавим строчки
Host
IdentityFile ~/.ssh/id_rsa
Перейдем в директорию
root@billing:/usr/sbin# cd /etc/systemd/system/
Откроем
root@billing:/etc/systemd/system# nano utm5_rfw.service
Добавим в конец файла
[Install]
WantedBy=multi-user.target
Закроем файл и добавим utm5_rfw в автозагрузку
root@billing:/etc/systemd/system# systemctl enable utm5_rfw.service
Теперь rfw будет автоматически запускаться при старте сервера
Запустим вручную
root@billing:/etc/systemd/system# service utm5_rfw start
Теперь переходим в веб интерфейс utm5 \\
http://localhost/admin/#/login \\
Если вы не изменили стандартные пароли, то по умолчанию логин/пароль для входа init/init
Откроем **Оборудование** > **Список брандмауэров** \\
Изменим \\
{{:utm5:utm5_1.png?direct&400|}} \\
На \\
{{:utm5:utm5_2.png?direct&400|}} \\
Перезапустим \\
root@billing:/netup/utm5/log# service utm5_rfw restart
Перейдем **Тарификация** > **Шаблоны услуг** \\
Добавим **Услуга передачи IP трафика** \\
{{:utm5:utm5_3.png?direct&400|}}
Перейдем **Тарификация** > **Тарифы** \\
Добавим тарифный план \\
{{:utm5:utm5_4.png?direct&400|}}
Два раза кликнем на созданный тарифный план и выберем **Добавить услугу** \\
Выберем ранее созданную услугу Интернет и добавим к тарифу \\
Нажимаем **Сохранить** \\
Перейдем **Тарификация** > **Расчетные периоды ** \\
Добавим расчетный период ежемесячный \\
{{:utm5:utm5_5.png?direct&400|}}
Теперь переходим **Основное** > **Абоненты** \\
Добавим первого клиента \\
Два раза кликнем по абоненту \\
Выберем **Тарификация** > **Тарифы** \\
Добавим клиенту тарифный план и установим расчетный период \\
{{:utm5:utm5_6.png?direct&400|}}
Далее выбираем **IP группы** в разделах \\
{{:utm5:utm5_7.png?direct&400|}} \\
**Статический IP** указываем айпи адрес клиента \\
{{:utm5:utm5_8.png?direct&400|}} \\
**DHCP настройки** указываем MAC адрес клиента\\
{{:utm5:utm5_9.png?direct&400|}} \\
В итоге у нас получилось \\
{{:utm5:utm5_10.png?direct&400|}} \\
Нажимаем **Сохранить** \\
Перейдем **Оборудование** > **Правила firewall** \\
Добавим новое правило \\
1. Выбираем событие **Включение интернета** и нажимаем добавить \\
2. В поле **Правила firewall** пишем **sudo iplistcfg add UIP s10mbit.txt** \\
{{:utm5:utm5_11.png?direct&400|}} \\
Выбираем раздел **Выполнять для** \\
1. В **Название тарифа** выбираем наш тариф **Интернет 10Mbit** \\
2. Ставим галочку **Совпадают все параметры**
3. **Брандмауэр** выбираем **pfsense** \\
4. **Тип** выбираем **NetUP** \\
{{:utm5:utm5_12.png?direct&400|}} \\
Добавим новое правило \\
1. Выбираем событие **Включение интернета** и нажимаем добавить \\
2. В поле **Правила firewall** пишем **sudo /usr/local/sbin/pfSsh.php playback static_list add lan UIP MAC** \\
Выбираем раздел **Выполнять для** \\
1. В **Название тарифа** выбираем наш тариф **Интернет 10Mbit** \\
2. Ставим галочку **Совпадают все параметры**
3. **Брандмауэр** выбираем **pfsense** \\
4. **Тип** выбираем **NetUP** \\
Теперь добавим те же правила, но при отключении интернета \\
Добавим новое правило \\
1. Выбираем событие **Выключение интернета** и нажимаем добавить \\
2. В поле **Правила firewall** пишем **sudo iplistcfg del UIP s10mbit.txt** \\
Выбираем раздел **Выполнять для** \\
1. В **Название тарифа** выбираем наш тариф **Интернет 10Mbit** \\
2. Ставим галочку **Совпадают все параметры**
3. **Брандмауэр** выбираем **pfsense** \\
4. **Тип** выбираем **NetUP** \\
Добавим новое правило \\
1. Выбираем событие **Выключение интернета** и нажимаем добавить \\
2. В поле **Правила firewall** пишем **sudo /usr/local/sbin/pfSsh.php playback static_list del lan UIP MAC** \\
Выбираем раздел **Выполнять для** \\
1. В **Название тарифа** выбираем наш тариф **Интернет 10Mbit** \\
2. Ставим галочку **Совпадают все параметры**
3. **Брандмауэр** выбираем **pfsense** \\
4. **Тип** выбираем **NetUP** \\
В итоге у нас получилось вот такие правила \\
{{:utm5:utm5_13.png?direct&400|}}