Though the OSPFv3 protocol does not offer a built-in authentication method, IPsec can be used to secure protocol exchanges between devices running OSPFv3. To authenticate OSPFv3 on a Juniper device, you first start out with the configuration of a Security Association (SA). The SA describes how the devices will communicate securely by defining the algorithms and keys that will be used.

The SA can be configured in the following way:

set security ipsec security-association ospf3-sa mode transport
set security ipsec security-association ospf3-sa manual direction bidirectional protocol esp
set security ipsec security-association ospf3-sa manual direction bidirectional spi 256
set security ipsec security-association ospf3-sa manual direction bidirectional authentication algorithm hmac-sha1-96
set security ipsec security-association ospf3-sa manual direction bidirectional authentication key ascii-text 01234567890123456789

After the definition of this SA, you simply reference it after the OSPFv3 interface configuration. The following is an example configuration for a Juniper MX router:

set protocols ospf3 area 0.0.0.100 interface ge-0/0/2.3008 ipsec-sa ospf3-sa

Securing virtual-link is done in a similar way:

set protocols ospf3 area 0.0.0.0 virtual-link neighbor-id 192.168.0.4 transit-area 0.0.0.100 ipsec-sa ospf3-sa

IPsec SA settings can be verified using the the ‘show ipsec security-associations detail’ command. To verify what IPsec-SA is in use for OSPFv3 between a given set of Juniper devices, you can issue the following command;

play@MX480> show ospf3 interface detail
ge-0/0/2.3008       PtToPt  0.0.0.100       0.0.0.0         0.0.0.0            1
  Address fe80::250:560b:c097:4df1, Prefix-length 64
  OSPF3-Intf-index 3, Type P2P, MTU 1500, Cost 10
  Adj count: 1, Router LSA ID: 0
  Hello 10, Dead 40, ReXmit 5, Not Stub
  IPSec SA name: ospf3-sa
  Protection type: None
  

This method of securing protocol information can also be used for OSPFv2. I initially thought that the authentication options for OSPFv2 were ‘none’, ‘plain-text’ or ‘MD5’. Same as with OSPFv3, the SA can be used for OSPFv2 simply by referencing it in the OSPF configuration stanza like this:

set protocols ospf area 0.0.0.0 interface ge-0/0/1.3001 ipsec-sa ospf3-sa

And for verifications, you can use the same command as with OSPFv3:

play@MX480> show ospf interface extensive
Interface           State   Area            DR ID           BDR ID          Nbrs
ge-0/0/1.3001       DR      0.0.0.0         192.168.0.5     192.168.0.4        1
  Type: LAN, Address: 192.168.50.2, Mask: 255.255.255.252, MTU: 1500, Cost: 1
  DR addr: 192.168.50.2, BDR addr: 192.168.50.1, Priority: 128
  Adj count: 1
  Hello: 10, Dead: 40, ReXmit: 5, Not Stub
  IPSec SA name: ospf3-sa
  Auth type: None
  Protection type: None
  Topology default (ID 0) -> Cost: 1

Keep in mind that if you are using OSPFv3 to distribute IPv4 prefix information, interfaces under the ipv4-unicast realm need to be configured to communicate securely as well:

set protocols ospf3 realm ipv4-unicast area 0.0.0.0 interface xe-0/3/0.1503 ipsec-sa ospf3-sa

And to verify this:

play@MX480> show ospf3 interface realm ipv4-unicast extensive
Interface           State   Area            DR ID           BDR ID          Nbrs
xe-0/3/0.1503       PtToPt  0.0.0.0         0.0.0.0         0.0.0.0            1
  Address fe80::8ae0:f305:df55:f8f6, Prefix-length 64
  OSPF3-Intf-index 1, Type P2P, MTU 1500, Cost 1
  Adj count: 1, Router LSA ID: 0
  Hello 10, Dead 40, ReXmit 5, Not Stub
  IPSec SA name: ospf3-sa
  Protection type: None

In my experience, I have never really had to troubleshoot this. The only thing I have encountered up until this point was a key-mismatch or a configuration type (none versus IPsec or whatever) mismatch. Both of these errors are quite easy to spot when they show up in the logging of the router.