Configuring OSPFd
In the guide below, we will demonstrate the use of ospfd(8) using virtual machines inside vmm. This guide presumes you have practiced static routing. The setup is very similar to configuring ripd.
In order to save on costs, we will be using the reserved IP address prefix 10/8 and then translate the range to a public IP address. Here is the topology:
R1 <-----> Internet
(10.1/16)
10.2.1.1
^
|
|
veb12
|
|
V
10.2.2.1
R2 10.3.2.1 <-veb23-> 10.3.2.2 R3 10.5.3.1 <--veb35--> 10.5.5.1 R5
(10.2/16) (10.3/16) (10.5/16)
10.4.2.1 10.3.4.2
^ ^
\ /
veb24 /
\ veb34
\ /
------> R4 <-----
10.4.4.1 (10.4/16) 10.3.4.1
Each R# in the above topology represents a router, which we simulate with a virtual machine with multiple interfaces. We will use veb(4) to link two routers together. Because there are multiple interfaces on each router, no three nodes will ever share the same broadcast domain. This ensures that routing will be required to traverse the network.
In the hypervisor, we configure the proper interfaces:
host# cat /etc/vm.conf
socket owner :vmdusers
switch "switch12" {
locked lladdr
interface veb12
}
switch "switch23" {
locked lladdr
interface veb23
}
switch "switch24" {
locked lladdr
interface veb24
}
switch "switch34" {
locked lladdr
interface veb34
}
switch "switch35" {
locked lladdr
interface veb35
}
bsdiso="/home/iso/install75.iso"
vm "r2" {
owner $USER
memory 1G
cdrom $bsdiso
disk /home/$USER/r2.qcow2 format qcow2
interface tap22 {
locked lladdr e8:8b:22:22:22:22
switch "switch12"
}
interface tap32 {
locked lladdr e8:8b:32:32:32:32
switch "switch23"
}
interface tap42 {
locked lladdr e8:8b:42:42:42:42
switch "switch24"
}
}
vm "r3" {
owner $USER
memory 1G
cdrom $bsdiso
disk /home/$USER/r3.qcow2 format qcow2
interface tap322 {
locked lladdr e8:8b:32:02:32:02
switch "switch23"
}
interface tap342 {
locked lladdr e8:8b:34:02:34:02
switch "switch34"
}
interface tap53 {
locked lladdr e8:8b:53:53:53:53
switch "switch35"
}
}
vm "r4" {
owner $USER
memory 1G
cdrom $bsdiso
disk /home/$USER/r4.qcow2 format qcow2
interface tap44 {
switch "switch24"
locked lladdr e8:8b:44:44:44:44
}
interface tap34 {
locked lladdr e8:8b:34:34:34:34
switch "switch34"
}
}
vm "r5" {
owner $USER
memory 1G
cdrom $bsdiso
disk /home/$USER/r5.qcow2 format qcow2
interface tap55 {
switch "switch35"
locked lladdr e8:8b:55:55:55:55
}
}
NOTE: You will need to create necessary tap devices:
# cd /dev
# sh MAKEDEV tap{22,32,42,322,342,53,44,34,55}
We also create the qcow2 images and install the system:
$ vmctl create -s 20G $HOME/r2.qcow2 $ vmctl create -s 20G $HOME/r3.qcow2 $ vmctl create -s 20G $HOME/r4.qcow2 $ vmctl create -s 20G $HOME/r5.qcow2
In /etc/pf.conf?, we add a rule similar to the following for performing NAT:
match out on egress from !(egress:network) to any nat-to (egress:0)
Now all IPs from 10/8 will be NAT'd to our host's public IP address.
Then reload the ruleset:
host# pfctl -f /etc/pf.conf
We configure the proper interfaces on the host, sysctl.conf(5), and ospfd.conf(5):
host# cat /etc/hostname.veb12
add vport21
up
host# cat /etc/hostname.veb23
up
host# cat /etc/hostname.veb24
up
host# cat /etc/hostname.veb34
up
host# cat /etc/hostname.veb35
up
host# cat /etc/hostname.vport11
inet 10.1.1.1 0xffff0000
up
host# cat /etc/hostname.vport21
inet 10.2.1.1 0xffff0000
up
host# cat /etc/ospfd.conf
# $OpenBSD: ospfd.conf,v 1.2 2018/08/07 07:06:20 claudio Exp $
# global configuration
redistribute static
redistribute connected
redistribute default
KEY12="Ub4gwbQHmJfJwJdV"
KEY23="9QvfZWh3HIe0lEsS"
KEY24="aJIlRUBq9UVsnp9x"
KEY34="jwmmQOitXoKfVh8I"
KEY35="rG7DhWe35a7sLDMQ"
area 0.0.0.0 {
interface vport21 {
auth-type crypt
auth-md 1 $KEY12
auth-md-keyid 1
}
}
host# cat /etc/sysctl.conf
net.inet.ip.arpq.maxlen=1024
net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1
net.inet.ip.multipath=1
Replace if0 with your actual egress interface.
Next, we configure the virtual machines:
r2# cat /etc/hostname.vio0
inet 10.2.2.1 0xffff0000
up
r2# cat /etc/hostname.vio1
inet 10.3.2.1 0xffffff00
up
r2# cat /etc/hostname.vio2
inet 10.4.2.1 0xffff0000
up
r2# cat /etc/sysctl.conf
net.inet.ip.forwarding=1
net.inet.ip.multipath=1
r2# cat /etc/ospfd.conf
# $OpenBSD: ospfd.conf,v 1.2 2018/08/07 07:06:20 claudio Exp $
# global configuration
redistribute static
redistribute connected
redistribute default
KEY12="Ub4gwbQHmJfJwJdV"
KEY23="9QvfZWh3HIe0lEsS"
KEY24="aJIlRUBq9UVsnp9x"
KEY34="jwmmQOitXoKfVh8I"
KEY35="rG7DhWe35a7sLDMQ"
area 0.0.0.0 {
interface vio0 {
auth-type crypt
auth-md 1 $KEY12
auth-md-keyid 1
}
interface vio1 {
auth-type crypt
auth-md 1 $KEY23
auth-md-keyid 1
}
interface vio2 {
auth-type crypt
auth-md 1 $KEY24
auth-md-keyid 1
}
}
r3# cat /etc/hostname.vio0
inet 10.3.2.2 0xffffff00
up
r3# cat /etc/hostname.vio1
inet 10.3.4.2 0xffffff00
up
r3# cat /etc/hostname.vio2
inet 10.5.3.1 0xffff0000
up
r3# cat /etc/ospfd.conf
# $OpenBSD: ospfd.conf,v 1.2 2018/08/07 07:06:20 claudio Exp $
# global configuration
redistribute static
redistribute connected
redistribute default
KEY12="Ub4gwbQHmJfJwJdV"
KEY23="9QvfZWh3HIe0lEsS"
KEY24="aJIlRUBq9UVsnp9x"
KEY34="jwmmQOitXoKfVh8I"
KEY35="rG7DhWe35a7sLDMQ"
area 0.0.0.0 {
interface vio0 {
auth-type crypt
auth-md 1 $KEY23
auth-md-keyid 1
}
interface vio1 {
auth-type crypt
auth-md 1 $KEY34
auth-md-keyid 1
}
interface vio2 {
auth-type crypt
auth-md 1 $KEY35
auth-md-keyid 1
}
}
r3# cat /etc/sysctl.conf
net.inet.ip.forwarding=1
net.inet.ip.multipath=1
r4# cat /etc/hostname.vio0
inet 10.4.4.1 0xffff0000
up
r4# cat /etc/hostname.vio1
inet 10.3.4.1 0xffffff00
up
r4# cat /etc/ospfd.conf
# $OpenBSD: ospfd.conf,v 1.2 2018/08/07 07:06:20 claudio Exp $
# $OpenBSD: ospfd.conf,v 1.2 2018/08/07 07:06:20 claudio Exp $
# global configuration
redistribute static
redistribute connected
redistribute default
KEY12="Ub4gwbQHmJfJwJdV"
KEY23="9QvfZWh3HIe0lEsS"
KEY24="aJIlRUBq9UVsnp9x"
KEY34="jwmmQOitXoKfVh8I"
KEY35="rG7DhWe35a7sLDMQ"
area 0.0.0.0 {
interface vio0 {
auth-type crypt
auth-md 1 $KEY24
auth-md-keyid 1
}
interface vio1 {
auth-type crypt
auth-md 1 $KEY34
auth-md-keyid 1
}
}
r4# cat /etc/sysctl.conf
net.inet.ip.forwarding=1
net.inet.ip.multipath=1
r5# cat /etc/hostname.vio0
inet 10.5.5.1 0xffff0000
up
r5# cat /etc/ospfd.conf
# $OpenBSD: ospfd.conf,v 1.2 2018/08/07 07:06:20 claudio Exp $
# global configuration
redistribute static
redistribute connected
redistribute default
KEY12="Ub4gwbQHmJfJwJdV"
KEY23="9QvfZWh3HIe0lEsS"
KEY24="aJIlRUBq9UVsnp9x"
KEY34="jwmmQOitXoKfVh8I"
KEY35="rG7DhWe35a7sLDMQ"
area 0.0.0.0 {
interface vio0 {
auth-type crypt
auth-md 1 $KEY35
auth-md-keyid 1
}
}
r5# cat /etc/sysctl.conf
net.inet.ip.forwarding=1
net.inet.ip.multipath=1
Note: Be careful to input the correct subnet masks. Interfaces connecting to 10.3/16 have a longer mask.
When set up correctly, r5 will now be able to reach the Internet:
r5# ping 1.1.1.1 PING 1.1.1.1 (1.1.1.1): 56 data bytes 64 bytes from 1.1.1.1: icmp_seq=0 ttl=53 time=4.181 ms 64 bytes from 1.1.1.1: icmp_seq=1 ttl=53 time=4.353 ms
Note: It may take around one minute for routes to propagate. Be patient.
Querying ospfd
You can show the link state database:
r3# ospfctl show database
Router Link States (Area 0.0.0.0)
Link ID Adv Router Age Seq# Checksum
10.1.1.1 10.1.1.1 316 0x80000016 0x44b8
10.2.2.1 10.2.2.1 273 0x80000022 0x89ea
10.3.2.2 10.3.2.2 1224 0x8000001c 0x97d3
10.3.4.1 10.3.4.1 272 0x8000001b 0xf2b3
10.5.5.1 10.5.5.1 1215 0x80000017 0x2cb3
Net Link States (Area 0.0.0.0)
Link ID Adv Router Age Seq# Checksum
10.2.1.1 10.1.1.1 1657 0x80000009 0x5ac0
10.3.2.2 10.3.2.2 275 0x8000000b 0x4bc2
10.5.3.1 10.3.2.2 1224 0x80000003 0x7598
10.3.4.1 10.3.4.1 279 0x80000004 0x63ac
10.4.4.1 10.3.4.1 277 0x80000002 0x49c9
Type-5 AS External Link States
Link ID Adv Router Age Seq# Checksum
0.0.0.0 10.1.1.1 730 0x8000000a 0xe7f2
10.1.0.0 10.1.1.1 730 0x8000000a 0x5976
192.168.5.1 10.1.1.1 730 0x8000000a 0x5601
You can also show the forwarding information base:
r3# ospfctl show fib flags: * = valid, O = OSPF, C = Connected, S = Static Flags Prio Destination Nexthop *O 32 0.0.0.0/0 10.3.2.1 *O 32 10.1.0.0/16 10.3.2.1 *O 32 10.2.0.0/16 10.3.2.1 *C 4 10.3.2.0/24 10.3.2.2 *C 4 10.3.4.0/24 10.3.4.2 *O 32 10.4.0.0/16 10.3.2.1 *O 32 10.4.0.0/16 10.3.4.1 *C 4 10.5.0.0/16 10.5.3.1 *O 32 192.168.5.1/24 10.3.2.1 *C 0 127.0.0.0/8 link#0 *S 8 127.0.0.0/8 127.0.0.1 * 1 127.0.0.1/32 127.0.0.1 *S 8 224.0.0.0/4 127.0.0.1
And the Routing Information Base:
r3# ospfctl show rib Destination Nexthop Path Type Type Cost Uptime 10.1.1.1 10.3.2.1 Intra-Area Router 20 00:36:48 10.2.2.1 10.3.2.1 Intra-Area Router 10 00:36:48 10.3.2.2 0.0.0.0 C Intra-Area Router 0 00:37:33 10.3.4.1 10.3.4.1 Intra-Area Router 10 00:36:48 10.5.5.1 10.5.5.1 Intra-Area Router 10 00:22:22 10.2.0.0/16 10.3.2.1 Intra-Area Network 20 00:36:48 10.3.2.0/24 10.3.2.2 C Intra-Area Network 10 00:36:48 10.3.4.0/24 10.3.4.2 C Intra-Area Network 10 00:36:48 10.4.0.0/16 10.3.2.1 Intra-Area Network 20 00:36:48 10.4.0.0/16 10.3.4.1 Intra-Area Network 20 00:36:43 10.5.0.0/16 10.5.3.1 C Intra-Area Network 10 00:22:32 0.0.0.0/0 10.3.2.1 Type 1 ext Network 120 00:36:48 10.1.0.0/16 10.3.2.1 Type 1 ext Network 120 00:36:48 104.167.241.48/29 10.3.2.1 Type 1 ext Network 120 00:36:48 104.167.241.192/26 10.3.2.1 Type 1 ext Network 120 00:36:48
Troubleshooting
Run ospfctl to check if it shows neighbors:
# ospfctl show neighbor r3# ospfctl show neighbor ID Pri State DeadTime Address Iface Uptime 10.5.5.1 1 FULL/BCKUP 00:00:37 10.5.5.1 vio2 00:24:35 10.3.4.1 1 FULL/DR 00:00:39 10.3.4.1 vio1 00:38:53 10.2.2.1 1 FULL/BCKUP 00:00:37 10.3.2.1 vio0 00:38:51
If it does not show any neighbors, run it in debug mode with the verbose flag:
# ospfd -dv
Wait 60 seconds. If you see the error message below:
recv_packet: cannot find a matching interface
It may indicate that the IP addresses / subnet masks on the interfaces do not match up correctly.
