Proxmox 与 OPNsense 作为 pci-passthrough 设置用作防火墙/路由器/IPsec/PrivateLAN/MultipleExtIPs

Eug*_*yer -1 networking ipsec proxmox opnsense

此设置应基于 proxmox,位于 Proxmox 上托管的 o​​pnsense VM 后面,该 VM 将保护 proxmox,为 VM 提供防火墙、私有 LAN 和 DHCP/DNS,并提供到 LAN 的 IPsec 连接以访问所有 VM /Proxmox 没有经过 NAT。服务器是典型的 Hetzner 服务器,因此仅在 NIC 上,但在此 NIC 上有多个 IP 或/子网。

  1. 带有 1 个 NIC(eth0) 的 Proxmox 服务器
  2. 3 个公共 1IP,IP2/3 在数据中心由 MAC 路由(到 eth0)
  3. eth0 是 PCI-Passthroughed 到 OPNsense KVM
  4. vmbr30 上的私有网络,10.1.7.0/24
  5. IPsec 移动客户端连接 (172.16.0.0/24) 到 LAN

为了更好地概述设置,我创建了这个[绘图][1]:(不确定它是否完美,请告诉我要改进的地方)

问题:

如何使用 PCI-Passthrough 而不是桥接模式来设置这样的场景。

跟进

I) Why i cannot access PROXMOX.2 but access VMEXT.11 (ARP?)

II) 这就是为什么我需要从 * 到 * IPSEC 链式规则来运行 ipsec。这很可能是一个与 opnsense 相关的问题。

III) I tried to handle the 2 additional external IPs by adding virtual ips in OPNsense, adding a 1:1 nat to the internal LAN ip and opening the firewall for the ports needed ( for each private lan IP ) - but yet i could not get it running. The question is, should each private IP have a seperate MAC or not? What is specifically needed to get a multi-ip setup on WAN

Eug*_*yer 5

一般高层次观点

在此处输入图片说明

添加 pci-passthrough

有点超出范围,但你需要的是

  • 到 proxmox 主机的串行控制台/LARA。
  • 从 opnsense(在我的情况下为 vmbr30)到 proxmox private(10.1.7.2)的工作 LAN 连接,反之亦然。当您只有 tty 控制台并且需要重新配置 opnsense 接口以添加em0为新的 WAN 设备时,您将需要它
  • 您可能有一个工作 IPsec 连接之前或打开 WAN ssh/gui 以在直通后进一步配置 opnsense

一般来说,它的本指南- 简而言之

vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"

update-grub

vi /etc/modules
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
Run Code Online (Sandbox Code Playgroud)

然后重新启动并确保您有一个 iommu 表

find /sys/kernel/iommu_groups/ -type l
  /sys/kernel/iommu_groups/0/devices/0000:00:00.0
  /sys/kernel/iommu_groups/1/devices/0000:00:01.0
Run Code Online (Sandbox Code Playgroud)

现在找到你的网卡

lspci -nn
Run Code Online (Sandbox Code Playgroud)

就我而言

00:1f.6 Ethernet controller [0200]: Intel Corporation Ethernet Connection (2) I219-LM [8086:15b7] (rev 31)
Run Code Online (Sandbox Code Playgroud)

执行此命令后,您将 eth0 与 proxmox 分离并失去网络连接。确保你有一个 tty!请用您的 pci 插槽替换"8086 15b7"00:1f.6(见上文)

echo "8086 15b7" > /sys/bus/pci/drivers/pci-stub/new_id && echo 0000:00:1f.6 > /sys/bus/pci/devices/0000:00:1f.6/driver/unbind && echo 0000:00:1f.6 > /sys/bus/pci/drivers/pci-stub/bind
Run Code Online (Sandbox Code Playgroud)

现在编辑您的 VM 并添加 PCI 网卡:

vim /etc/pve/qemu-server/100.conf
Run Code Online (Sandbox Code Playgroud)

并添加(替换 00:1f.6)

machine: q35
hostpci0: 00:1f.6
Run Code Online (Sandbox Code Playgroud)

ssh root@10.1.7.1从您的 tty proxmox 主机启动 opnsense 连接,编辑接口,将 em0 添加为您的 WAN 接口并将其设置为 DHCP - 重新启动您的 opnsense 实例,它应该会再次启动。

将串行控制台添加到您的 opnsense

如果您需要快速灾难恢复或您的 opnsense 实例被破坏,基于 CLI 的串行非常方便,特别是如果您使用 LARA/iLO 进行连接。

做这件事,添加

vim /etc/pve/qemu-server/100.conf
Run Code Online (Sandbox Code Playgroud)

并添加

serial0: socket
Run Code Online (Sandbox Code Playgroud)

现在在您的 opnsense 实例中

vim /conf/config.xml
Run Code Online (Sandbox Code Playgroud)

并添加/更改此

<secondaryconsole>serial</secondaryconsole>
<serialspeed>9600</serialspeed>
Run Code Online (Sandbox Code Playgroud)

确保用 9600 替换当前的串行速度。不要重新启动您的 opnsense 虚拟机,然后

qm terminal 100
Run Code Online (Sandbox Code Playgroud)

再次按 Enter,您应该会看到登录提示

提示:您还可以将主控制台设置为串行,帮助您进入引导提示等并进行调试。

更多关于这个在https://pve.proxmox.com/wiki/Serial_Terminal

Proxmox 上的网络接口

auto vmbr30
iface vmbr30 inet static
    address  10.1.7.2
    address  10.1.7.1
    netmask  255.255.255.0
    bridge_ports none
    bridge_stp off
    bridge_fd 0
    pre-up sleep 2
    metric 1
Run Code Online (Sandbox Code Playgroud)

OPNsense

  1. WAN 是外部 IP1,附加 em0(eth0 pci-passthrough),DHCP
  2. LAN 是 10.1.7.1,连接到 vmbr30

多 IP 设置

然而,我只涵盖了 ExtraIP 部分,而不是额外的子网部分。为了能够使用额外的 IP,您必须为机器人中的每个 IP 禁用单独的 MAC - 因此所有额外的 IP 都具有相同的 MAC ( IP1,IP2,IP3 )

然后,在 OPN 中,对于每个外部 IP,您在 Firewall-VirtualIPs 中添加一个虚拟 IP(对于每个额外的 IP,而不是您绑定到 WAN 的主 IP)。给每个虚拟 IP 一个很好的描述,因为它稍后会出现在选择框中。

现在您可以为每个端口转到防火墙-> NAT-> 转发

  • 目的地:您要转发的 ExtIP (IP2/IP3)
  • 目标端口响了:您要转发的端口,如 ssh
  • 重定向目标 IP:要映射的 LAN VM/IP,例如 10.1.7.52
  • 设置重定向端口,如 ssh

现在你有两个选择,第一个被认为更好,但可能需要更多的维护。

对于您访问 IP2/IP3 服务的每个域,您应该在实际私有 IP 上定义本地 DNS“覆盖”映射。这将确保您可以从内部通信到您的服务,并避免您之前使用 NAT 后会遇到的问题。

否则您需要关心 NAT 反射 - 否则您的 LAN 设备将无法访问外部 IP2/IP3,这至少会导致 Web 应用程序出现问题。执行此设置并激活出站规则和 NAT 反射:

在此处输入图片说明

什么工作:

  • OPN 可以路由 a] 5 ] 5访问互联网并在 WAN 上拥有正确的 IP
  • OPN 可以访问局域网中的任何客户端(VMPRIV.151 和 VMEXT.11 和 PROXMOX.2)
  • 我可以将 IPSec 移动客户端连接到 OPNsense,提供从虚拟 IP 范围 172.16.0.0/24 访问 LAN (10.1.7.0/24)
  • 我可以在连接 IPsec 时访问 10.1.7.1 ( opnsense )
  • 我可以使用 IPsec 客户端访问 VMEXT
  • 我可以将端口或 1:1NAT 从额外的 IP2/IP3 转发到特定的私有 VM

底线

这种设置比我描述桥接模式的替代方案要好得多。不再有异步路由了,在 proxmox 上不需要海岸墙,在 proxmox 上不需要复杂的网桥设置,它的性能要好得多,因为我们可以再次使用校验和卸载。

缺点

灾难恢复

对于灾难恢复,您需要更多的技能和工具。您需要一个 LARA/iPO 串行控制台 proxmox hv(因为您没有互联网连接)并且您需要配置您的 opnsense 实例以允许此处提到的串行控制台,因此您可以在根本没有 VNC 连接的情况下访问 opnsense现在 SSH 连接(甚至来自本地 LAN,因为网络可能会中断)。它工作得相当好,但需要训练一次才能与替代方案一样快

据我所知,此设置无法在集群 proxmox 环境中使用。您可以最初设置一个集群,我是通过使用分离集群网络在 proxmox hv 本地使用 tinc-switch 设置来完成的. 第一个设置很容易,没有中断。第二个加入需要已经进入 LARA/iPO 模式,因为您需要关闭并删除加入的虚拟机(因此网关将关闭)。您可以通过临时使用 eth0 网卡来实现互联网。但是加入后,再次移动您的VM,您将无法启动VM(因此网关将无法启动)。您无法启动 VMS,因为您没有仲裁 - 而且您没有仲裁,因为您没有互联网加入集群。所以最后一个鸡蛋问题我看不到被克服。如果应该处理这个问题,实际上只能通过 KVM 不是 proxmox VM 的一部分,而是独立的 qemu - 我现在不需要。