How to buy Partners Documentation Support Log in
BNG & LNS / Converting a Juniper MX BNG configuration to Netavo

Engineering · 14 Oct 2026

Converting a Juniper MX BNG configuration to Netavo

Map Junos MX PPPoE/IPoE access, RADIUS, address pools and L3VPN VRFs onto Netavo's single config.json.

MigrationJuniperBNGConfig

If you terminate subscribers on a Juniper MX today, the constructs you rely on have direct equivalents on Netavo BNG. The difference is mostly shape: Junos spreads subscriber configuration across dynamic-profiles, access, interfaces and routing-instances; Netavo keeps it in one JSON file (/etc/netavo-bng/config.json) that you can hold in version control. This guide maps the usual pieces so you can plan a cutover rather than a redesign.

The shape of the migration

The MX does four jobs for a subscriber edge: it terminates the access protocol (PPPoE/IPoE), authenticates and accounts each session against RADIUS, hands out an address, and places the subscriber into a routing context (global or an L3VPN). Netavo does the same four jobs, so you can translate each part of the configuration without redesigning the architecture. Run the two edges side by side, move a pilot hand-off, then shift the rest.

The examples below are sections to add to a working config.json; they do not form a complete file.

Access and PPPoE / IPoE

On the MX, a PPPoE subscriber interface is instantiated from a dynamic profile over an underlying interface:

dynamic-profiles {
    pppoe-prof {
        interfaces {
            pp0 {
                unit "$junos-interface-unit" {
                    ppp-options { chap; }
                    pppoe-options { underlying-interface "$junos-underlying-interface"; server; }
                    family inet { unnumbered-address lo0.0; }
                }
            }
        }
    }
}
protocols pppoe { }
system services subscriber-management { enable; }

On Netavo you name the physical access ports in dataPlane.subscriberInterfaces, turn on the access protocols, and describe the wholesale hand-off as an access NNI (the outer S-tag the aggregator adds):

"dataPlane": {
  "subscriberInterfaces": [
    { "ifname": "eno1", "pci": "0000:04:00.0", "rxQueues": 4,
      "accessProtocols": ["pppoe", "ipoe"], "spray": "auto" }
  ]
},
"pppoe": { "enabled": true, "acName": "bng1.lon1" },
"ipoe":  { "enabled": true, "serverIp": "10.255.255.1" },
"subscribers": {
  "accessNnis": [
    { "name": "wholesale-south", "interface": "eno1", "sVlan": 200,
      "description": "Wholesale FTTP hand-off, C-VLANs inside the S-tag" }
  ]
}
Junos Netavo Notes
dynamic-profiles / pp0 instantiation pppoe.enabled, subscribers.accessNnis No per-subscriber profile templating; sessions come up on the NNI and are shaped by RADIUS reply
pppoe-options server, ppp-options chap pppoe.acName, CHAP via RADIUS CHAP/PAP are negotiated per session
IPoE/DHCP demux ipoe.enabled, ipoe.serverIp Option-82 circuit-id handling is a RADIUS option (below)
interfaces ge-*/*/* vlan-tagging accessNnis.sVlan One NNI carries all retail C-VLANs inside the operator S-tag

Authentication and accounting (RADIUS)

Junos ties RADIUS to the subscriber through an access profile:

access {
    radius-server { 10.20.0.5 { secret "$9$secret"; port 1812; } }
    profile isp-auth {
        authentication-order radius;
        radius {
            authentication-server 10.20.0.5;
            accounting-server 10.20.0.5;
        }
        accounting { order radius; }
    }
}

Netavo points auth and accounting at the same servers. You keep your RADIUS (FreeRADIUS, or whatever your billing drives); only the NAS changes.

"auth": {
  "driver": "radius",
  "radius": {
    "servers": [ { "host": "10.20.0.5", "port": 1812, "secret": "op://netavo/radius/secret" } ],
    "nasIdentifier": "bng1.lon1",
    "nasIpAddress": "45.84.203.1",
    "option82Encoding": "bbf-vsa",
    "rateAttributeMode": "auto"
  }
},
"accounting": { "driver": "radius", "interimIntervalSeconds": 300 }
Junos Netavo Notes
access radius-server <ip> secret/port auth.radius.servers[] Keyed by host; secrets are op:// references, never in the file
access profile authentication-order radius auth.driver: "radius" Database/SQL auth is the alternative driver
accounting-server + interim accounting.driver: "radius", interimIntervalSeconds Empty accounting servers reuse the auth servers on port+1
Option-82 insertion auth.radius.option82Encoding bbf-vsa, nas-port-id or calling-station-suffix

Moving from a MikroTik edge rather than an MX? rateAttributeMode can be set to mikrotik so the rate-limit VSAs your RADIUS already returns are honoured unchanged.

Address pools

A Junos address-assignment pool:

access address-assignment {
    pool residential-v4 { family inet { network 100.64.16.0/20; } }
}

Netavo pools are typed by family and bound to a VRF. Dual-stack is one pool set: a v4 range, a routed /64 WAN, and a delegated /56.

"addressPools": [
  { "name": "residential-v4", "family": "ipv4", "vrf": "fttx-south",
    "subnets": [ { "prefix": "100.64.16.0/20" } ],
    "exclude": [ "100.64.16.0", "100.64.16.1", "100.64.31.255" ] },
  { "name": "residential-v6-wan", "family": "ipv6-wan", "vrf": "fttx-south",
    "subnets": [ { "prefix": "2a0e:9f81:101::/52", "announce": true } ] },
  { "name": "residential-v6-pd", "family": "ipv6-pd", "vrf": "fttx-south",
    "delegationLength": 56,
    "subnets": [ { "prefix": "2a0e:9f81:110::/44", "announce": true } ] }
]
Junos Netavo Notes
address-assignment pool ... family inet addressPools family ipv4 Removing a subnet disconnects the sessions holding its addresses
family inet6 WAN + delegated-pool families ipv6-wan and ipv6-pd PD length is delegationLength
pool linked to a routing-instance addressPools[].vrf The pool lands subscribers directly in the VRF

Routing and VRFs (L3VPN)

A Junos L3VPN instance:

routing-instances {
    business {
        instance-type vrf;
        route-distinguisher 208802:2100;
        vrf-target target:208802:2100;
    }
}

The Netavo routing stack runs on the same box, so the BNG is the PE. VRFs carry an RD and route-targets; BGP and the IGP are configured alongside.

"routing": {
  "asn": 208802,
  "routerId": "45.84.203.1",
  "isisInterfaces": ["ens3f0", "ens3f1"],
  "peers": [ { "address": "45.84.203.2", "description": "pe1", "bfd": true } ],
  "vrfs": [
    { "name": "business", "tableId": 2100, "rd": "208802:2100",
      "importRt": ["208802:2100"], "exportRt": ["208802:2100"],
      "gatewayIp": "45.84.203.15" }
  ]
}
Junos Netavo Notes
instance-type vrf, route-distinguisher routing.vrfs[].rd One VRF object per service
vrf-target target:x:y importRt / exportRt Asymmetric import/export is supported with the two lists
protocols bgp to the core routing.peers[], asn, routerId VPNv4/VPNv6 families; BFD per peer
IS-IS / OSPF to the core routing.isisInterfaces, isisNet OSPF is selectable in place of IS-IS

CoA and Disconnect

Junos accepts RADIUS-initiated change-of-authorization through the access profile and its radius-server dynamic-request configuration. Netavo listens for RFC 5176 CoA and Disconnect natively:

"auth": {
  "radius": {
    "coaPort": 3799,
    "coaSecret": "op://netavo/radius/coa",
    "coaAllowedSources": ["10.20.0.5"]
  }
}

A mid-session rate change, a plan swap or a forced disconnect from your RADIUS reaches live sessions exactly as it did on the MX, with an Event-Timestamp skew window you can tune.

What doesn't map one for one

Check these differences before planning the cutover:

  • Junos dynamic-profiles. The variable-driven profile language that instantiates per-subscriber interfaces and services has no direct counterpart. Netavo brings sessions up on the access NNI and shapes them from RADIUS reply attributes, so per-subscriber behaviour is expressed in RADIUS policy rather than a profile template. For most access deployments this is simpler; if you lean heavily on profile logic, plan to move that intent into RADIUS.
  • Hierarchical CoS. Netavo applies a per-subscriber rate (from the plan or a RADIUS attribute); it does not reproduce a full Junos H-CoS scheduler tree. Confirm your QoS model maps to per-subscriber shaping before cutover.
  • MX-specific knobs. Anything tied to the Trio/line-card forwarding model, enhanced subscriber-management features, or Junos-only protocol extensions should be checked against the Netavo manual rather than assumed.

Try the mapping on your own config

The fastest way to validate a translation is to run it. The free evaluation build is the production build, licensed for up to 50 concurrent subscribers with every feature enabled, so you can bring a pilot hand-off up on a VM and watch real sessions before committing. Start at netavobng.com/evaluation, and the full configuration reference is in the manual.

More from Engineering