Proxmox и pfSense
08 01 2021
Настройка совместной работы Proxmox и pfSense на сервере с единственным IP-адресом
- Начавшийся с появлением графических интерфейсов регресс средней квалификации привёл к тому, что для большинства современных IT-специалистов настройка через GUI является не только более удобной, но зачастую и единственно возможной.
- С другой стороны, благодаря им смогли получить повсеместное распространение инструменты, считавшиеся ранее нетривиальными — например, системы виртуализации и сетевые маршрутизаторы.
- Однако зависимость от графических средств настройки нередко оборачивается усложнением конфигурации. Например, любой современный Linux (и в определённой мере FreeBSD) из коробки является и системой виртуализации, и сетевым маршрутизатором, но отсутствие единого GUI для управления этими функциями приводит многих к необходимости одновременно иметь два специализированных дистрибутива (один из-за удобного GUI для настройки маршрутизатора, второй из-за удобного GUI для настройки виртуализации) там, где при умении пользоваться текстовой консолью хватило бы одного универсального.
- Ниже мы описываем ситуацию, с которой столкнулся наш GUI-зависимый клиент, и решение, которое мы ему предложили.
Исходная диспозиция:
- Имеется сервер в дата-центре, серверу выделен один публичный IP-адрес.
- Получение дополнительных IP невозможно, IPMI отсутствует, IP-KVM не предоставляется.
- На сервере установлен Proxmox и планируется создание нескольких виртуальных машин.
- Связь между виртуалками и Интернетом должна производиться через pfSense, запущенный в первой из виртуалок.
- Добиться этого можно единственным образом — передать публичный IP-адрес (а также MAC-адрес физического интерфейса) из Proxmox в pfSense.
- Вариант с NAT 1:1 на Proxmox был отвергнут из-за неочевидности для клиента и побочных эффектов.
Трудности перевода:
- Поскольку управление и настройка производятся через передаваемый IP,
- необходимо сначала полностью подготовить новые настройки на pfSense и Proxmox,
- а затем одновременно применить их.
- Если при этом Proxmox отдаст IP/Mac, а pfSense их не подхватит, система станет недоступной.
- Eсли pfSense подхватит IP/Mac до того, как их отдаст Proxmox, возникнет конфликт адресов и система станет недоступной.
- По умолчанию pfSense не отвечает на WAN-интерфейсе даже на ping — если он не будет предварительно подготовлен для управления извне, система станет недоступной.
- Предварительно протестировать настройки невозможно — либо они верные, либо после их применения система станет недоступной
- Мы нашли в сети неожиданно много обсуждений данной задачи, но ни одно из них не содержало решения.
Нам потребуется второй сетевой мост:
- Автоматически создаваемый мост vmbr0 в Proxmox используется для связи с внешним миром подключенных к нему виртуальных машин, контейнеров и самого Proxmox.
- Нам понадобится дополнительный мост vmbr1, который будет использоваться для внутренней сети: в него будет подключен LAN-интерфейс pfSense и сетевые интерфейсы всех остальных контейнеров и виртуалок.
- После завершения настроек и перезагрузки vmbr1 превратится для Proxmox в IP-интерфейс по умолчанию, а шлюзом по умолчанию станет подключенный к этому мосту LAN-интерфейс pfSense.
- Кроме того, до перезагрузки (т.е. до окончательного применения новых настроек) мы будем держать WAN-интерфейс pfSense подключенным к vmbr1 вместо vmbr0, чтобы полностью настроить pfSense, не создавая конфликта IP- и MAC-адресов между pfSense и Proxmox.
Порядок создания vmbr1:
- Proxmox использует для хранения сетевых настроек классический файл /etc/network/interfaces
- Чтобы применять его изменения без перезагрузки, необходима утилита ifup из пакета ifupdown2.
- По умолчанию Proxmox его не устанавливает, поэтому перед созданием моста мы должны сделать это вручную из SSH-консоли:
apt update &&
apt -y dist-upgrade &&
apt -y install ifupdown2
- После этого открываем в Веб-интерфейсе раздел System/Network и создаём новый мост с IP-адресом 10.0.0.10/24:

Обратите внимание!
- На этом этапе у моста должен быть пустой IP-адрес шлюза.
- В мост не должен быть подключен ни один физический интерфейс.
Загружаем дистрибутив pfSense на сервер:
- Из https://frafiles.pfsense.org/mirror/downloads скачиваем последнюю версию pfSense-CE-xx-RELEASE-xx-amd64.iso.gz (сейчас это pfSense-CE-2.4.5-RELEASE-amd64.iso.gz ).
- Proxmox пока не поддерживает сжатые ISO-образы, поэтому распаковываем его:
gzip -d pfSense-*.iso.gz
- Загружаем ISO-файл через Веб-интерфейс: Node => Content => Upload => ISO image.
Создаём виртуальную машину для pfSense:
- General: Advanced => Start at boot = yes
- OS: ISO image = pfSense, Guest OS type = other
- Harddisk: Bus = virtio, Size = 2gb
- CPU: cores = 2
- Memory: 1024 megabytes
- Network: Bridge = vmbr1, Model = virtio(Е1000), MAC address = ..., Firewall = off
Какой MAC-адрес следует указать в свойствах создаваемой сетевой карты?
- В SSH-консоли Proxmox смотрим, какой физический интерфейс подключен в мост vmbr0:
# ip a
3: vmbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP grou p default qlen 1000
link/ether 34:97:f6:8d:f4:65 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.200/24 brd 192.168.1.255 scope global vmbr0
valid_lft forever preferred_lft forever
inet6 fe80::3697:f6ff:fe8d:f465/64 scope link
valid_lft forever preferred_lft forever
4: vmbr1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP grou p default qlen 1000
link/ether ca:2e:89:e1:e8:27 brd ff:ff:ff:ff:ff:ff
inet6 fe80::2409:9ff:fec0:660b/64 scope link
valid_lft forever preferred_lft forever
- Затем смотрим параметры физического интерфейса:
ip link list dev имя-физического-интерфейса
- В данном примере исходный MAC-адрес WAN-интерфейса Proxmox для назначения WAN-интерфейсу pfSense равен 00:25:90:30:48:72:

Заканчиваем настройку виртуальной машины:
- На вкладке Hardware нажимаем Add => Network Device
- Параметры новой сетевой карты: bridge = vmbr1, model = virtio(Е1000), firewall = off
Теперь запускаем её и инсталлируем pfSense:
- Открываем noVNC-консоль.
- Внутри неё нажимаем “Start”.
- Проходим установку, выбирая на всех шагах ответ по умолчанию.
- В конце установки разрешаем перезагрузку.
- После перезагрузки возвращаемся в раздел Hardware и выбираем для CD/DVD либо Remove, либо Edit => Do not use any media.
Настройка pfSense через консоль при первом запуске:
- VLANs = no
- WAN = em0
- LAN = em1
- В текстовом меню выбираем “2” (Set interface(s) IP address) и настраиваем LAN-интерфейс:
- IP-адрес = 10.8.0.2/24
- DHCP server = yes
- DHCP range = 10.8.0.50-10.8.0.100
- revert webConf to HTTP = yes
Теперь мы можем подключиться к Веб-интерфейсу pfSense:
- Для этого подключаемся к Proxmox по SSH, создавая TCP-туннель к pfSense (здесь и далее считаем 192.168.0.100 публичным адресом сервера):
ssh 192.168.0.100 -L 8000:10.8.0.2:80
- И открываем в Веб-браузере http://127.0.0.1:8000/
Продолжение настройки pfSense через Веб-интерфейс:
- Мастер настройки состоит из нескольких простых шагов, большинство параметров можно принимать без изменений.
- Логин/пароль по умолчанию: admin, pfsense
- DNS: рекомендуем 1.1.1.1 и 77.88.8.8
- WAN: тип = Static, IP-адрес = 192.168.0.100/24 (как у Proxmox), шлюз = 192.168.0.1 (как у Proxmox)
- Admin password: придумайте новый.
- Готово!
Завершение настройки pfSense:
- System / Advanced / Admin access: Enable SSH = yes
- System / Advanced / Networking:
- Prefer IPv4 over IPv6 = yes
- Disable hardware checksum offload = yes (все остальные offloadings уже отключены по умолчанию)
- Firewall / Rules: разрешаем SSH-подключения и пинги из Интернета:
- Action = Pass, Destination = WANaddr, Port = SSH
- Action = Pass, Destination = WANaddr, Proto = ICMP
- Нажимаем APPLY
- По умолчанию доступ к pfSense разрешён только через LAN интерфейс. Чтобы получить доступ через WAN, через консоль (INSTANCE CONSOLE) временно отключим firewall в pfSense. Для этого используем опцию №8 (Shell) чтобы попасть в интерфейс командной строки, где выполним отключение firewall:
Enter an option: 8
[2.4.4-RELEASE][root@pfSense.localdomain]/root: pfctl -d
pf disabled
Завершение настройки Proxmox:
- Останавливаем pfSense:
qm shutdown 100
- Редактируем
nano /etc/pve/qemu-server/100.conf
в свойствх nic0 заменяем "vmbr1" на "vmbr0"
- Делаем резервную копию /etc/network/interfaces
сp /etc/network/interfaces /etc/network/interfaces.new1
- Редактируем /etc/network/interfaces:
- под «iface имя-физического-WAN-интерфейса enp0s20 » добавляем строку с отступом:
pre-up ip link set $IFACE addr 00:0C:29:11:22:33
- пояснение: префикс "00:0C:29" мы позаимствовали у VMware, а "11:22:33" рекомендуется заменить на случайные 16-ричные цифры
- в строке "iface vmbr0 ..." заменяем "dhcp" или "static" на "manual"
- если использовался "static", под vmbr0 удаляем также строки "address", "netmask", "gateway" и "dns-..."
- под "iface vmbr1 ..." добавляем с отступом:
gateway 10.0.0.1
- Снова делаем резервную копию /etc/network/interfaces и запрещаем его менять с помощью установки атрибута "immutable":
- сp /etc/network/interfaces /etc/network/interfaces.new2
lsattr /etc/network/interfaces
chattr +i /etc/network/interfaces
lsattr /etc/network/interfaces
- Перезагружаем Proxmox...
- ...запускаем "ping 192.168.0.100" и затаив дыхание ждём несколько минут, пока не пойдут ответы.
В случае успешной перезагрузки:
- Поскольку теперь вместо Proxmox на IP-адресе 1.2.3.4 нам отвечает pfSense, удаляем запомненный публичный ключ сервера:
ssh-keygen -f ~/.ssh/known_hosts -R "192.168.0.100"
- Подключаемся к pfSense с пробросом портов:
ssh admin@192.168.0.100 -L 8000:10.0.0.1:80 -L 8006:10.0.0.10:8006 -L 8022:10.0.0.10:22
- В случае успеха в соседней консоли подключаемся к Proxmox:
ssh root@127.0.0.1 -p8022
- В Веб-браузере открываем Веб-интерфейс pfSense: http://127.0.0.1:8000
- ...и Веб-интерфейс Proxmox: https://127.0.0.1:8006
Настройка OpenVPN для pfSense:
- Когда вместо iptables для организации шлюза приходится настраивать pfSense, логично предположить, что для доступа во внутреннюю сеть вместо SSH-туннелей потребуется VPN
- Настройка VPN производится быстро, но не вполне очевидно, поэтому мы приведём её здесь
- System / Package Manager: установите пакет openvpn-client-export
- System / Certificate Manager / CAs: создайте новый Certificate Authority с произвольным названием, например, "CA1"
- System / Certificate Manager / Certificates => Add:
- Descriptive name: vpncert1
- Certificate authority: CA1
- Common name: pfsense (произвольное)
- Certificate Type: Server Certificate
- VPN / OpenVPN / Server => Add:
- Server mode: Remote access (user auth)
- Peer CA: CA1
- Server certificate: vpncert1
- Tunnel Network: 10.0.2.0/24
- Local Network: 10.0.0.0/24
- Firewall / Rules:
- action=pass, destination=WANaddr, proto=udp, port=1194
- action=pass, interface=OpenVPN, proto=any
- APPLY
- VPN / OpenVPN / Client Export => Authentication Only (No Cert), most clients
Подключение:
- Файл xx.ovpn загружен на предыдущем шаге из pfSense:
sudo openvpn --config pfSense-UDP4-1194-config.ovpn
- Перед подключением будут запрошены имя пользователя (admin) и пароль (установленный вами при первом входе в pfSense).
- После подключения убедитесь, что Веб-интерфейсы pfSense и Proxmox стали доступны как http://10.0.0.1 и https://10.0.0.10:8006
Священный заключительный шаг:
- Выбираем в Веб-интерфейсе pfSense пункт Diagnostics / Backup & Restore => Download configuration as XML
Пробежимся по меню pfsens:
- 0) Logout (SSH only) - Отключить соединение по SSH
- 1) Assign Interfaces - Назначить интерфейсы
- 2) Set interface(s) IP address - Установить IP-адрес интерфейса(ов)
- 3) Reset webConfigurator password - Сброс пароля Веб-конфигуратора [По умолчанию логин - "admin", пароль - "pfsense"]
- 4) Reset to factory defaults - Сброс роутера к заводским настройкам
- 5) Reboot system - Перезагрузка системы
- 6) Halt system - Выключение системы
- 7) Ping host - Утилита ping
- 8) Shell - Войти CLI
- 9) pfTop
- 10) Filter Logs
- 11) Restart webConfigurator - Перезапустить Веб-конфигуратор
- 12) PHP shell + pfSense tools
- 13) Update from console - Обновить из консоли
- 14) Enable Secure Shell (sshd) - Включить sshd
- 15) Restore recent Configuration - Восстановить недавнюю конфигурацию
- 16) Restart PHP-FPM
Думаю самые значимые для нас пункты это с 1 по 6. Тут и так всё понятно, подробно останавливаться на этом не будем.
Источник: https://cdnnow.ru/blog/pve-pfsense/
Источник: https://cdnnow.ru/blog/pve-pfsense/