Proxmox и pfSense

14 апреля 2020

Настройка совместной работы 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 — если он не будет предварительно подготовлен для управления извне, система станет недоступной.
  • Предварительно протестировать настройки невозможно — либо они верные, либо после их применения система станет недоступной
  • Мы нашли в сети неожиданно много обсуждений данной задачи, но ни одно из них не содержало решения.
  • Единственный документ, подсказавший нам, в каком направлении следует двигаться: https://blog.kton.me/post/152460845498/proxmox-pfsense-on-one-public-ip.

Нам потребуется второй сетевой мост:

  • Автоматически создаваемый мост 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:
  • Create vmbr1

Обратите внимание!

  • На этом этапе у моста должен быть пустой IP-адрес шлюза.
  • В мост не должен быть подключен ни один физический интерфейс.

Загружаем дистрибутив pfSense на сервер:

  • Из https://frafiles.pfsense.org/mirror/downloads скачиваем последнюю версию pfSense-CE-xx-RELEASE-xx-amd64.iso.gz (сейчас это pfSense-CE-2.4.4-RELEASE-p3-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 = 10gb
  • CPU: cores = 2
  • Memory: 1024 megabytes
  • Network: Bridge = vmbr1, Model = virtio, MAC address = ..., Firewall = off

Какой MAC-адрес следует указать в свойствах создаваемой сетевой карты?

  • В SSH-консоли Proxmox смотрим, какой физический интерфейс подключен в мост vmbr0:
  • brctl show
  • Затем смотрим параметры физического интерфейса:
  • ip link list dev имя-физического-интерфейса
  • В данном примере исходный MAC-адрес WAN-интерфейса Proxmox для назначения WAN-интерфейсу pfSense равен 00:25:90:30:48:72:
  • Detect MAC WAN

Заканчиваем настройку виртуальной машины:

  • На вкладке Hardware нажимаем Add => Network Device
  • Параметры новой сетевой карты: bridge = vmbr1, model = virtio, firewall = off

Теперь запускаем её и инсталлируем pfSense:

  • Открываем noVNC-консоль.
  • Внутри неё нажимаем “Start”.
  • Проходим установку, выбирая на всех шагах ответ по умолчанию.
  • В конце установки разрешаем перезагрузку.
  • После перезагрузки возвращаемся в раздел Hardware и выбираем для CD/DVD либо Remove, либо Edit => Do not use any media.

Настройка pfSense через консоль при первом запуске:

  • VLANs = no
  • WAN = vtnet0
  • LAN = vtnet1 (в результате экран будет выглядеть так)
  • В текстовом меню выбираем “2” (Set interface(s) IP address) и настраиваем LAN-интерфейс:
    • IP-адрес = 10.0.0.1/24
    • DHCP server = yes
    • DHCP range = 10.0.0.130-10.0.0.199
    • revert webConf to HTTP = yes

Теперь мы можем подключиться к Веб-интерфейсу pfSense:

  • Для этого подключаемся к Proxmox по SSH, создавая TCP-туннель к pfSense (здесь и далее считаем 1.2.3.4 публичным адресом сервера):
  • ssh 1.2.3.4 -L 8000:10.0.0.1:80
  • И открываем в Веб-браузере http://127.0.0.1:8000/

Продолжение настройки pfSense через Веб-интерфейс:

  • Мастер настройки состоит из нескольких простых шагов, большинство параметров можно принимать без изменений.
  • Логин/пароль по умолчанию: admin, pfsense
  • DNS: рекомендуем 1.1.1.1 и 77.88.8.8
  • WAN: тип = Static, IP-адрес = 1.2.3.4/24 (как у Proxmox), шлюз = 1.2.3.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

Завершение настройки Proxmox:

  • Останавливаем pfSense:
  • qm shutdown 100
  • Редактируем /etc/pve/qemu-server/100.conf: в свойствх nic0 заменяем "vmbr1" на "vmbr0"
  • Делаем резервную копию /etc/network/interfaces
  • Редактируем /etc/network/interfaces:
    • под «iface имя-физического-WAN-интерфейса ...» добавляем строку с отступом:
    • 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":
  • lsattr    /etc/network/interfaces
    chattr +i /etc/network/interfaces
    lsattr    /etc/network/interfaces
  • Перезагружаем Proxmox...
  • ...запускаем "ping 1.2.3.4" и затаив дыхание ждём несколько минут, пока не пойдут ответы.

В случае успешной перезагрузки:

  • Поскольку теперь вместо Proxmox на IP-адресе 1.2.3.4 нам отвечает pfSense, удаляем запомненный публичный ключ сервера:
  • ssh-keygen -f ~/.ssh/known_hosts -R "1.2.3.4"
  • Подключаемся к pfSense с пробросом портов:
  • ssh admin@1.2.3.4 -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


← Назад в Блог

Подпишитесь на новые статьи: