Иногда связь с интернетом критически важна, и даже несколько минут простоя могут дорого стоить, например, в банкоматах, сигнализациях, системах мониторинга и контроля доступа.
В таких системах обычно используется несколько подключений к интернету и автоматическое переключение между разными каналами в случае недоступности основного канала.
Мне надоело самостоятельно изобретать failover на USB модемах, и захотелось делегировать это отдельной умной железке. Я решил сравнить несколько промышленных роутеров, чтобы выяснить, оправдывают ли они свое название, и насколько они лучше моих костылей. В статье будут сравниваться роутеры производителей iRZ, Termit, Robustel.
Основные требования к роутерам:
- 2 SIM-карты и автоматическое переключение между операторами — роутер должен автоматически определять потерю связи на одном операторе и переключаться на резервного. Это особенно важно для подвижных систем, когда покрытие сотовой сети не идеально.
- Подключение по Ethernet — основная система должна видеть только шлюз по умолчанию, и не должна знать о модемной подсистеме на стороне роутера и переключениях каналов, поэтому никаких USB.
- Поддержка современных протоколов VPN: IKEv2 и OpenVPN — для удобства администрирования, и чтобы не зависеть от реальных IP-адресов, роутеры должны уметь VPN. При этом поддерживать не только устаревшие PPTP и L2TP, но и современные протоколы.
- (Опционально) поддержка GPS, наличие GPIO, serial интерфейсов RS-232/485 — эти функции не обязательны для наших задач, но мы рассмотрим их тоже, как бонус, который, возможно, будет кому-то полезен.
Проблема самодельных костылей
Wi-Fi-роутер c двумя USB-модемами (Фото: Дмитрий Бевза dgl.ru)
Failover — аварийное переключение интернет-канала на резервный, в случаях недоступности основного.
Обычно, для резервирования интернет-каналов я использовал бытовой Wi-Fi-роутер с прошивкой OpenWRT, и пакет mwan3. Он позволяет настроить автоматическое резервирование и балансировку между несколькими интернет-каналами, в том числе, между проводным подключением и USB-модемом.
Главный недостаток такого подхода — в разнородном оборудовании и хлипкой конструкции внешних USB-модемов. Мне нравились модемы Huawei E3372h с прошивкой HiLink (эмуляция Ethernet). Эти модемы достаточно стабильные и дешевые, но, при подключении внешних антенн, вся конструкция становится очень хлипкой. Жесткие провода антенны создают рычаг, и модемы банально вылазят из USB-порта, да и сам антенный разъем CRC9 не так надежен, как SMA, потому что не имеет резьбового крепления.
Сборки на внешних USB-модемах очень хрупкие: антенные разъемы не фиксируются, модемы вываливаются из портов
Конструкцию из двух USB-модемов с внешними антеннами приходилось очень жестко фиксировать, но все равно физические повреждения и выпадение из портов были главной проблемой. Такое решение подходит для статического монтажа в труднодоступных местах, но совершенно не подходит для установки в автомобиль или в электрощит на DIN-рейку.
Иногда в роутерах зависала подсистема USB, и модемы становились недоступны. Пришлось писать watchdog-скрипт, который бы отдельно следил за доступностью модемов, помимо mwan3, следящим за доступностью интернета. В какой-то момент мне это надоело, и я стал искать решение в одной коробочке, где все проблемы уже решили за меня.
Сравнительная таблица моделей
Промышленные роутеры дороже бытовых, даже с учетом отдельной покупки модемов. Поэтому главным критерием выбора моделей для обзора была стоимость. Дополнительные функции вроде Wi-Fi, выводов GPIO и системы GPS в нашем случае не нужны, но мы все равно сравним их как опции, влияющие на стоимость.
Модель | 2 SIM | Проводной WAN | Порты LAN | Wi-Fi | GPS | Цена |
---|---|---|---|---|---|---|
Termit CR41P
|
✓ | ✓ | 4 | ✓ | ✓ | ≈13 000 ₽ |
Robustel R2000
|
✓ | ✓ | 2 | X | X | ≈12 000 ₽ |
iRZ RU22W
|
✓ | ✓ | 4 | ✓ | ✓ | ≈15 000 ₽ |
Методика тестирования
Главная задача сравниваемых роутеров — обеспечивать бесперебойный интернет в любых условиях, поэтому мы будем сравнивать, как хорошо роутер переключается на резервный канал в случае проблем на основном. Для этого будем симулировать потерю связи, и замерять на стороне сервера, как быстро роутер смог восстановить связь.
В качестве целевого хоста к каждому тестируемому роутеру будет подключен маленький роутер TP-Link MR3020, который будет выполнять роль компьютера с полезной нагрузкой. На нем будет запущен OpenVPN, подключенный к серверу. На сервере будет запущен мониторинг, следящий за доступностью адреса внутри VPN-тоннеля.
То есть, на стороне сервера будет мониториться один фиксированный IP-адрес, назначенный на mr3020 через VPN-тоннель. Независимо от того, через какой канал идет трафик на роутере, сервер мониторинга будет взаимодействовать с одним адресом. Соответственно, если адрес доступен, это значит, что роутер успешно переключил канал, и в сети за NAT-ом есть интернет.
Чтобы OpenVPN-тоннель восстанавливался максимально быстро, на стороне сервера установим опцию keep-alive на минимальные значения, и отключим шифрование:
cipher none
ping 1
ping-restart 4
Нужно учитывать, что на переподключение VPN уходит время, и в реальности интернет восстанавливается быстрее, чем видно на графиках. Однако такой тест позволяет более честно оценить факт переключения канала, так как показывает, что клиенты за роутером смогли восстановить TCP-подключения и вернуться к штатной работе.
К каждому роутеру подключен TP-Link MR3020, с запущенным VPN-тоннелем. Работающим интернетом считается доступность IP-адреса 10.0.0.1 на стороне сервера
PingPlotter — программа для мониторинга
Программа мониторинга и сервер OpenVPN находятся на одном физическом компьютере с VPN-сервером. Мониторить я буду утилитой MultiPing, с помощью обычных ICMP Echo-запросов. Интервал запросов — 1 секунда — это позволяет видеть на графике даже кратковременную недоступность хоста.
Программа PingPlotter рисует удобные графики пинга, показывая задержку и потери пакетов
Признаюсь, я долго пытался выбрать систему мониторинга. Пробовал zabbix, cacti, скрипты на bash + rrdtool, но все это показалось слишком переусложненным для моих задач. В итоге я нашел прекрасную программу PingPlotter и ее упрощенный вариант без трассировки маршрута — MultiPing. Программа позволяет в реальном времени мониторить группу хостов с разрешением вплоть до 1 секунды, и рисовать подробные графики.
Антенна
Широкополосная антенна Триада MA-2697, подходит для основных диапазонов сотовой связи
Чтобы исключить разное качество приема из-за разных антенн, ко всем роутерам будут подключены одинаковые антенны Триада MA-2697. По заверениям производителя, антенна широкополосная, и работает в диапазонах GSM-9001800 МГц, 3G-2100 МГц, Wi-Fi-2400МГц и 4G WiMAX-2600МГц. Проверять качество антенны я не буду. Даже если она плохая, все роутеры будут работать в одинаковых условиях приёма.
Мобильные операторы
В каждый роутер будут установлены SIM-карты Мегафон и МТС, с обычным тарифом для физических лиц. Мегафон будет выбран основным, МТС резервным. В таком приоритете нет никакой логики, выбор случайный. В месте проведения тестов оба оператора имеют одинаково хорошее покрытие LTE.
Недостатки тестового стенда
Тестовый стенд, развернутый на столе
Так как тестовый стенд находится неподвижно в помещении, качество покрытия сотовой сети не изменяется. В таких условиях невозможно искусственно имитировать плохое покрытие, когда сигнал сотовой сети есть, но потери пакетов слишком большие. По-хорошему, нужно было поместить стенд на поезд или автомобиль, и возить по отдаленным от города местам. Тогда можно было бы сравнивать, насколько хорошо встроенные модемы работают с плохим сигналом.
В нашем случае, мы сможем только воссоздать полную потерю связи на основном канале, и наблюдать, как быстро роутер переключится на резервный.
Termit CR41P
Роутер предоставлен компанией Цифровой Ангел (digitalangel.ru)
SoC: Atheros AR9344 rev. 3
RAM: 128MB
Flash-память: 16MB
Wi-Fi: 802.11n (2.4GHz)
Модем: Quectel EC25-E (LTE Cat 4)
Прошивка: на базе OpenWRT 15.05.1
USB Host
MicroSD
Крепление на DIN-рейку
GPS/GLONASS: активная антенна 3V
Последовательные интерфейсы: RS-232/485
Выводы I/O: 2 цифровых входа (0-3V / 0-30V, гальванически развязанный), 1 аналоговый вход (0-24V), 1 цифровой выход (30V, 250 mA открытый коллектор), 1 выход реле (40V, 4A SPST)
Для установки SIM-карты необходимо раскрутить четыре винта и снять заднюю крышку.
Что ж, это повод рассмотреть внутренности подробнее.
Модемная часть выполнена в виде шилда, который надевается на основную плату.
В углу видно реле для мощной нагрузки, выведенное на пины I/O.
Самый богатый по функциям роутер в обзоре. Имеет проводной WAN, а также позволяет использовать Wi-Fi в режиме станции (клиента), как отдельный WAN. То есть может иметь четыре резервных интернет канала.
Веб-интерфейс сразу выдает LuCI из OpenWRT. Это видно как по дизайну, который не пытались замаскировать, так и по путям в URL. На мой взгляд, это скорее плюс, так как позволяет легко допилить систему под себя. В прошивку добавлены промышленные функции: Modbus, VRRP, MQTT. Через Modbus и MQTT можно управлять базовыми функциями, получать состояние сети, координаты GPS, температуру, переключать профили, перезагружать роутер, управлять пинами I/O.
Мониторинг интернет-каналов сделан через пакет multiwan, который в wiki OpenWRT назван устаревшим. Вместо него рекомендуется mwan3.
Выводы I/O
Управление пинами I/O выполянется через веб-интерфейс, тут же можно посмотреть статус и переименовать каждый пин. Это не заменит полноценный микроконтроллер, но для простой автоматизации может подойти. Например, открыть дверь или поднять шлагбаум по SMS, MQTT или HTTP-запросу, выполнить действие при срабатывании датчика и послать уведомление об этом. Довольно интересная функциональность, которая позволяет обойтись одним устройством.
Интерфейс настройки триггера для аналогового входа. Можно указать диапазон напряжений, в котором сработает триггер, либо настроить на срабатывание при выходе из диапазона
Последовательные интерфейсы RS-232/485
Физически интерфейс RS-232 выполнен в виде разъема DB9 (COM-порта), а RS-485 — в виде съемной клеммной колодки. В веб-интерфейсе можно выбрать четыре режима работы порта:
- Системная консоль — доступ как по SSH
- Serial over IP — проброс последовательного порта через интернет
- Шлюз Modbus — конвертер modbus TCP<->RTU
- NTRIP client — передача данных от GPS
Выбор режима работы serial-портов
GPS
Модуль GPS встроен в чип модема и доступен как USB устройство. Позволяет отслеживать координаты устройства и синхронизировать системные часы по GPS, при этом роутер может быть NTP-сервером и предоставлять точное время для устройств в сети, даже без интернета. Есть функция Geofencing, позволяющая задать географическую зону в качестве триггера, который срабатывает при посещении зоны или ухода из неё. Может быть полезно для роуминга, при покидании домашнего региона. Зону можно определить только одну, и только в радиусе от точки, то есть зона всегда представляет собой круг.
Настройка географической зоны для срабатывания триггера
[ 0.000000] MyLoader: sysp=30fe861a, boardp=21046795, parts=5c8953fe
[ 0.000000] bootconsole [early0] enabled
[ 0.000000] CPU0 revision is: 0001974c (MIPS 74Kc)
[ 0.000000] SoC: Atheros AR9344 rev 3
[ 0.000000] Determined physical RAM map:
[ 0.000000] memory: 08000000 @ 00000000 (usable)
[ 0.000000] Initrd not found or empty — disabling initrd
[ 0.000000] Zone ranges:
[ 0.000000] Normal [mem 0x00000000-0x07ffffff]
[ 0.000000] Movable zone start for each node
[ 0.000000] Early memory node ranges
[ 0.000000] node 0: [mem 0x00000000-0x07ffffff]
[ 0.000000] Initmem setup node 0 [mem 0x00000000-0x07ffffff]
[ 0.000000] On node 0 totalpages: 32768
[ 0.000000] free_area_init_node: node 0, pgdat 803802b0, node_mem_map 81000000
[ 0.000000] Normal zone: 256 pages used for memmap
[ 0.000000] Normal zone: 0 pages reserved
[ 0.000000] Normal zone: 32768 pages, LIFO batch:7
[ 0.000000] Primary instruction cache 64kB, VIPT, 4-way, linesize 32 bytes.
[ 0.000000] Primary data cache 32kB, 4-way, VIPT, cache aliases, linesize 32 bytes
[ 0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
[ 0.000000] pcpu-alloc: [0] 0
[ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 32512
[ 0.000000] Kernel command line: board=TLT-RUT900 console=ttyS0,115200 rootfstype=squashfs,jffs2 noinitrd lpj=1370112 quiet loglevel=3
[ 0.000000] PID hash table entries: 512 (order: -1, 2048 bytes)
[ 0.000000] Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
[ 0.000000] Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
[ 0.000000] Writing ErrCtl register=00000000
[ 0.000000] Readback ErrCtl register=00000000
[ 0.000000] Memory: 125728K/131072K available (2611K kernel code, 155K rwdata, 552K rodata, 256K init, 189K bss, 5344K reserved)
[ 0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[ 0.000000] NR_IRQS:83
[ 0.000000] Clocks: CPU:550.000MHz, DDR:400.000MHz, AHB:200.000MHz, Ref:40.000MHz
[ 0.000000] Calibrating delay loop (skipped) preset value… 274.02 BogoMIPS (lpj=1370112)
[ 0.000000] pid_max: default: 32768 minimum: 301
[ 0.000000] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
[ 0.000000] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
[ 0.000000] NET: Registered protocol family 16
[ 0.000000] MIPS: machine is TELTONIKA TLT-RUT900
[ 0.450000] pca953x 0-0074: interrupt support not compiled in
[ 0.450000] i2c-gpio i2c-gpio.0: using pins 17 (SDA) and 16 (SCL)
[ 0.450000] Switched to clocksource MIPS
[ 0.450000] NET: Registered protocol family 2
[ 0.450000] TCP established hash table entries: 1024 (order: 0, 4096 bytes)
[ 0.450000] TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
[ 0.450000] TCP: Hash tables configured (established 1024 bind 1024)
[ 0.450000] TCP: reno registered
[ 0.450000] UDP hash table entries: 256 (order: 0, 4096 bytes)
[ 0.450000] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[ 0.450000] NET: Registered protocol family 1
[ 0.450000] PCI: CLS 0 bytes, default 32
[ 0.460000] futex hash table entries: 256 (order: -1, 3072 bytes)
[ 0.460000] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[ 0.460000] jffs2: version 2.2 (NAND) (SUMMARY) (LZMA) (RTIME) (CMODE_PRIORITY) © 2001-2006 Red Hat, Inc.
[ 0.460000] msgmni has been set to 245
[ 0.460000] io scheduler noop registered
[ 0.460000] io scheduler deadline registered (default)
[ 0.460000] Serial: 8250/16550 driver, 1 ports, IRQ sharing disabled
[ 0.460000] console [ttyS0] disabled
[ 0.480000] serial8250.0: ttyS0 at MMIO 0x18020000 (irq = 11, base_baud = 2500000) is a 16550A
[ 0.480000] console [ttyS0] enabled
[ 0.480000] bootconsole [early0] disabled
[ 0.480000] ar934x-hs-uart.0: ttyATH0 at MMIO 0x18500000 (irq = 14, base_baud = 2500000) is a AR934X UART
[ 0.500000] m25p80 spi0.0: found gd25q128, expected m25p80
[ 0.500000] m25p80 spi0.0: gd25q128 (16384 Kbytes)
[ 0.500000] 7 teltonika partitions found on MTD device spi0.0
[ 0.500000] Creating 7 MTD partitions on «spi0.0»:
[ 0.500000] 0x000000000000-0x000000020000: «u-boot»
[ 0.500000] 0x000000020000-0x000000030000: «config»
[ 0.500000] 0x000000030000-0x000000040000: «art»
[ 0.500000] 0x000000040000-0x0000001630ac: «kernel»
[ 0.500000] 0x0000001630ac-0x000000f70000: «rootfs»
[ 0.500000] mtd: device 4 (rootfs) set to be root filesystem
[ 0.510000] 1 squashfs-split partitions found on MTD device rootfs
[ 0.510000] 0x000000b30000-0x000000f70000: «rootfs_data»
[ 0.510000] 0x000000040000-0x000000f70000: «firmware»
[ 0.510000] 0x000000f70000-0x000001000000: «event-log»
[ 0.520000] libphy: ag71xx_mdio: probed
[ 1.110000] ag71xx-mdio.1: Found an AR934X built-in switch
[ 1.140000] eth0: Atheros AG71xx at 0xba000000, irq 5, mode:GMII
[ 1.730000] ag71xx ag71xx.0: connected to PHY at ag71xx-mdio.1:04 [uid=004dd042, driver=Generic PHY]
[ 1.730000] eth1: Atheros AG71xx at 0xb9000000, irq 4, mode:MII
[ 1.740000] TCP: cubic registered
[ 1.740000] NET: Registered protocol family 17
[ 1.740000] bridge: automatic filtering via arp/ip/ip6tables has been deprecated. Update your scripts to load br_netfilter if you need this.
[ 1.740000] Bridge firewalling registered
[ 1.740000] 8021q: 802.1Q VLAN Support v1.8
[ 1.750000] VFS: Mounted root (squashfs filesystem) readonly on device 31:4.
[ 1.750000] Freeing unused kernel memory: 256K (803a0000 — 803e0000)
[ 5.030000] usbcore: registered new interface driver usbfs
[ 5.030000] usbcore: registered new interface driver hub
[ 5.030000] usbcore: registered new device driver usb
[ 5.050000] SCSI subsystem initialized
[ 5.050000] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[ 5.050000] ehci-platform: EHCI generic platform driver
[ 5.050000] ehci-platform ehci-platform: EHCI Host Controller
[ 5.050000] ehci-platform ehci-platform: new USB bus registered, assigned bus number 1
[ 5.060000] ehci-platform ehci-platform: TX-TX IDP fix enabled
[ 5.060000] ehci-platform ehci-platform: irq 3, io mem 0x1b000000
[ 5.080000] ehci-platform ehci-platform: USB 2.0 started, EHCI 1.00
[ 5.080000] hub 1-0:1.0: USB hub found
[ 5.080000] hub 1-0:1.0: 1 port detected
[ 5.080000] uhci_hcd: USB Universal Host Controller Interface driver
[ 5.090000] usbcore: registered new interface driver usb-storage
[ 5.400000] usb 1-1: new high-speed USB device number 2 using ehci-platform
[ 5.550000] hub 1-1:1.0: USB hub found
[ 5.550000] hub 1-1:1.0: 3 ports detected
[ 5.830000] usb 1-1.1: new full-speed USB device number 3 using ehci-platform
[ 6.620000] mount_root: loading kmods from internal overlay
[ 7.080000] jffs2: notice: (339) jffs2_build_xattr_subsystem: complete building xattr subsystem, 0 of xdatum (0 unchecked, 0 orphan) and 0 of xref (0 dead, 0 orphan) found.
[ 7.080000] block: attempting to load /tmp/jffs_cfg/upper/etc/config/fstab
[ 7.130000] block: extroot: not configured
[ 7.240000] jffs2: notice: (336) jffs2_build_xattr_subsystem: complete building xattr subsystem, 0 of xdatum (0 unchecked, 0 orphan) and 0 of xref (0 dead, 0 orphan) found.
[ 7.430000] block: attempting to load /tmp/jffs_cfg/upper/etc/config/fstab
[ 7.480000] block: extroot: not configured
[ 7.480000] mount_root: switching to jffs2 overlay
[ 9.980000] random: ubusd urandom read with 18 bits of entropy available
[ 11.260000] NET: Registered protocol family 10
[ 11.410000] ntfs: driver 2.1.31 [Flags: R/O MODULE].
[ 11.430000] Initializing XFRM netlink socket
[ 11.430000] NET: Registered protocol family 15
[ 11.440000] tun: Universal TUN/TAP device driver, 1.6
[ 11.440000] tun: © 1999-2004 Max Krasnyansky <maxk@qualcomm.com>
[ 11.500000] l2tp_core: L2TP core driver, V2.0
[ 11.500000] l2tp_netlink: L2TP netlink interface
[ 11.510000] gre: GRE over IPv4 demultiplexor driver
[ 11.510000] ip_gre: GRE over IPv4 tunneling driver
[ 11.540000] ip6_tables: © 2000-2006 Netfilter Core Team
[ 11.580000] nf_conntrack version 0.5.0 (1968 buckets, 7872 max)
[ 12.110000] lp: driver loaded but no devices found
[ 12.130000] ppdev: user-space parallel port driver
[ 12.290000] u32 classifier
[ 12.290000] input device check on
[ 12.290000] Actions configured
[ 12.330000] Mirror/redirect action on
[ 12.460000] cdc_acm 1-1.1:1.0: This device cannot do calls on its own. It is not a modem.
[ 12.460000] cdc_acm 1-1.1:1.0: ttyACM0: USB ACM device
[ 12.460000] usbcore: registered new interface driver cdc_acm
[ 12.460000] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
[ 12.470000] usbcore: registered new interface driver cdc_wdm
[ 12.500000] Loading modules backported from Linux version v4.4-rc5-1913-gc8fdf68
[ 12.500000] Backport generated by backports.git backports-20151218-0-g2f58d9d
[ 12.690000] Ebtables v2.0 registered
[ 12.730000] ip_tables: © 2000-2006 Netfilter Core Team
[ 12.820000] Netfilter messages via NETLINK v0.30.
[ 12.850000] usbcore: registered new interface driver usblp
[ 12.890000] usbcore: registered new interface driver usbserial
[ 12.890000] usbcore: registered new interface driver usbserial_generic
[ 12.890000] usbserial: USB Serial support registered for generic
[ 12.960000] xt_coova: ready
[ 13.050000] xt_time: kernel timezone is -0000
[ 13.050000] usbcore: registered new interface driver ark3116
[ 13.050000] usbserial: USB Serial support registered for ark3116
[ 13.060000] usbcore: registered new interface driver belkin_sa
[ 13.060000] usbserial: USB Serial support registered for Belkin / Peracom / GoHubs USB Serial Adapter
[ 13.090000] usbcore: registered new interface driver cdc_ether
[ 13.170000] usbcore: registered new interface driver cdc_ncm
[ 13.860000] usbcore: registered new interface driver ch341
[ 13.860000] usbserial: USB Serial support registered for ch341-uart
[ 13.860000] usbcore: registered new interface driver cp210x
[ 13.860000] usbserial: USB Serial support registered for cp210x
[ 13.860000] usbcore: registered new interface driver cypress_m8
[ 13.860000] usbserial: USB Serial support registered for DeLorme Earthmate USB
[ 13.860000] usbserial: USB Serial support registered for HID->COM RS232 Adapter
[ 13.860000] usbserial: USB Serial support registered for Nokia CA-42 V2 Adapter
[ 13.880000] usbcore: registered new interface driver ftdi_sio
[ 13.880000] usbserial: USB Serial support registered for FTDI USB Serial Device
[ 13.880000] usbcore: registered new interface driver huawei_cdc_ncm
[ 13.900000] usbcore: registered new interface driver keyspan
[ 13.900000] usbserial: USB Serial support registered for Keyspan — (without firmware)
[ 13.900000] usbserial: USB Serial support registered for Keyspan 1 port adapter
[ 13.900000] usbserial: USB Serial support registered for Keyspan 2 port adapter
[ 13.900000] usbserial: USB Serial support registered for Keyspan 4 port adapter
[ 13.990000] ctnetlink v0.93: registering with nfnetlink.
[ 14.020000] usbcore: registered new interface driver pl2303
[ 14.020000] usbserial: USB Serial support registered for pl2303
[ 14.030000] PPP generic driver version 2.4.2
[ 14.040000] PPP MPPE Compression module registered
[ 14.040000] NET: Registered protocol family 24
[ 14.040000] PPTP driver version 0.8.5
[ 14.050000] usbcore: registered new interface driver qmi_wwan
[ 14.140000] l2tp_ppp: PPPoL2TP kernel driver, V2.0
[ 14.140000] usbcore: registered new interface driver option
[ 14.140000] usbserial: USB Serial support registered for GSM modem (1-port)
[ 14.160000] usbcore: registered new interface driver qcserial
[ 14.160000] usbserial: USB Serial support registered for Qualcomm USB modem
[ 14.200000] ath: EEPROM regdomain: 0x0
[ 14.200000] ath: EEPROM indicates default country code should be used
[ 14.200000] ath: doing EEPROM country->regdmn map search
[ 14.200000] ath: country maps to regdmn code: 0x3a
[ 14.200000] ath: Country alpha2 being used: US
[ 14.200000] ath: Regpair used: 0x3a
[ 14.210000] ieee80211 phy0: Selected rate control algorithm 'minstrel_ht'
[ 14.210000] ieee80211 phy0: Atheros AR9340 Rev:3 mem=0xb8100000, irq=47
[ 14.280000] mmc_spi spi0.1: ASSUMING 3.2-3.4 V slot power
[ 17.330000] mmc_spi spi0.1: SD/MMC host mmc0, no DMA, no WP, no poweroff
[ 17.330000] mmc_spi spi0.1: no support for card's volts
[ 17.330000] mmc0: error -22 whilst initialising SDIO card
[ 17.330000] mmc_spi spi0.1: no support for card's volts
[ 17.330000] mmc0: error -22 whilst initialising SD card
[ 17.340000] mmc_spi spi0.1: no support for card's volts
[ 17.340000] mmc0: error -22 whilst initialising MMC card
[ 20.700000] usb 1-1.3: new high-speed USB device number 4 using ehci-platform
[ 20.920000] option 1-1.3:1.0: GSM modem (1-port) converter detected
[ 20.920000] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB0
[ 20.930000] option 1-1.3:1.1: GSM modem (1-port) converter detected
[ 20.940000] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB1
[ 20.950000] option 1-1.3:1.2: GSM modem (1-port) converter detected
[ 20.950000] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB2
[ 20.960000] option 1-1.3:1.3: GSM modem (1-port) converter detected
[ 20.970000] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB3
[ 21.000000] qmi_wwan 1-1.3:1.4: cdc-wdm0: USB WDM device
[ 21.000000] qmi_wwan 1-1.3:1.4: Quectel EC21&EC25&EC20 R2.0 work on RawIP mode
[ 21.010000] qmi_wwan 1-1.3:1.4 wwan0: register 'qmi_wwan' at usb-ehci-platform-1.3, WWAN/QMI device, 3a:a9:1d:1a:9e:d9
[ 25.600000] jffs2: notice: (1621) jffs2_build_xattr_subsystem: complete building xattr subsystem, 0 of xdatum (0 unchecked, 0 orphan) and 0 of xref (0 dead, 0 orphan) found.
[ 28.880000] device eth0 entered promiscuous mode
[ 28.890000] br-lan: port 1(eth0) entered forwarding state
[ 28.890000] br-lan: port 1(eth0) entered forwarding state
[ 30.010000] br-lan: port 1(eth0) entered disabled state
[ 34.410000] device wlan0 entered promiscuous mode
[ 34.420000] br-lan: port 2(wlan0) entered forwarding state
[ 34.420000] br-lan: port 2(wlan0) entered forwarding state
[ 34.460000] br-lan: port 2(wlan0) entered disabled state
[ 41.530000] br-lan: port 2(wlan0) entered forwarding state
[ 41.530000] br-lan: port 2(wlan0) entered forwarding state
[ 43.530000] br-lan: port 2(wlan0) entered forwarding state
[ 51.350000] Ports leds ON
[ 54.390000] random: nonblocking pool is initialized
Настройка WAN
Интерфейс настройки приоритетов интернет-каналов. Можно выбрать один основной и два резервных. В нашем случае, модем выбран основным, а проводной WAN резервным.
Настройка приоритетов интернет-каналов. Можно выбрать основной и резервные
Нужно иметь в виду, что модем (радиомодуль) в роутере один, и только одна SIM-карта может быть одномоментно в сети. Система мониторинга проверяет доступность интернета в каждом канале с помощью ping-запросов на заданный хост. При этом нельзя проверить, на какой из двух SIM-карт есть интернет, можно только переключить на другой канал: проводной или Wi-Fi. Условия переключения SIM-карт настраиваются отдельно, и не зависят от общего мониторинга.
Настройка мониторинга доступности интернет-канала. Можно указать хост, который будет проверяться, интервалы проверок и число попыток
Так как мониторинг доступности (пакет multiwan из openwrt) воспринимает модем как один интерфейс, он не может инициировать переключение SIM-карты в случае недоступности интернета на модеме. Пакет multiwan может только переключать основной сетевой интерфейс. Условия переключения SIM-карты настраиваются отдельно, и среди условий можно выбрать только следующее: слабый сигнал, лимит трафика, роуминг, нет сети, отсутствует подключение PPP. То есть, в некоторых случаях, модем может не переключить SIM-карту, даже если на ней нет интернета. Например, если у оператора сбой в сети, при этом на модеме есть IP-адрес, или если оператор заблокировал доступ в сеть за неуплату, и редиректит запрос на заглушку с интерфейсом оплаты. В таком случае, ни одно условие переключения SIM-карты не будет выполнено, так как формально связь с оператором есть.
Настройка условий переключения между SIM-картами не работает в связке с мониторингом доступности интернета
Симуляция аварии
Нам не удалось придумать способ программно симулировать условия для переключения SIM-карты на резервную в этом роутере, поэтому мы будем проверять переключение на резервный проводной канал. Для этого отключим антенны от роутера и посмотрим на график. Время переключения составляет в среднем 12-15 секунд, с учетом восстановления VPN-подключения. Можно сократить это время, уменьшив интервал проверок и число потерянных пакетов для срабатывания переключения, но слишком агрессивные настройки мониторинга будут часто вызывать ложные срабатывания, когда связь пропала всего на пару секунд.
Время переключения на резервный канал составляет около 15 секунд
Вывод
Роутер с большим количеством дополнительных функций. Интересно выполнена работа с модулем I/O: есть аналоговые и цифровые выводы, силовое реле. Можно управлять выводами удаленно и настроить триггеры. Это позволяет на одном лишь роутере построить простую автоматизацию с внешней периферией. Например, управлять теплицей или обогревом помещения.
Плюсы
- Много дополнительных функций
- Открытая платформа OpenWRT
- Поддержка LTE Cat 4
- Три типа WAN: модем, Ethernet, WiFi
Минусы
- Нельзя указать разные адреса мониторинга для каждой SIM-карты
- Условия переключения на резервную SIM-карту вынесены отдельно от мониторинга доступности интернета
Robustel R2000
Роутер предоставлен компанией Евромобайл (euromobile.ru)
SoC: Atheros 533MHz
RAM: 64MB
Flash память: 16MB
Модем: Huawei ME909s-120 (LTE Cat 4)
Прошивка: закрытая, на основе Linux
Роутер с двумя Ethernet-портами и минимумом функций. Только один из LAN-портов может выполнять роль WAN. Прошивка закрытая, root доступа по SSH нет. Консоль ограничена своим интерпретатором с несколькими командами (подобно устройствам Ubiquiti).
VPN
Прошивка поддерживает протоколы OpenVPN и IPsec IKEv2.
Интерфейс настройки IPsec-тоннеля
Интерфейс настройки OpenVPN-тоннеля
Логирование
Есть поддержка удаленного логирования через syslog
Можно установить триггеры на системные события и посылать уведомления по email и SMS
User LED
Индикацию на передней панели можно настроить на разные события. Например, показывать подключен VPN или нет.
Настройка WAN
Есть несколько режимов резервирования и балансировки. Второй вариант может быть полезен для быстрого переключения между каналами.
- Cold backup: активен только основной канал, резервные каналы отключаются
- Warm backup: резервные каналы активны, используется только основной (невозможно активировать две SIM одновременно)
- Load balancing: Используются оба канала одновременно
В настройках по-умолчанию почему-то отключено возвращение на основной канал после переключения на резервный. Это задается в Revert Interval, при установке в ноль, канал никогда не переключится назад после перехода на резервный.
Настройка приоритетов и режимов WAN
Каждая SIM-карта настраивается как отдельный интерфейс: WWAN1 и WWAN2. Для каждого интерфейса можно отдельно настроить адрес для проверки доступности интернета, и свои интервалы. Это единственный роутер в обзоре, где можно указать сразу два хоста для проверки. Это полезно для защиты от ложных срабатываний, когда проверочный хост упал, но интернет при этом есть.
Каждой SIM-карте можно установить свои настройки для проверки доступности интернета
Прошивка роутера не предполагает root-доступа к системе, поэтому без вскрытия корпуса мне не удалось выяснить, на каком чипсете сделано устройство. Соответственно никакие самодельные скрипты и пакеты на роутер установить не получится, вся функциональность строго ограничена возможностями родной прошивки. Есть возможность установить несколько дополнительных пакетов из родного репозитория robustel.com/products/app-center/, но это не сравнится с набором пакетов из репозитория OpenWRT.
С другой стороны, такая закрытость системы может быть полезна для защиты от неконтролируемых изменений прошивки, которые потом нельзя увидеть в веб-интерфейсе.
Симуляция аварии
Так как мы можем указать разные хосты для проверки доступности каждой SIM-карте, для симуляции аварии мы укажем первой SIM-карте наш подконтрольный сервер, и в какой-то момент отключим его. Для чистоты эксперимента установим интервалы проверки такими же, как у первого роутера в обзоре.
Переключение на вторую SIM-карту занимает 15-30 секунд
В среднем роутер переключается на вторую SIM-карту за 15-30 секунд. Полагаю, что больше всего времени занимает регистрация в сети второго оператора. Так как во всех наших роутерах используется один модем, одномоментно в сети может находится только одна SIM-карта. Существуют промышленные роутеры с двумя независимыми модемами, которые одновременно подключены к двум мобильным операторам. В таком случае переключение канала происходит быстрее.
Вывод
Компактный и простой роутер с минимумом функций, простой в настройке. Закрытая платформа и отсутсвие root-доступа может кому-то помешать. Можно рекомендовать для случаев, когда простота настройки важнее.
Плюсы
- Отдельные настройки failover для каждой SIM-карты
- Поддержка LTE Cat 4
- Режим «Warm backup», в котором резервный канал не отключается
- Простота настройки
Минусы
- Закрытая платформа, нет root-доступа
- Урезанная SSH-консоль
- Только один Ethernet-порт может работать как WAN
iRZ RU22W
Роутер предоставлен компанией Цифровой Ангел (digitalangel.ru)
SoC: MediaTek MT7620A ver:2 eco:6
RAM: 64
Flash память: 16
Wi-Fi: 802.11n (2.4GHz)
Модем: Huawei MU709s-2
Поддержка карт MicroSD
GPS
Прошивка: на базе OpenWRT 15.05
Роутер без поддержки LTE, поддерживаются только 3G-стандарты HSPA+/UMTS (900/2100 MHz) и 2G GSM/GPRS (850/900/1800/1900 MHz), при этом самый дорогой. Есть поддержка GPS, Wi-Fi и последовательных интерфейсов. По-умолчанию все Ethernet-порты объединены в один коммутатор, при желании каждый порт можно выделить в отдельный VLAN и использовать его как WAN. Wi-Fi может работать в режиме станции (клиента), и также быть WAN. Суммарно, с двумя SIM-картами это позволяет получить 7 WAN-интерфейсов. Неплохо.
Веб-интерфейс
Главная страница, доступная без авторизации, показывает состояние интерфейсов, таблицу маршрутизации, IMEI, и много другой информации.
Wi-Fi-интерфейс может работать в режиме точки доступа (AP) или клиента (Station). Сканирования сетей нет, нужно явно указывать SSID вручную.
VPN
OpenVPN поддерживается полностью, а вот IPSec — нет. Есть только Cisco IPSec, при этом нет IKEv2.
Интерфейс настройки Cisco IPSec не поддерживает протокол IKEv2
Есть поддержка Ethernet over IP
RS-232/485
Последовательные интерфейсы можно настроить только в режиме serial over ip и конвертера modbus TCP<->RTU. Режим AT-модема через последовательный порт недоступен.
GPIO
Работа c GPIO сделана странно. Можно только переключать состояния из веб-интерфейса, при этом нельзя создать триггеры, вызываемые по изменению состояния. Возможно, есть какое-то API, реализованное через фирменный софт, не знаю. Нельзя даже переименовать нужные пины. Пользы от такого управления не вижу.
Настройка WAN
Приоритеты интерфейсов выбираются в меню Routes. Можно выбрать один из двух режимов: failover и балансировка. Первый переключит канал на резервный интерфейс в случае недоступности основного, а второй распределит трафик поровну между интерфейсами, на уровне NAT.
Мониторинг доступности и аварийное переключение интерфейсов сделано с помощью самодельных bash-скриптов компании iRZ. Например, сервис /usr/bin/pinger посылает пинги, переключает интерфейсы и управляет светодиодами. Довольно суровый башизм :)
Настройка SIM-карт
Для каждой SIM-карты можно установить свой хост проверки связи. Это удобно для случаев, когда мы хотим выбрать разные сервера, в зависимости от оператора связи. Например, в роуминге мы используем один сервер, а в домашнем регионе другой.
Можно установить разные хосты, до которых будет проверяться связь, для каждой SIM-карты
GPS
Я не нашел возможности как-либо задействовать GPS-модуль, кроме как через gpsctl из консоли. В веб-интерфейсе вообще нет его упоминания. Полагаю, что он задействуется через родные облачные сервисы для централизованного управления роутерами. Невозможность использовать API GPS самостоятельно считаю недостатком.
Симуляция аварии
Мы указали для каждой SIM-карты разные хосты проверки доступности интернета, поэтому можем легко симулировать аварию. Для этого мы заблокируем на фаерволле хост от первой SIM-карты и посмотрим, как роутер отреагирует на это. Для чистоты эксперимента мы установим такие же интервалы проверки и число попыток, как и у первого роутера.
Из нескольких попыток среднее время переключения составляет 30 секунд, иногда вторая SIM-карта долго регистрируется, и переключение растягивается на минуту. Не уверен, связано ли это с модемом или с особенностями мобильного оператора.
Вывод
Понравилась возможность получить целых 4 проводных WAN и отдельные настройки failover для каждой SIM-карты. Осталось непонятным назначение GPS-модуля, воспользоваться им без стороннего софта не получилось.
Плюсы
- Открытая платформа на базе OpenWRT
- Отдельные настройки failover для каждой SIM-карты
- Все LAN-порты могут работать как WAN
Минусы
- Нет поддержки IPsec IKEv2
- Непонятно, как пользоваться GPS и выводами GPIO без стороннего софта
Заключение
На мой взгляд, специализированные промышленные решения намного удобнее самодельных конструкций на базе SOHO-роутера. Хотя в большинстве случаев используется та же прошивка OpenWRT, все нюансы уже учтены, настройка сводится к установке нескольких параметров в веб-интерфейсе, и не нужно самому писать костыли типа watchdog-скриптов, все уже есть из коробки.
Дополнительные функции вроде GPIO и модуля GPS позволяют, во многих случаях, обойтись одним устройством вместо двух, для простых задач автоматизации и сбора данных.
У всех трех производителей есть свой софт для централизованного управления роутерами. В рамках этой статьи мы его не рассматривали. Он полезен для большого числа установок, и позволяет управлять всеми роутерами из одной контрольной панели. Возможно, стоит изучить этот софт тоже.
Автор: zhovner