====== Связка 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|}}