Вопрос или проблема
Я использую opnSense, межсетевой экран и маршрутизатор на базе FreeBSD, похожий на pfSense, в виртуальной машине под управлением VMware ESXi 7 на Dell PowerEdge R230, в качестве маршрутизатора для моей домашней сети. На хосте не работают и даже не настроены другие виртуальные машины, только эта.
Мой интернет-провайдер использует симметричный гигабитный оптоволоконный канал. Подключение происходит через PPPoE с тегированием VLAN. IP-адрес назначается динамически, хотя неясно, используется ли при этом DHCP. В любом случае мне назначается одиночный IP-адрес, который я не выбираю. У меня нет статических IP-адресов или статического блока, за который провайдер взимает значительную плату. Частые переподключения дают новый IP-адрес, так что я не могу предполагать, что он всегда останется прежним.
Я настроил шлюз для интернет-провайдера в opnSense. opnSense выполняет подключение PPPoE, а для упрощения сам ESXi выполняет тегирование VLAN, так что это прозрачно для нижележащего коммутатора. Топология выглядит следующим образом:
Интернет
↓
Оптоволоконная линия
↓
Оптоволоконный ONT
↓
Ethernet кабель
↓
Физический NIC
↓
Виртуальный коммутатор/группа портов
↓
Виртуальный NIC
↓
opnSense VM
NIC-ы в ESXi выглядят так. Первые два – это встроенные LAN. Последние четыре – это PCI-E карта: Dell Intel I350-T4 Quad Port 1GbE PCI-E карта. Подключение провайдера использует vmnic2
, первый порт на PCI-E карте.
Однако, проблема в том, что я не получаю полную скорость. Это происходит потому, что в FreeBSD есть баг с некоторыми сетевыми картами, где PPPoE не использует все ядра процессора. Виртуальная машина имеет, по моему мнению, избыточные ресурсы: 4 виртуальных ЦП от Xeon E3-1240 v5 (3,5 ГГц) и 8 ГБ оперативной памяти, но, видимо, производительности одного ядра недостаточно для достижения гигабита из-за PPPoE. Когда я провожу тест скорости, использование процессора в машине предсказуемо достигает 25% (одно из четырех ядер), и я получаю только около 600 Мбит/с пиковой загрузки, а по какой-то причине скорость загрузки еще хуже. Когда я использую другое оборудование, например, Ubiquiti UniFi USG-3P или модем/роутер от провайдера, я получаю почти полную скорость в обоих направлениях. Я пробовал менять виртуальную сетевую карту на vmxnet3
и e1000e
, но разницы в производительности не было.
Так как же в этой конфигурации я могу достичь полной скорости при подключении через PPPoE? Я вижу несколько вариантов, но не знаю, какой из них лучший или наиболее вероятный для успеха:
- Использовать какой-то другой сетевой драйвер в opnSense, хотя я понятия не имею, как это сделать или существует ли подходящий драйвер. Это вообще возможно?
- Сделать распаковку PPPoE в виртуальной машине под Linux, в которой нет ошибки PPPoE, а затем опnSense использовать ту виртуальную машину в качестве шлюза, а не провайдер. В этом варианте у меня есть две идеи:
- Использовать виртуальную машину Linux для работы в качестве очень простого маршрутизатора с NAT и рассматривать opnSense как DMZ, так что все перенаправления портов и так далее относятся только к opnSense, и мне не придется делать это в двух местах. Это напрямую подвергает виртуальную машину Linux воздействию интернета без защиты межсетевого экрана opnSense. Это безопасно?
- Использовать виртуальную машину Linux, чтобы только распаковать аспект PPPoE соединения и отправить распакованные Ethernet фреймы прямо к другому интерфейсу; то есть opnSense по-прежнему получает назначенный внешний IP и необходимости в NAT нет. Я видел учебник о том, как это сделать, но не думаю, что это работает в моем случае, потому что у меня нет статического IP или статического блока IP. Это звучит как самый дешевый вариант без нового оборудования или сборов за услуги, если это работает, но действительно ли это хорошая идея и безопасно ли это?
- Использовать аппаратное устройство для выполнения преобразования PPPoE в Ethernet. Модем/роутер, который я получил от провайдера и не использую сейчас, это Zyxel C1100Z. У него есть опция “прозрачного мостирования”, но насколько я могу судить, обработка PPPoE все равно будет происходить на opnSense, что не поможет. Я не использую UniFi USG-3P, потому что у него очень много ошибок с обновлениями программного обеспечения и он не выполняет надежно резервирование WAN.
- Заменить PCI-E сетевую карту на что-то другое или создать прямое подключение физической PCI-E карты к виртуальной машине вместо ее виртуализации. Насколько я понял, карты других производителей, таких как Realtek, еще более ненадежны в opnSense. Есть ли сетевая карта, которая подходит для этого сценария? Будет ли встроенная LAN работать лучше?
- Установить opnSense непосредственно на хост или запустить его напрямую с USB-накопителя, чтобы исключить сторону VMware. Я очень надеюсь, что смогу использовать виртуальную машину для создания снимков и прочих функций для безопасности. Это даст какое-либо улучшение вообще, учитывая, что базовое оборудование не изменится?
- Заменить opnSense на какой-то другой виртуальный апплианс, не основанный на FreeBSD, хотя я пока не нашел что-то столь же простое в использовании или функционально богатое, или они дороги и требуют подписки. Мне нравятся графические интерфейсы больше, чем текстовая конфигурация, и я хочу использовать самосовмещенное программное обеспечение с открытым исходным кодом. Существует ли такой продукт?
Вот несколько предложений:
-
Использовать интерфейс моста от ESXi для вашего WAN интерфейса вместо PCI passthrough
-
Использовать сетевую карту Broadcom или старую сетевую карту Intel с драйвером
em(4)
. Это может звучать странно, но сетевые карты Broadcom могут быть лучше для PPPoE.
Вы пробовали это.
Есть и другой способ. По умолчанию ядро FreeBSD выполняет всю обработку полученного фрейма PPPoE в контексте прерывания драйвера: декапсуляция, опциональная декомпрессия/дешифрация, трансляция сетевых адресов, маршрутизирование, фильтрация пакетов и так далее. Это может привести к перегрузке одного ядра процессора в стандартной конфигурации, когда sysctl net.isr.dispatch=direct. Начиная с FreeBSD 8 у нас есть служба распределения сети netisr(8), позволяющая любому драйверу сетевой карты просто поставить полученный Ethernet фрейм в очередь и завершить его последующую обработку, освобождая это ядро процессора. Другие потоки ядра, использующие другие ядра процессора, затем извлекают полученные фреймы для завершения декапсуляции и так далее, равномерно распределяя нагрузку по всем ядрам процессора.
Таким образом, просто необходимо убедиться, что значения “net.isr.maxthreads” и “net.isr.numthreads” больше 1 и переключить net.isr.dispatch на значение “deferred”, что позволяет драйверам сетевых карт использовать очереди netisr(9) для распределения нагрузки между ядрами процессора
Описание из
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=203856#c11
.
Ответ или решение
Чтобы решить проблему недостаточной пропускной способности PPPoE на OPNsense, работающей на VMware ESXi 7 на сервере Dell PowerEdge R230, следует изучить несколько решений, каждое из которых имеет свои преимущества и недостатки. Вот детальная инструкция для оптимизации производительности сети:
1. Использование сетевого драйвера и конфигурации ESXi
a. Настройка netisr в FreeBSD:
- Измените параметры
net.isr.maxthreads
иnet.isr.numthreads
на значения больше 1, чтобы распределить нагрузку между ядрами ЦП. - Установите параметр
net.isr.dispatch
вdeferred
, что позволит использовать очереди netisr(9) для распределения нагрузки. Это освободит одно ядро процессора и улучшит многопоточный ввод сетевых данных.
b. Рабочий интерфейс через мост ESXi:
- Попробуйте использовать мостовой интерфейс вместо пасскру-прохода PCI для WAN-интерфейса в ESXi. Это может улучшить обработку пакетов и повысить общую производительность.
2. Аппаратные изменения
Замена сетевой карты:
- Рассмотрите возможность использования сетевой карты Broadcom или более старой карты Intel с драйвером
em(4)
. Broadcom NIC иногда показывает лучшие результаты при использовании PPPoE.
3. Оффлоудинг PPPoE с использованием Linux VM
a. Использование Linux VM для NAT:
- Настройте Linux VM, чтобы она функционировала как простой маршрутизатор с NAT, сохраняя OPNsense в качестве DMZ. Это может устранить нагрузку на OPNsense, сохранив максимальную пропускную способность.
b. Оффлоудинг PPPoE с сохранением того же внешнего IP:
- Настройте Linux VM так, чтобы она разворачивала только PPPoE-соединение и передавала кадры Ethernet напрямую в OPNsense, сохраняя внешний IP-адрес без использования NAT.
4. Другие подходы
Установка OPNsense напрямую:
- Испытайте установку OPNsense непосредственно на хосте или на USB-накопителе, чтобы исключить влияние виртуализации VMware.
Поиск альтернативных ПО решений:
- Есть ли другие виртуальные приложения, основанные не на FreeBSD, которые могут обеспечить необходимый функционал, оставаясь при этом открытым исходным кодом и с удобным интерфейсом? Используйте их в качестве альтернативы, если текущие настройки не дают желаемого результата.
Эти шаги могут помочь достичь более оптимальной настройки и обеспечить полную скорость симметричной связи гигабитного интернета, минимизировав нагрузку на центральный процессор и сохраняя стабильность сети.