What's new

VPNMON VPNMON-R3 v1.9.1 -Mar 14, 2026- Monitor OVPN/Wireguard + Multi/Double-Hop VPN + WAN Health + Random Reset (Available in AMTM!)

Super incredible. Congrats @Viktor Jaep for this great new release full of improvements and new additions!!
Updating my instance now...
 
Super excited to tease a brand new VPNMON-R3 feature... coming to a BETA your way soon! Double-Hop VPN!

1771984529950.png


Capable of selecting and configuring an inner and outer VPN tunnel, and when using 2 different VPN providers, gives you some of the best possible privacy available. Unique to VPNMON-R3 and this Asus Merlin Community, this feature also lets you use straight OVPN and pair it with a WG tunnel, or WG with OVPN, WG with WG or OVPN with OVPN.

Still doing lots of testing and cleanup... but hoping to get this out in your hands within a few more days!
 
Shhhh... For anyone interested in wanting to test the first pre-release beta1... I've made it available. This is practically Alpha... All menus look clean, functionality looks good, will be making a few more tweaks here & there. Use at your own risk, and let me know how it goes! :)

VPNMON-R3 v1.9.0 Beta 1- (February 25, 2026)
- MINOR: Added an extremely unique feature to VPNMON-R3. Multi/Double-Hop VPN! While this kind of functionality is available using major VPN providers, this is not a feature I have come across in the Merlin FW world as of yet. This feature is capable of selecting and configuring an inner and outer VPN tunnel, and when using 2 different VPN providers, gives you some of the best possible privacy available. Unique to VPNMON-R3 and this Asus Merlin Community, this feature also lets you use straight OVPN and pair it with a WG tunnel, or WG with OVPN, WG with WG or OVPN with OVPN. This option is available under the configuration menu -> Option #17. A full menu to manage this feature has been added that lets you pick which VPN/WG slots, Hop Clients, and Advanced Settings if need be, along with the ability to enable/disable, rebuild, and tear down routing rules.

1772540404674.png


Beta Download Link
Code:
curl --retry 3 "https://raw.githubusercontent.com/ViktorJp/VPNMON-R3/develop/vpnmon-r3.sh" -o "/jffs/scripts/vpnmon-r3.sh" && chmod 755 "/jffs/scripts/vpnmon-r3.sh"

Significant Screenshots:

1772068982058.png
 
Last edited:
Getting VPNMON-R3 v1.9.0 out the door after a few weeks of testing Multi/Double-Hop VPN on my end. Everything seems to be functioning as advertised. Would love to hear your feedback. Hope you all enjoy! :)

What's new!?
v1.9.0 - (March 8, 2026)
- MINOR:
Added an extremely unique feature to VPNMON-R3. Multi/Double-Hop VPN! While this kind of functionality is available using major VPN providers, this is not a feature I have come across in the Merlin FW world as of yet. This feature is capable of selecting and configuring an inner and outer VPN tunnel, and when using 2 different VPN providers, gives you some of the best possible privacy available. Unique to VPNMON-R3 and this Asus Merlin Community, this feature also lets you use straight OVPN and pair it with a WG tunnel, or WG with OVPN, WG with WG or OVPN with OVPN. This option is available under the configuration menu -> Option #17. A full menu to manage this feature has been added that lets you pick which VPN/WG slots, Hop Clients, and Advanced Settings if need be, along with the ability to enable/disable, rebuild, and tear down routing rules. PLEASE NOTE: Double-Hop VPN Client redirection is handled within the VPNMON-R3 interface, not through the VPN Director in the main Merlin UI.
- PATCH: Various inconsistencies and bug fixes around bandwidth measurements.

Download link (or update directly within VPNMON-R3 or AMTM):
Code:
curl --retry 3 "https://raw.githubusercontent.com/ViktorJp/VPNMON-R3/main/vpnmon-r3.sh" -o "/jffs/scripts/vpnmon-r3.sh" && chmod 755 "/jffs/scripts/vpnmon-r3.sh"

Significant Screenshots:

Showing the main UI with the new Multi/Double-Hop VPN section added on the bottom:
1772982697091.png


The new Multi/Double-Hop VPN item #17 in the configuration menu:
1772982682845.png


The interface for configurating the Multi/Double-Hop VPN:
1772982743225.png
 
Small bug fix day on one of my favorite days of the year... 3.14 - happy Pi-Day!

What's new!?
v1.9.1 - (March 14, 2026)
- PATCH:
Because it's Pi-Day, we're celebrating with a small patch release along with a nice slice of Pizza pie! This bug fix resolves an issue that I thought I caught last go-around, but it was still showing bad behavior. Primarily related around the connection throughput indicator visuals, when the figure exceeded the lower and medium display bounds (configurable using option #14) only for the OVPN, it would use the TX values instead of the RX values. This all stems around the fact that for some reason, RX and TX values are reversed for OVPN, but not for WG, when gathering these stats from the underlying system.

Download link (or update directly within AMTM/VPNMON-R3):
Code:
curl --retry 3 "https://raw.githubusercontent.com/ViktorJp/VPNMON-R3/main/vpnmon-r3.sh" -o "/jffs/scripts/vpnmon-r3.sh" && chmod 755 "/jffs/scripts/vpnmon-r3.sh"

Significant Screenshots:

Call it what you will, OCD or whatever, but just making sure when everything is supposed to be green, everything is green. Fixed!
1773501069226.png
 
since (I think) v1.8.3 app stays with this after launch:

View attachment 70872
and it's killing working vpn connections even manually started
Sounds like it's having problems determining if your WAN is up on your router. Until we've sorted this out, you could just disabling that functionality in the setup (vpnmon-r3 -setup -> 1 -> 8 add'l WAN monitoring)

You doing anything unusual when it comes to your WAN? What are you using for your Ping host? Could you be blocking anything?
 
Sounds like it's having problems determining if your WAN is up on your router. Until we've sorted this out, you could just disabling that functionality in the setup (vpnmon-r3 -setup -> 1 -> 8 add'l WAN monitoring)

You doing anything unusual when it comes to your WAN? What are you using for your Ping host? Could you be blocking anything?
no, behavior just changed with 1.8.3, I think it may be related to dual wan
 
no, behavior just changed with 1.8.3, I think it may be related to dual wan
So you are running dual WAN? What are you using for your pinghost? Do you know what network interfaces are assigned to WAN0/WAN1?

I'll compare versions and see what might be different that could be affecting you.

I'll also send you a link to see if you can try 1.8.3 (or a version prior) to see if they work for you, which could help troubleshoot this.
 
no, behavior just changed with 1.8.3, I think it may be related to dual wan

I have compared the main functions dealing with WAN outages between 1.9.1 and 1.8.3, and have not found any differences. Perhaps it is something else!?

Please give v1.8.3 another try, and see if this doesn't cause the same behavior that you're seeing - run the command below to overwrite your current version of VPNMON-R3 with v1.8.3:
Code:
#!/bin/sh
########################################################################
# Detects router identity, Wi-Fi band-to-interface mappings, and WAN
# interface assignments from NVRAM on Asus-Merlin routers.
#
# Exports the following globals on success:
#   IFNAME_WAN0, IFNAME_WAN1
#   IFNAME_24, IFNAME_24_2, IFNAME_24_3
#   IFNAME_5,  IFNAME_5_2,  IFNAME_5_3
#   IFNAME_6,  IFNAME_6_2,  IFNAME_6_3
########################################################################

detect_wifi_bands() {
    NVRAM="${NVRAM:-nvram}"

    local idx=0
    local max_radios=4
    local nband ifname band_label
    local count_24=0 count_5=0 count_6=0

    # -- Router identity -----------------------------------------------------
    local router_model router_fw

    router_model=$(${NVRAM} get productid 2>/dev/null)
    [ -z "${router_model}" ] && router_model=$(${NVRAM} get model 2>/dev/null)
    [ -z "${router_model}" ] && router_model="Unknown"

    # On 3006.x branch (Wi-Fi 7) routers, the full version must be assembled
    # from firmver (e.g. 3006.102) + buildno (e.g. 7) + extendno (e.g. 0).
    # os_version alone only returns the trailing portion (e.g. 102.7.0).
    local firmver buildno extendno
    firmver=$(${NVRAM} get firmver  2>/dev/null)
    buildno=$(${NVRAM} get buildno  2>/dev/null)
    extendno=$(${NVRAM} get extendno 2>/dev/null)

    if [ -n "${firmver}" ] && [ -n "${buildno}" ]; then
        router_fw="${firmver}.${buildno}${extendno:+.${extendno}}"
    else
        router_fw=$(${NVRAM} get os_version 2>/dev/null)
        [ -z "${router_fw}" ] && router_fw="Unknown"
    fi

    clear
    echo "==========================================" >&2
    echo "  Make:     Asus"                           >&2
    echo "  Model:    ${router_model}"                >&2
    echo "  Firmware: ${router_fw}"                   >&2
    echo "==========================================" >&2

    # -- Wi-Fi bands ---------------------------------------------------------
    echo ""
    echo "Detecting Wi-Fi band-to-interface mappings..." >&2

    while [ "${idx}" -lt "${max_radios}" ]; do

        # No ifname means this radio index doesn't exist; stop scanning
        ifname=$(${NVRAM} get wl${idx}_ifname 2>/dev/null)
        [ -z "${ifname}" ] && break

        # wlX_nband NVRAM key: 1=5GHz, 2=2.4GHz, 4=6GHz
        nband=$(${NVRAM} get wl${idx}_nband 2>/dev/null)

        case "${nband}" in
            2)  # 2.4 GHz
                count_24=$((count_24 + 1))
                band_label="2.4GHz"
                if [ "${count_24}" -eq 1 ]; then
                    IFNAME_24="${ifname}"
                else
                    eval "IFNAME_24_${count_24}='${ifname}'"
                    band_label="2.4GHz-${count_24}"
                fi
                ;;
            1)  # 5 GHz
                count_5=$((count_5 + 1))
                band_label="5GHz"
                if [ "${count_5}" -eq 1 ]; then
                    IFNAME_5="${ifname}"
                else
                    eval "IFNAME_5_${count_5}='${ifname}'"
                    band_label="5GHz-${count_5}"
                fi
                ;;
            4)  # 6 GHz
                count_6=$((count_6 + 1))
                band_label="6GHz"
                if [ "${count_6}" -eq 1 ]; then
                    IFNAME_6="${ifname}"
                else
                    eval "IFNAME_6_${count_6}='${ifname}'"
                    band_label="6GHz-${count_6}"
                fi
                ;;
            *)
                band_label="Unknown (nband=${nband:-<empty>})"
                ;;
        esac

        echo "  wl${idx} -> ${ifname} [${band_label}]" >&2
        idx=$((idx + 1))
    done

    # -- WAN interfaces ------------------------------------------------------
    echo ""
    echo "Detecting WAN interface mappings..." >&2

    local wan_idx wan_ifname wan_proto

    for wan_idx in 0 1; do
        wan_ifname=$(${NVRAM} get wan${wan_idx}_ifname 2>/dev/null)
        wan_proto=$(${NVRAM} get wan${wan_idx}_proto 2>/dev/null)

        # Skip entirely if no interface is assigned (WAN1 absent on single-WAN models)
        [ -z "${wan_ifname}" ] && continue

        eval "IFNAME_WAN${wan_idx}='${wan_ifname}'"
        echo "  wan${wan_idx} -> ${wan_ifname} [${wan_proto:-unknown}]" >&2
    done

    # -- Summary -------------------------------------------------------------
    echo "==========================================" >&2
    echo ""
    echo "Interface Mapping:" >&2
    [ -n "${IFNAME_WAN0}" ] && echo "  WAN0:     ${IFNAME_WAN0}  ($(${NVRAM} get wan0_proto 2>/dev/null))" >&2
    [ -n "${IFNAME_WAN1}" ] && echo "  WAN1:     ${IFNAME_WAN1}  ($(${NVRAM} get wan1_proto 2>/dev/null))" >&2
    [ -n "${IFNAME_24}"   ] && echo "  2.4GHz:   ${IFNAME_24}"   >&2
    [ -n "${IFNAME_24_2}" ] && echo "  2.4GHz-2: ${IFNAME_24_2}" >&2
    [ -n "${IFNAME_24_3}" ] && echo "  2.4GHz-3: ${IFNAME_24_3}" >&2
    [ -n "${IFNAME_5}"    ] && echo "  5GHz:     ${IFNAME_5}"    >&2
    [ -n "${IFNAME_5_2}"  ] && echo "  5GHz-2:   ${IFNAME_5_2}"  >&2
    [ -n "${IFNAME_5_3}"  ] && echo "  5GHz-3:   ${IFNAME_5_3}"  >&2
    [ -n "${IFNAME_6}"    ] && echo "  6GHz:     ${IFNAME_6}"    >&2
    [ -n "${IFNAME_6_2}"  ] && echo "  6GHz-2:   ${IFNAME_6_2}"  >&2
    [ -n "${IFNAME_6_3}"  ] && echo "  6GHz-3:   ${IFNAME_6_3}"  >&2
    echo ""
    echo "==========================================" >&2
    echo ""
}

detect_wifi_bands
 
Last edited:

Similar threads

Support SNBForums w/ Amazon

If you'd like to support SNBForums, just use this link and buy anything on Amazon. Thanks!

Sign Up For SNBForums Daily Digest

Get an update of what's new every day delivered to your mailbox. Sign up here!
Back
Top