Содержание
Связка 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






