Protectli VP2420 + Quectel RM520N-GL + MediaTek MT7921 + OpenWRT
A complete walkthrough of hardware selection, why we ditched OPNsense, getting 5G working via QMI, WiFi 6 in AP mode, and dual-WAN failover with mwan3.

Why Build Your Own Router?
Consumer routers are a compromise. They're designed to be sold, not engineered to perform. Cheap plastic, locked firmware, mediocre drivers, and security patches that arrive six months late -- if at all.
When you're working remotely, routing traffic through a VPN, running a homelab, or travelling internationally with a SIM card, you need hardware you can actually trust and fully control.
This build was born from a specific problem: a travel router that could accept a local SIM card, broadcast WiFi, handle dual-WAN failover, and still be light enough to throw in a bag. The answer wasn't a consumer router. It was a small-form-factor x86 box running proper open-source firmware.
This guide follows the exact path from unboxing a Protectli VP2420 to a fully operational dual-WAN 5G + WiFi 6 router. Every gotcha, dead-end, and working config is documented here.
The Hardware Stack
Everything in this build was chosen deliberately. Here's what we're working with and why.
| Component | Choice | Details |
|---|---|---|
| Base Unit | Protectli VP2420 | Intel Elkhart Lake J6412, 4x 2.5GbE, fanless |
| 5G Modem (M.2 B-Key) | Quectel RM520N-GL | 5G Sub-6, global bands, QMI/MBIM |
| WiFi Card (M.2 E-Key) | MediaTek MT7921 | WiFi 6, 2.4 + 5GHz, full AP mode on OpenWRT |
| Operating System | OpenWRT | Linux-based, opkg packages, native QMI |
| Primary WAN | Rakuten Mobile | 5G/LTE, Band 3 + n77, APN: rakuten.jp |
| Secondary WAN | Ethernet (ISP/Tether) | mwan3 failover + load balancing |
Why the VP2420?
The VP2420 ships with four Intel I225-V 2.5GbE NICs, fanless passive cooling, and -- crucially -- two separate M.2 slots: one B-Key for LTE/5G modems and one E-Key (2230) for WiFi. Both can coexist, no tradeoffs.
The Elkhart Lake J6412 is no powerhouse, but for routing, NAT, and firewall duty it's more than sufficient. AES-NI hardware acceleration handles VPN tunnels without breaking a sweat.
Why the Quectel RM520N-GL?
The RM520N-GL is a global 5G module covering Band 3 and n77 (Rakuten Japan), AT&T/T-Mobile bands (North America), and Telstra bands (Australia). If you move between countries, this is the modem that doesn't force you to choose a region.
More importantly: it communicates via QMI protocol, which OpenWRT supports natively. This is the key distinction that makes the rest of this guide work.
Why the MT7921 over Intel AX200/AX210?
Intel WiFi cards look attractive on paper -- WiFi 6E, widely available, cheap. The problem is their Linux driver (iwlwifi) has severe limitations in Access Point mode. It's designed for client devices (laptops), not APs. On OpenWRT, Intel cards effectively cap out at 2.4GHz in AP mode and often behave unreliably with multiple clients.
The MediaTek MT7921 uses the open-source mt76 driver with first-class OpenWRT support and full AP mode on both 2.4GHz and 5GHz. It's the correct choice for this use case.
The OPNsense Problem
The original plan was to run OPNsense -- it's polished, well-documented, and familiar to anyone coming from pfSense. But when we tried to connect the Quectel RM520N-GL, we hit a wall that turned out to be fundamental rather than configurable.
OPNsense and pfSense do not support QMI or MBIM protocols. Both rely exclusively on PPP for cellular modem communication -- an older, slower serial protocol. Since OPNsense 24.7, even PPP with internal LTE modems has been broken for many users, with debug errors like
label not foundin the MPD daemon.
The real-world performance difference is severe:
| OS | Protocol | Download | Upload | Status | |---|---|---|---|---| | OPNsense | PPP (only option) | ~9-21 Mbps | ~8-12 Mbps | Broken in 24.7+ | | OpenWRT | QMI (native) | ~80-100 Mbps | ~30-50 Mbps | Works perfectly |
The verdict is clear. OPNsense is a fine firewall OS when you're using Ethernet WAN. For embedded cellular modems, it's the wrong tool. OpenWRT was designed with this use case in mind from the start.
Installing OpenWRT on the VP2420
The VP2420 is an x86_64 machine, so you'll use the generic x86 OpenWRT image -- not a device-specific build.
Download the image
Get the latest stable x86/64 combined image from downloads.openwrt.org. Look for:
openwrt-x86-64-generic-ext4-combined-efi.img.gz
The EFI variant works reliably with the VP2420's BIOS.
Flash and install
- Decompress the image:
gunzip openwrt-*.img.gz
- Flash to a USB drive:
dd if=openwrt-*.img of=/dev/sdX bs=4M status=progress
-
Boot the VP2420 from USB (press F11 at POST for the boot menu)
-
Once booted, identify your internal SSD:
lsblk
- Flash to internal storage:
dd if=openwrt-*.img of=/dev/sda bs=4M
- Reboot and remove the USB drive.
By default, OpenWRT only creates a small root partition. After first boot, expand it with
partedandresize2fsto use your full SSD. You'll need the space for packages.
First boot access
Connect your laptop directly to port 1 (eth0) with an Ethernet cable. OpenWRT's default LAN IP is 192.168.1.1.
ssh [email protected]
No password is set initially -- set one immediately:
passwd
opkg update
Configuring the Quectel Modem via QMI
With the RM520N-GL installed in the B-Key M.2 slot, OpenWRT should enumerate the device automatically. Verify it's present:
lsusb | grep -i quectel
# Expected: Quectel Wireless Solutions Co., Ltd.
ls /dev/cdc-wdm*
# Expected: /dev/cdc-wdm0
Install QMI tools
opkg update
opkg install kmod-usb-net-qmi-wwan uqmi luci-proto-qmi
Verify the connection manually first
# Start the data connection
uqmi -d /dev/cdc-wdm0 --start-network --apn rakuten.jp --keep-client-id wds
# Confirm connected
uqmi -d /dev/cdc-wdm0 --get-data-status
# Expected: "connected"
# Bring up the interface and get an IP
ip link set wwan0 up
udhcpc -i wwan0
# Test connectivity
ping -I wwan0 8.8.8.8
Seeing
"disconnected"from--get-data-status? Run--start-networkfirst. The modem won't auto-connect until the interface is formally requested.
Persistent config via UCI
Once confirmed working, set it up permanently:
uci set network.wwan=interface
uci set network.wwan.proto='qmi'
uci set network.wwan.device='/dev/cdc-wdm0'
uci set network.wwan.apn='rakuten.jp'
uci set network.wwan.pdptype='ipv4v6'
uci set network.wwan.auth='none'
uci commit network
# Add to WAN firewall zone
uci add_list firewall.@zone[1].network='wwan'
uci commit firewall
/etc/init.d/network restart
Check signal quality
uqmi -d /dev/cdc-wdm0 --get-signal-info
Good signal targets: RSSI above -70 dBm, RSRP above -90 dBm, SNR above 15 dB.
APN reference by carrier
| Carrier | APN | Auth |
|---|---|---|
| Rakuten Mobile (JP) | rakuten.jp | None |
| IIJmio (JP) | iijmio.jp | CHAP |
| T-Mobile (US) | fast.t-mobile.com | None |
| Telstra (AU) | telstra.internet | None |
Adding WiFi 6 with the MT7921
The MT7921 fits the VP2420's M.2 2230 E-Key slot. You'll also need two antenna cables (IPEX/MHF4) routed to the pre-drilled antenna holes on the VP2420 chassis -- Protectli includes these holes specifically for this purpose.
Install the driver and hostapd
opkg update
opkg remove wpad-basic-wolfssl # remove the limited default
opkg install kmod-mt7921e wpad-openssl
reboot
After reboot, verify the card is detected:
dmesg | grep mt7921
iw dev
The interface creation quirk
On some OpenWRT builds with the MT7921, the phy0-ap0 virtual interface expected by hostapd doesn't get created automatically. Confirm this is your issue:
hostapd -dd /var/run/hostapd-phy0.conf 2>&1 | head -20
# If you see: "Could not read interface phy0-ap0: No such device"
# -> proceed with the fix below
Create the interface manually and test:
iw phy phy0 interface add wlan0 type __ap
ip link set wlan0 up
# Update the hostapd config to use wlan0 instead
sed -i 's/phy0-ap0/wlan0/' /var/run/hostapd-phy0.conf
# Run hostapd -- should show AP-ENABLED
hostapd -dd /var/run/hostapd-phy0.conf 2>&1 | grep -E "ENABLED|ERROR"
To make it persistent across reboots:
cat << 'EOF' > /etc/rc.local
# Create wireless interface for MT7921
iw phy phy0 interface add wlan0 type __ap
ip link set wlan0 up
exit 0
EOF
Configure the wireless network via LuCI
Navigate to Network > Wireless in LuCI. Click Add on your radio and configure:
- Mode: Access Point
- SSID: your network name
- Band: 5GHz (802.11ax / WiFi 6)
- Channel: 36 or auto
- Width: 80MHz
- Security: WPA2/WPA3 Mixed + strong passphrase
- Network: Assign to
lan
Channel 36 at 80MHz width gives the best balance of speed and interference avoidance in dense urban environments. The MT7921 supports 2.4GHz and 5GHz in AP mode -- 6GHz is not available in AP mode on this card.
Dual WAN with mwan3
With the cellular modem as primary WAN and an Ethernet connection as WAN2, you can configure intelligent traffic routing. mwan3 handles health checking, failover, and load balancing between both connections.
Install mwan3
opkg install mwan3 luci-app-mwan3
/etc/init.d/mwan3 enable
Full mwan3 config
Edit /etc/config/mwan3:
config globals 'globals'
option mmx_mask '0x3F00'
config interface 'wwan'
option enabled '1'
option family 'ipv4'
list track_ip '8.8.8.8'
list track_ip '1.1.1.1'
option track_method 'ping'
option reliability '1'
option count '3'
option timeout '2'
option interval '5'
option down '3'
option up '3'
config interface 'wan2'
option enabled '1'
option family 'ipv4'
list track_ip '8.8.8.8'
option track_method 'ping'
option reliability '1'
option count '3'
option timeout '2'
option interval '5'
option down '3'
option up '3'
config member 'cellular_primary'
option interface 'wwan'
option metric '1'
option weight '2'
config member 'ethernet_primary'
option interface 'wan2'
option metric '1'
option weight '3'
config policy 'balanced'
list use_member 'cellular_primary'
list use_member 'ethernet_primary'
config policy 'cellular_only'
list use_member 'cellular_primary'
config rule 'default_rule'
option dest_ip '0.0.0.0/0'
option use_policy 'balanced'
option proto 'all'
config rule 'ipv6_default'
option family 'ipv6'
option proto 'all'
option use_policy 'cellular_only'
Apply and verify:
/etc/init.d/mwan3 restart
mwan3 status
All IPv6 traffic is routed through the cellular interface -- Rakuten provides native IPv6 (
240b::prefix) while most secondary connections are IPv4-only via CGNAT.
Fix LAN connectivity after enabling mwan3
If clients lose internet access after enabling mwan3, the WAN interfaces likely aren't in the firewall's wan zone:
uci add_list firewall.@zone[1].network='wwan'
uci add_list firewall.@zone[1].network='wan2'
uci commit firewall
/etc/init.d/firewall restart
DNS and Cloudflare Setup
OpenWRT uses dnsmasq as its local DNS resolver. By default it forwards queries to whatever the WAN interface provides. We'll override this with Cloudflare's DNS and lock it down so WAN interfaces can't overwrite it.
Configure upstream DNS resolvers
uci set dhcp.@dnsmasq[0].noresolv='1'
uci del dhcp.@dnsmasq[0].server
uci add_list dhcp.@dnsmasq[0].server='1.1.1.1'
uci add_list dhcp.@dnsmasq[0].server='1.0.0.1'
uci add_list dhcp.@dnsmasq[0].server='2606:4700:4700::1111'
uci add_list dhcp.@dnsmasq[0].server='2606:4700:4700::1001'
uci commit dhcp
/etc/init.d/dnsmasq restart
Prevent WAN interfaces from overwriting DNS
uci set network.wwan.peerdns='0'
uci set network.wan2.peerdns='0'
uci commit network
Enable DNSSEC
uci set dhcp.@dnsmasq[0].dnssec='1'
uci set dhcp.@dnsmasq[0].dnsseccheckunsigned='1'
uci commit dhcp
/etc/init.d/dnsmasq restart
Verify:
nslookup cloudflare.com 127.0.0.1
Final Architecture
[ Internet ]
|
+---- 5G/LTE (Rakuten) -------- Quectel RM520N-GL (M.2 B-Key)
| -> QMI -> wwan0 interface
|
+---- Ethernet WAN2 ----------- eth3 (VP2420 port 4)
-> DHCP -> wan2 interface
| both via mwan3 load balancer
[ Protectli VP2420 ] <- OpenWRT
|
+---- LAN (eth0-eth2) -> Wired clients
|
+---- WiFi AP (wlan0) -> MediaTek MT7921
-> 5GHz 802.11ax / WiFi 6
Bridged to br-lan
DNS: dnsmasq -> 1.1.1.1 / 1.0.0.1 (Cloudflare + DNSSEC)
IPv6: Routed via cellular (Rakuten native dual-stack)
Performance results
| Test | Result | Notes | |---|---|---| | Cellular (Rakuten 5G/LTE) | ~80-100 Mbps down / 30-50 Mbps up | QMI protocol, Tokyo coverage | | WiFi throughput (iperf3) | ~400-600 Mbps | 5GHz 80MHz, MT7921 AP mode | | mwan3 failover time | < 10 seconds | Ping-based, 3 failures to trigger | | Idle power consumption | ~8-12W | Fanless passive cooling |
Key packages installed
opkg install \
kmod-usb-net-qmi-wwan uqmi luci-proto-qmi \
kmod-mt7921e wpad-openssl \
mwan3 luci-app-mwan3 \
luci-app-firewall luci-app-opkg \
tcpdump iperf3 htop
Total cost estimate: VP2420 (~$350) + RM520N-GL (~$120) + MT7921 (~$25) + antennas (~$15) + SSD (~$30) = ~$540. You get enterprise-grade routing that will outlast any consumer device and can be fully reconfigured at the OS level.
Troubleshooting quick reference
| Problem | Likely Cause | Fix |
|---|---|---|
| Modem shows disconnected | Interface not started | uqmi --start-network --apn ... |
| WiFi AP not broadcasting | phy0-ap0 interface missing | iw phy phy0 interface add wlan0 type __ap |
| LAN clients have no internet | WAN not in firewall zone | uci add_list firewall.@zone[1].network='wwan' |
| DNS not resolving correctly | peerdns overwriting config | uci set network.wwan.peerdns='0' |
| OPNsense modem not connecting | No QMI support in BSD | Switch to OpenWRT |
Router hostname: KeyToVoid -- Running OpenWRT -- Tokyo, Japan



