Настройка совместной работы 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:
Обратите внимание!
- На этом этапе у моста должен быть пустой IP-адрес шлюза.
- В мост не должен быть подключен ни один физический интерфейс.
Загружаем дистрибутив pfSense на сервер:
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:
Заканчиваем настройку виртуальной машины:
- На вкладке 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:
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