Связка pfSense и NetUP 5+ (utm5) для самых маленьких + примеры автоматизации

В моем примере это все будет разворачиваться на Proxmox'e:
- контейнер с Debian10 (Buster) (согласно рекомендациям в документации биллинга)
- виртуалка с pfSense 2.6.0-RELEASE
Авторизация пользователей (клиентов) будет осуществляться по MAC адресу
Пользователь может получить настройки по DHCP или самостоятельно прописать статику
Для связки будем использовать настройки firewall, возможно есть более правильные решения,
но учитывая что меня попросили хорошие знакомые сделать это еще вчера на pfSense и utm5 (а их я вижу впервые), делаю на уровне моего понимания.
Как это все будет работать…
При изменении состояния клиента(включен/выключен) будет вызываться скрипт
/usr/sbin/pfsense
который будет по ssh с использованием ключа(без ввода пароля) выполнять команды на сервере на котором установлен pfSense
т.е. биллинг отправляет команды на роутер, через который работают клиенты.
В данной конфигурации предусмотрены включение/отключение доступа в интернет и шейпинг скорости.

Подготовка pfSense

Откроем веб интерфейс и перейдем в
СистемаРасширенныеДоступ Администратора
И поставим галочку рядом с Включить Безопасную Оболочку (SSH)

Обязательно внизу страницы нажимаем кнопку Сохранить

Теперь переходим
Сервисы > DHCP Сервер > LAN
Ставим галочку Включить Сервер DHCP на интерфейсе LAN
Отклонить неизвестных клиентов - Allow known clients from only this interface
Статический ARP - ставим галочку Включить статические записи ARP
Остальное настройте по своему усмотрению

Нажимаем Сохранение

Далее зайдем по 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
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 <ip адрес LAN интерфейса(через который по умолчанию происходит доступ к веб интерфейсу pfSesne)>

Посмотреть результат можно в веб интерфейсе
Межсетевой экран > Алиасы > Единый указатель ресурса

Сгенерируем список правил firewall

/usr/local/sbin/pfSsh.php playback make_fw_rules <interface>

В моем случае это 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
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 <add|del> <ip> <list.txt>\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 <add|del> <ip> <list>\n";
my $file_list = (defined($ARGV[0]) and $ARGV[0] =~ m/^[[A-z0-9_]+\.txt$/) ? shift(@ARGV) : die "[USE]: iplistcfg <add|del> <ip> <list>\n";
 
my $list;
open(FILE, "<", DIR_FILE_LIST . $file_list) or die "$! : ${\DIR_FILE_LIST}$file_list";
while(<FILE>) { $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
Добавим новое правило Действие - Отвергнуть
Протокол - Любой
Источник - Сеть (из которой клиентам будете выдавать адреса)

Нажимаем Сохранение Расположите правило в самом конце списка правил, зажмите мышкой этой правило и передвиньте вниз
и не забываем нажать Применить изменения

Отключим правило Default allow LAN to any rule

Нажимаем Сохранение и не забываем нажать Применить изменения

На этом преднастройка 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
pfsense
#!/bin/sh
ssh utm5@<ip> "$*"

Откроем файл

root@billing:/usr/sbin# nano pfsense

Замените <ip> на 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@<ip pfsense>

Теперь вы можете сказать

root@billing:/usr/sbin# ssh utm5@<ip pfsense> ifconfig

И убедиться, что команда будет выполнена на сервере pfSense
Это нужно для того, чтобы биллинг мог отправлять команды на сервер на котором у нас установлен pfSense и тем самым управлять. Откроем

root@billing:/usr/sbin# nano /etc/ssh/ssh_config

И перед Host * добавим строчки

Host <ip pfsense>
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

Откроем Оборудование > Список брандмауэров
Изменим

На

Перезапустим

root@billing:/netup/utm5/log# service utm5_rfw restart

Перейдем Тарификация > Шаблоны услуг
Добавим Услуга передачи IP трафика

Перейдем Тарификация > Тарифы
Добавим тарифный план

Два раза кликнем на созданный тарифный план и выберем Добавить услугу
Выберем ранее созданную услугу Интернет и добавим к тарифу
Нажимаем Сохранить

Перейдем Тарификация > Расчетные периоды
Добавим расчетный период ежемесячный

Теперь переходим Основное > Абоненты
Добавим первого клиента

Два раза кликнем по абоненту
Выберем Тарификация > Тарифы
Добавим клиенту тарифный план и установим расчетный период

Далее выбираем IP группы в разделах

Статический IP указываем айпи адрес клиента

DHCP настройки указываем MAC адрес клиента

В итоге у нас получилось

Нажимаем Сохранить

Перейдем Оборудование > Правила firewall
Добавим новое правило
1. Выбираем событие Включение интернета и нажимаем добавить
2. В поле Правила firewall пишем sudo iplistcfg add UIP s10mbit.txt

Выбираем раздел Выполнять для
1. В Название тарифа выбираем наш тариф Интернет 10Mbit
2. Ставим галочку Совпадают все параметры 3. Брандмауэр выбираем pfsense
4. Тип выбираем NetUP

Добавим новое правило
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_and_pfsense.txt · Последнее изменение: 2023/03/10 15:45 — root
Наверх
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0