Появилась необходимость создать запасной канал связи в интернет. Тех работы у оператора длинной в 12 часов совпадают с рабочим временем. Вариантов для частного дома (на территории СНТ) не так что бы много. Самым простым выглядит usb “свисток” от мобильного оператора. Выбор мобильного оператора остается за рамками. Нужно получить доступ в интернет в момент “отвала” основного провайдера.

Исходные данные

Итого имеет такую ситуацию:

  • Proxmox 8.2.2; сервер (внутри кластера, как основа виртуализации);
  • Opnsense 24.1.7; (как фаервол и граничный маршрутизатор);
  • модем Yota. (как источник интернета “по воздуху”).

Выглядит все это так: есть кластер из нескольких (сейчас двух) сервером Proxmox. Внутри него крутиться виртуальная машина с Opnsense, которая играет роль граничного маршрутизатора и фаервола. Модем, активированные и настроенный на стационарном компьютере (Fedora 40).

Попытка один

Изначальная идея была такова: подключить модем в USB порт сервера и пробросить USB в виртуальную машину. Там уже попробовать “решить драйверную проблему”, если она будет и поднимать сеть силами Opnsense.

Тут же выяснилась, что первый раз (после подключения в USB) домем попадает в Opnsense и там начинается “вакханалия” с ошибками. Но далее, Proxmox (видимо именно сам Debian) сам определяет, что в сервер воткнут модем и начинает пробрасывать только USB “хаб”. Толку от которого внутри Opnsense уже нет.

Итак, по порядку. Создаем USB mapping device:

Создаем mapping-device

Пробрасываем его в Opnsense виртуальную машину:

Добавление модема в Opnsense

1
2
3
4
# usbconfig
ugen0.1: <Intel UHCI root HUB> at usbus0, cfg=0 md=HOST spd=FULL (12Mbps) pwr=SAVE (0mA)
ugen0.2: <QEMU QEMU USB Tablet> at usbus0, cfg=0 md=HOST spd=FULL (12Mbps) pwr=ON (100mA)
ugen1.1: <(0x1b36) XHCI root HUB> at usbus1, cfg=0 md=HOST spd=SUPER (5.0Gbps) pwr=SAVE (0mA)

Вот такой список устройств видится изнутри Opnsense:

Список устройств Opnsense без модема

Почему же так

Если выбраться “на уровень выше”, в Proxmox, то можно заметать, что в нем появилось несколько новых устройств. Это виртуальный CD-rom (/dev/sr0), и сетевое устройство (/dev/eth0). Выглядит как буд-то бы Proxmox “успел захватить” часть устройств, которыми представляется флешка. При этом начинаются сыпаться горы ошибок:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
blk_print_req_error: 400 callbacks suppressed
I/O error, dev sr0, sector 10096 op 0x0:(READ) flags 0x80700 phys_seg 1 prio class 0
I/O error, dev sr0, sector 10096 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
buffer_io_error: 382 callbacks suppressed
Buffer I/O error on dev sr0, logical block 2524, async page read
I/O error, dev sr0, sector 10100 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
Buffer I/O error on dev sr0, logical block 2525, async page read
I/O error, dev sr0, sector 0 op 0x0:(READ) flags 0x80700 phys_seg 1 prio class 0
I/O error, dev sr0, sector 0 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
Buffer I/O error on dev sr0, logical block 0, async page read
I/O error, dev sr0, sector 4 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
Buffer I/O error on dev sr0, logical block 1, async page read
I/O error, dev sr0, sector 0 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
Buffer I/O error on dev sr0, logical block 0, async page read
I/O error, dev sr0, sector 4 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
Buffer I/O error on dev sr0, logical block 1, async page read
I/O error, dev sr0, sector 0 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
Buffer I/O error on dev sr0, logical block 0, async page read
I/O error, dev sr0, sector 4 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0
Buffer I/O error on dev sr0, logical block 1, async page read
Buffer I/O error on dev sr0, logical block 0, async page read
Buffer I/O error on dev sr0, logical block 1, async page read

Поток ошибок в Proxmox

Решение

Решением этого служим простая команда:

1
# eject /dev/sr0

После ее выполнения поток ошибок прекращается. Пропадает устройство /dev/sr0 и ошибки в выводе. Но это не решает основную проблему: usb-lan не появляется в Opnsense.

Попытка номер два

Так как сам сетевой интерфейс прокинуть в Opnsense не получается, можно создать бридж на сетевой интерфейс в Proxmox. Потом добавить этот бридж в качестве порта в Opnsense и использовать как DHCP шлюз. Это вариант оказывается проще, так как сетевой интерфейс появляется в Proxmox, и для Opnsense всегда существует виртуальный бридж.

Проблемы с sr0

Так как после подключения (и во время загрузки) происходят постоянные ошибки чтения, весь сервер тормозит. Решить эту проблему сходу не получается, пока-что приходится обходиться простой командой:

1
eject /dev/sr0

На рабочей станции таких “приколов” нет, но найти отличия сходу так же не получилось. Выпиливать драйвер для cd-rom считаю слишком радикальной идеей. Правила дял udev тоже не очень помогли.