从 OPNsense 路由器卸载 PPPoE

从 OPNsense 路由器卸载 PPPoE

我在跑opnSense,一个基于 FreeBSD 的防火墙和路由器,类似于 pfSense,位于 Dell PowerEdge R230 上的 VMware ESXi 7 下的虚拟机中,作为我的家庭网络的路由器。主机上没有运行或设置其他虚拟机,只有这一个。

我的 ISP 使用对称千兆光纤。您通过带有 VLAN 标记的 PPPoE 连接到它。IP 是动态分配的,虽然不清楚它是否是 DHCP。无论哪种方式,我都会被分配一个不是我选择的 IP。我没有任何静态 IP 或静态块,我的 ISP 对此收取了不小的费用。重新连接通常会给我一个新的 IP,所以我不能假设它会一直保持不变。

我在 opnSense 中为 ISP 设置了一个网关。opnSense 进行 PPPoE 连接,为了简单起见,ESXi 本身进行 VLAN 标记,因此它对底层交换机是透明的。拓扑最终看起来像这样:

       Internet
      Fiber line
       Fiber ONT
    Ethernet cable
     Physical NIC
Virtual switch/port group
      Virtual NIC
      opnSense VM

ESXi 中的网卡如下所示。前两个是板载 LAN。后四个是 PCI-E 卡:戴尔英特尔 I350-T4 四端口 1GbE PCI-E 卡. ISP 的连接正在使用vmnic2PCI-E 卡上的第一个端口。

ESXi 网卡

但,问题是我没有达到最大速度。这是因为FreeBSD 在某些网卡上存在错误,导致 PPPoE 无法使用所有 CPU 核心。VM 分配了我认为过度的东西:4 个来自 Xeon E3-1240 v5 (3.5 GHz) 的 vCPU 和 8 GB RAM,但显然由于 PPPoE,单核性能不够快,无法实现千兆位。当我进行速度测试时,VM 中的 CPU 使用率可预测地上升到 25%(四个核心中的一个),我只能获得大约 600 Mbps 的峰值下载速度,而且由于某种原因,上传速度也比这差得多。当我使用其他硬件时,例如 Ubiquiti UniFi USG-3P 或 ISP 提供的调制解调器/路由器,我几乎可以在两个方向上获得全速。我尝试过让虚拟 NIC 都这样做,vmxnet3e1000e性能没有差异。

因此有了这个设置,如何才能通过 PPPoE 连接获得最高速度?我看到了几种选择,但我不知道哪种是最好的或最有可能成功的:

  • 在 opnSense 中使用其他网络驱动程序,尽管我不知道该怎么做,也不知道是否存在适用的驱动程序。这是否是一个选择?
  • 在没有 PPPoE 错误的 Linux VM 中卸载 PPPoE 解包,然后让 opnSense 将该 VM 用作网关,而不是直接使用 ISP。使用此选项,我可以想到两种方法:
    • 使用 Linux VM 充当具有 NAT 的非常简单的路由器,并将 opnSense 视为 DMZ,因此所有端口转发等仅适用于 opnSense,我不必在两个地方执行这些操作。这确实会直接将 Linux VM 暴露给互联网,而无需 opnSense 防火墙来保护它。这安全吗?
    • 使用 Linux VM 仅解开连接的 PPPoE 方面,并将解开的以太网帧直接发送到另一个接口;即,opnSense 仍然获得分配的外部 IP,并且没有 NAT。我看到一个教程但我不认为它对我的情况有用,因为我没有静态 IP 或静态 IP 块。如果可行的话,这听起来是最便宜的选择,而且不需要新硬件或服务费,但这是个好主意吗?而且安全吗?
  • 使用某种硬件设备进行 PPPoE 到以太网的转换。我的 ISP 提供的调制解调器/路由器(我现在没有使用)是 Zyxel C1100Z。它有一个“透明桥接”选项,但我可以说,在这种情况下,PPPoE 处理仍会在 opnSense 上进行,这没有帮助。我没有使用 UniFi USG-3P,因为它的软件更新非常有缺陷,而且根本不能可靠地进行 WAN 故障转移。
  • 用其他东西替换 PCI-E NIC,或者将物理 PCI-E 卡直通到 VM,而不是对其进行虚拟化。从我目前看到的情况来看,其他供应商的卡(如 Realtek)在 opnSense 中更加不可靠。是否有已知适用于这种情况的 NIC?板载 LAN 会更好吗?
  • 直接在主机上安装 opnSense 或直接从 USB 运行它以消除 VMware 端。我真的希望我可以为快照等进行基于 VM 的设置以确保安全。考虑到底层硬件不会改变,这会有任何改进吗?
  • 用其他不基于 FreeBSD 的虚拟设备替换 opnSense,尽管我还没有找到相对易于使用或功能丰富的产品,或者它们价格昂贵或需要订阅定价。我更喜欢 UI 而不是文本配置,并且想使用开源自托管软件。有这样的产品吗?

答案1

以下是一些建议:

  1. 使用 ESXi 的桥接接口作为 WAN 接口,而不是 PCI 直通

  2. 使用 Broadcom NIC,或者使用em(4)驱动程序的旧 Intel NIC。这听起来可能很奇怪,但 Broadcom NIC 可能更适合 PPPoE。

答案2

你尝试过这个吗?

还有另一种方法。默认情况下,FreeBSD 内核在驱动程序中断上下文中执行接收到的 PPPoE 帧的所有处理:解封装、可选解压缩/解密、网络地址转换、路由查找、数据包过滤等。当 sysctl net.isr.dispatch=direct 时,这可能会导致默认配置中的单个 CPU 核心过载。从 FreeBSD 8 开始,我们拥有 netisr(8) 网络调度服务,允许任何 NIC 驱动程序将接收到的以太网帧入队并停止其后续处理,从而释放此 CPU 核心。然后,使用其他 CPU 核心的其他内核线程将出队接收到的帧以完成解封装等,从而均匀加载所有 CPU 核心。

因此,只需确保“net.isr.maxthreads”和“net.isr.numthreads”大于 1,并将 net.isr.dispatch 切换为“deferred”值,以允许 NIC 驱动程序使用 netisr(9) 队列在 CPU 核心之间分配负载

https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=203856#c11

相关内容