Configuration Examples
Ready-to-use building blocks for connecting to the frankonIX route servers,
including RPKI validation. Everything you need to fill in yourself is marked
as <PLACEHOLDER>.
These examples are deliberately minimal: three route servers, both address
families, RPKI, a prefix limit and an outbound filter on your own prefixes.
They do not replace checking against your own software version –
RPKI and enforce-first-as in particular differ between releases
of the same platform. Where we know about it, there is a note.
All addresses, filtering rules and communities are listed on the Route Servers page.
What you need to fill in
| Placeholder | Meaning |
|---|---|
<IHRE-ASN> | Your AS number |
<IHRE-IPV4> | Your address from 193.34.203.192/26 |
<IHRE-IPV6> | Your address from 2001:7f8:15b:1::/64 |
<IHRE-ROUTER-ID> | Your BGP router ID |
<MAXPFX-V4> / <MAXPFX-V6> | Your prefix limit per address family |
<IHR-PREFIX-V4> / <IHR-PREFIX-V6> | The prefixes you announce |
The placeholder names are kept identical in both language versions so the snippets stay interchangeable. If you announce more than one prefix, extend the relevant prefix list accordingly – the examples deliberately contain a single entry. On prefix limits: the route servers apply their own limit to what they accept from you, derived from your PeeringDB record. Without an entry the defaults are 250 (IPv4) and 50 (IPv6). The values in your own configuration are independent of that – they protect your router, not ours.
Choose your platform
Juniper Junos Arista EOS Cisco IOS-XR Cisco IOS / IOS-XE BIRD 2 FRRouting VyOS OpenBGPD
Juniper Junos
Junos does not enforce enforce-first-as by default – nothing to disable here. Just make sure you have not enabled it elsewhere.
routing-options {
autonomous-system <IHRE-ASN>;
validation {
group frankonIX-rpki {
session 193.34.203.196 {
port 3323;
local-address <IHRE-IPV4>;
}
session 193.34.203.197 {
port 3323;
local-address <IHRE-IPV4>;
}
}
}
}
policy-options {
prefix-list meine-prefixe-v4 {
<IHR-PREFIX-V4>;
}
prefix-list meine-prefixe-v6 {
<IHR-PREFIX-V6>;
}
policy-statement frankonIX-import {
term rpki-invalid {
from validation-database invalid;
then reject;
}
term rest {
then accept;
}
}
policy-statement frankonIX-export-v4 {
term meine {
from {
prefix-list meine-prefixe-v4;
}
then accept;
}
then reject;
}
policy-statement frankonIX-export-v6 {
term meine {
from {
prefix-list meine-prefixe-v6;
}
then accept;
}
then reject;
}
}
protocols {
bgp {
group frankonIX-rs-v4 {
type external;
peer-as 214591;
local-address <IHRE-IPV4>;
family inet {
unicast {
prefix-limit {
maximum <MAXPFX-V4>;
teardown 90 idle-timeout 30;
}
}
}
import frankonIX-import;
export frankonIX-export-v4;
neighbor 193.34.203.193;
neighbor 193.34.203.194;
neighbor 193.34.203.195;
}
group frankonIX-rs-v6 {
type external;
peer-as 214591;
local-address <IHRE-IPV6>;
family inet6 {
unicast {
prefix-limit {
maximum <MAXPFX-V6>;
teardown 90 idle-timeout 30;
}
}
}
import frankonIX-import;
export frankonIX-export-v6;
neighbor 2001:7f8:15b:1::c122:cbc1;
neighbor 2001:7f8:15b:1::c122:cbc2;
neighbor 2001:7f8:15b:1::c122:cbc3;
}
}
}
Arista EOS
EOS enforces enforce-first-as by default – it must be disabled. Note that the RPKI syntax changed several times across EOS releases; rpki cache only exists from 4.24 onwards.
router bgp <IHRE-ASN>
router-id <IHRE-ROUTER-ID>
no bgp default ipv4-unicast
rpki cache rpki01
host 193.34.203.196 port 3323
preference 1
!
rpki cache rpki02
host 193.34.203.197 port 3323
preference 2
!
rpki origin-validation
ebgp local
!
neighbor frankonIX-v4 peer group
neighbor frankonIX-v4 remote-as 214591
no neighbor frankonIX-v4 enforce-first-as
neighbor frankonIX-v4 maximum-routes <MAXPFX-V4>
neighbor frankonIX-v4 route-map frankonIX-in in
neighbor frankonIX-v4 route-map frankonIX-out-v4 out
neighbor frankonIX-v6 peer group
neighbor frankonIX-v6 remote-as 214591
no neighbor frankonIX-v6 enforce-first-as
neighbor frankonIX-v6 maximum-routes <MAXPFX-V6>
neighbor frankonIX-v6 route-map frankonIX-in in
neighbor frankonIX-v6 route-map frankonIX-out-v6 out
neighbor 193.34.203.193 peer group frankonIX-v4
neighbor 193.34.203.194 peer group frankonIX-v4
neighbor 193.34.203.195 peer group frankonIX-v4
neighbor 2001:7f8:15b:1::c122:cbc1 peer group frankonIX-v6
neighbor 2001:7f8:15b:1::c122:cbc2 peer group frankonIX-v6
neighbor 2001:7f8:15b:1::c122:cbc3 peer group frankonIX-v6
address-family ipv4
neighbor frankonIX-v4 activate
!
address-family ipv6
neighbor frankonIX-v6 activate
!
ip prefix-list MEINE-V4 seq 10 permit <IHR-PREFIX-V4>
ipv6 prefix-list MEINE-V6 seq 10 permit <IHR-PREFIX-V6>
!
route-map frankonIX-in deny 10
match origin-as validity invalid
!
route-map frankonIX-in permit 20
!
route-map frankonIX-out-v4 permit 10
match ip address prefix-list MEINE-V4
!
route-map frankonIX-out-v6 permit 10
match ipv6 address prefix-list MEINE-V6
!
Cisco IOS-XR
IOS-XR can disable enforce-first-as per neighbour – done here via the neighbour group.
router bgp <IHRE-ASN>
bgp router-id <IHRE-ROUTER-ID>
rpki server 193.34.203.196
transport tcp port 3323
refresh-time 600
!
rpki server 193.34.203.197
transport tcp port 3323
refresh-time 600
!
address-family ipv4 unicast
bgp origin-as validation enable
!
address-family ipv6 unicast
bgp origin-as validation enable
!
neighbor-group frankonIX-v4
remote-as 214591
enforce-first-as disable
address-family ipv4 unicast
maximum-prefix <MAXPFX-V4> 90
route-policy frankonIX-in in
route-policy frankonIX-out-v4 out
!
!
neighbor-group frankonIX-v6
remote-as 214591
enforce-first-as disable
address-family ipv6 unicast
maximum-prefix <MAXPFX-V6> 90
route-policy frankonIX-in in
route-policy frankonIX-out-v6 out
!
!
neighbor 193.34.203.193
use neighbor-group frankonIX-v4
!
neighbor 193.34.203.194
use neighbor-group frankonIX-v4
!
neighbor 193.34.203.195
use neighbor-group frankonIX-v4
!
neighbor 2001:7f8:15b:1::c122:cbc1
use neighbor-group frankonIX-v6
!
neighbor 2001:7f8:15b:1::c122:cbc2
use neighbor-group frankonIX-v6
!
neighbor 2001:7f8:15b:1::c122:cbc3
use neighbor-group frankonIX-v6
!
!
prefix-set meine-v4
<IHR-PREFIX-V4>
end-set
!
prefix-set meine-v6
<IHR-PREFIX-V6>
end-set
!
route-policy frankonIX-in
if validation-state is invalid then
drop
endif
pass
end-policy
!
route-policy frankonIX-out-v4
if destination in meine-v4 then
pass
else
drop
endif
end-policy
!
route-policy frankonIX-out-v6
if destination in meine-v6 then
pass
else
drop
endif
end-policy
!
Cisco IOS / IOS-XE
no bgp enforce-first-as is mandatory. Careful: on this platform the command applies globally, not per neighbour – your other eBGP sessions lose the check as well.
router bgp <IHRE-ASN>
bgp router-id <IHRE-ROUTER-ID>
no bgp enforce-first-as
bgp log-neighbor-changes
no bgp default ipv4-unicast
bgp rpki server tcp 193.34.203.196 port 3323 refresh 600
bgp rpki server tcp 193.34.203.197 port 3323 refresh 600
neighbor FRANKONIX-V4 peer-group
neighbor FRANKONIX-V4 remote-as 214591
neighbor FRANKONIX-V6 peer-group
neighbor FRANKONIX-V6 remote-as 214591
neighbor 193.34.203.193 peer-group FRANKONIX-V4
neighbor 193.34.203.194 peer-group FRANKONIX-V4
neighbor 193.34.203.195 peer-group FRANKONIX-V4
neighbor 2001:7F8:15B:1::C122:CBC1 peer-group FRANKONIX-V6
neighbor 2001:7F8:15B:1::C122:CBC2 peer-group FRANKONIX-V6
neighbor 2001:7F8:15B:1::C122:CBC3 peer-group FRANKONIX-V6
address-family ipv4
neighbor FRANKONIX-V4 activate
neighbor FRANKONIX-V4 maximum-prefix <MAXPFX-V4> 90
neighbor FRANKONIX-V4 route-map FRANKONIX-IN in
neighbor FRANKONIX-V4 route-map FRANKONIX-OUT-V4 out
exit-address-family
address-family ipv6
neighbor FRANKONIX-V6 activate
neighbor FRANKONIX-V6 maximum-prefix <MAXPFX-V6> 90
neighbor FRANKONIX-V6 route-map FRANKONIX-IN in
neighbor FRANKONIX-V6 route-map FRANKONIX-OUT-V6 out
exit-address-family
!
ip prefix-list MEINE-V4 seq 10 permit <IHR-PREFIX-V4>
ipv6 prefix-list MEINE-V6 seq 10 permit <IHR-PREFIX-V6>
!
route-map FRANKONIX-IN deny 10
match rpki invalid
!
route-map FRANKONIX-IN permit 20
!
route-map FRANKONIX-OUT-V4 permit 10
match ip address prefix-list MEINE-V4
!
route-map FRANKONIX-OUT-V6 permit 10
match ipv6 address prefix-list MEINE-V6
!
BIRD 2
enforce first as is off by default in BIRD – nothing to do.
log syslog all;
router id <IHRE-ROUTER-ID>;
define MYAS = <IHRE-ASN>;
roa4 table r4;
roa6 table r6;
protocol rpki rpki01 {
roa4 { table r4; };
roa6 { table r6; };
remote "193.34.203.196" port 3323;
retry keep 90;
refresh keep 600;
expire keep 7200;
}
protocol rpki rpki02 {
roa4 { table r4; };
roa6 { table r6; };
remote "193.34.203.197" port 3323;
retry keep 90;
refresh keep 600;
expire keep 7200;
}
# RPKI-invalide Routen verwerfen.
# Hinweis: "-> bool" setzt BIRD >= 2.14 voraus.
# Auf aelteren Versionen die Angabe weglassen.
function rpki_ok() -> bool
{
if ( net.type = NET_IP4 && roa_check(r4, net, bgp_path.last) = ROA_INVALID ) then
return false;
if ( net.type = NET_IP6 && roa_check(r6, net, bgp_path.last) = ROA_INVALID ) then
return false;
return true;
}
filter frankonIX_in
{
if !rpki_ok() then reject;
accept;
}
filter frankonIX_out_v4
{
if ( net = <IHR-PREFIX-V4> ) then accept;
reject;
}
filter frankonIX_out_v6
{
if ( net = <IHR-PREFIX-V6> ) then accept;
reject;
}
template bgp frankonIX_v4 {
local <IHRE-IPV4> as MYAS;
ipv4 {
import filter frankonIX_in;
export filter frankonIX_out_v4;
import limit <MAXPFX-V4> action restart;
};
}
template bgp frankonIX_v6 {
local <IHRE-IPV6> as MYAS;
ipv6 {
import filter frankonIX_in;
export filter frankonIX_out_v6;
import limit <MAXPFX-V6> action restart;
};
}
protocol bgp rs01_v4 from frankonIX_v4 { neighbor 193.34.203.193 as 214591; }
protocol bgp rs02_v4 from frankonIX_v4 { neighbor 193.34.203.194 as 214591; }
protocol bgp rs03_v4 from frankonIX_v4 { neighbor 193.34.203.195 as 214591; }
protocol bgp rs01_v6 from frankonIX_v6 { neighbor 2001:7f8:15b:1::c122:cbc1 as 214591; }
protocol bgp rs02_v6 from frankonIX_v6 { neighbor 2001:7f8:15b:1::c122:cbc2 as 214591; }
protocol bgp rs03_v6 from frankonIX_v6 { neighbor 2001:7f8:15b:1::c122:cbc3 as 214591; }
FRRouting
As of FRR 10.0 enforce-first-as is enabled by default and must be disabled for the route servers.
rpki
rpki cache 193.34.203.196 3323 preference 1
rpki cache 193.34.203.197 3323 preference 2
exit
router bgp <IHRE-ASN>
bgp router-id <IHRE-ROUTER-ID>
no bgp ebgp-requires-policy
no bgp default ipv4-unicast
neighbor frankonIX-v4 peer-group
neighbor frankonIX-v4 remote-as 214591
no neighbor frankonIX-v4 enforce-first-as
neighbor frankonIX-v6 peer-group
neighbor frankonIX-v6 remote-as 214591
no neighbor frankonIX-v6 enforce-first-as
neighbor 193.34.203.193 peer-group frankonIX-v4
neighbor 193.34.203.194 peer-group frankonIX-v4
neighbor 193.34.203.195 peer-group frankonIX-v4
neighbor 2001:7f8:15b:1::c122:cbc1 peer-group frankonIX-v6
neighbor 2001:7f8:15b:1::c122:cbc2 peer-group frankonIX-v6
neighbor 2001:7f8:15b:1::c122:cbc3 peer-group frankonIX-v6
address-family ipv4 unicast
neighbor frankonIX-v4 activate
neighbor frankonIX-v4 maximum-prefix <MAXPFX-V4>
neighbor frankonIX-v4 route-map frankonIX-in in
neighbor frankonIX-v4 route-map frankonIX-out-v4 out
exit-address-family
address-family ipv6 unicast
neighbor frankonIX-v6 activate
neighbor frankonIX-v6 maximum-prefix <MAXPFX-V6>
neighbor frankonIX-v6 route-map frankonIX-in in
neighbor frankonIX-v6 route-map frankonIX-out-v6 out
exit-address-family
exit
ip prefix-list MEINE-V4 seq 10 permit <IHR-PREFIX-V4>
ipv6 prefix-list MEINE-V6 seq 10 permit <IHR-PREFIX-V6>
route-map frankonIX-in deny 10
match rpki invalid
exit
route-map frankonIX-in permit 20
exit
route-map frankonIX-out-v4 permit 10
match ip address prefix-list MEINE-V4
exit
route-map frankonIX-out-v6 permit 10
match ipv6 address prefix-list MEINE-V6
exit
VyOS
VyOS uses FRR underneath, and FRR ≥ 10 enables the check by default; newer VyOS builds disable it again for neighbours without an explicit setting. Please verify after committing: vtysh -c "show run" | grep enforce-first-as. If an active line shows up and the session will not come up, get in touch with us.
set protocols rpki cache 193.34.203.196 port '3323'
set protocols rpki cache 193.34.203.196 preference '1'
set protocols rpki cache 193.34.203.197 port '3323'
set protocols rpki cache 193.34.203.197 preference '2'
set protocols bgp system-as '<IHRE-ASN>'
set protocols bgp parameters router-id '<IHRE-ROUTER-ID>'
set protocols bgp peer-group frankonIX-v4 remote-as '214591'
set protocols bgp peer-group frankonIX-v4 address-family ipv4-unicast maximum-prefix '<MAXPFX-V4>'
set protocols bgp peer-group frankonIX-v4 address-family ipv4-unicast route-map import 'frankonIX-in'
set protocols bgp peer-group frankonIX-v4 address-family ipv4-unicast route-map export 'frankonIX-out-v4'
set protocols bgp peer-group frankonIX-v6 remote-as '214591'
set protocols bgp peer-group frankonIX-v6 address-family ipv6-unicast maximum-prefix '<MAXPFX-V6>'
set protocols bgp peer-group frankonIX-v6 address-family ipv6-unicast route-map import 'frankonIX-in'
set protocols bgp peer-group frankonIX-v6 address-family ipv6-unicast route-map export 'frankonIX-out-v6'
set protocols bgp neighbor 193.34.203.193 peer-group 'frankonIX-v4'
set protocols bgp neighbor 193.34.203.194 peer-group 'frankonIX-v4'
set protocols bgp neighbor 193.34.203.195 peer-group 'frankonIX-v4'
set protocols bgp neighbor 2001:7f8:15b:1::c122:cbc1 peer-group 'frankonIX-v6'
set protocols bgp neighbor 2001:7f8:15b:1::c122:cbc2 peer-group 'frankonIX-v6'
set protocols bgp neighbor 2001:7f8:15b:1::c122:cbc3 peer-group 'frankonIX-v6'
set policy prefix-list MEINE-V4 rule 10 action 'permit'
set policy prefix-list MEINE-V4 rule 10 prefix '<IHR-PREFIX-V4>'
set policy prefix-list6 MEINE-V6 rule 10 action 'permit'
set policy prefix-list6 MEINE-V6 rule 10 prefix '<IHR-PREFIX-V6>'
set policy route-map frankonIX-in rule 10 action 'deny'
set policy route-map frankonIX-in rule 10 match rpki 'invalid'
set policy route-map frankonIX-in rule 20 action 'permit'
set policy route-map frankonIX-out-v4 rule 10 action 'permit'
set policy route-map frankonIX-out-v4 rule 10 match ip address prefix-list 'MEINE-V4'
set policy route-map frankonIX-out-v6 rule 10 action 'permit'
set policy route-map frankonIX-out-v6 rule 10 match ipv6 address prefix-list 'MEINE-V6'
OpenBGPD
OpenBGPD has no enforce first-as. The equivalent option is enforce neighbor-as, which defaults to yes for EBGP – it needs to be no.
AS <IHRE-ASN>
router-id <IHRE-ROUTER-ID>
rtr 193.34.203.196 {
descr "frankonIX rpki01"
port 3323
}
rtr 193.34.203.197 {
descr "frankonIX rpki02"
port 3323
}
prefix-set meine-v4 {
<IHR-PREFIX-V4>
}
prefix-set meine-v6 {
<IHR-PREFIX-V6>
}
group "frankonIX-v4" {
remote-as 214591
enforce neighbor-as no
max-prefix <MAXPFX-V4> restart 15
local-address <IHRE-IPV4>
neighbor 193.34.203.193 { descr "RS01 IPv4" }
neighbor 193.34.203.194 { descr "RS02 IPv4" }
neighbor 193.34.203.195 { descr "RS03 IPv4" }
}
group "frankonIX-v6" {
remote-as 214591
enforce neighbor-as no
max-prefix <MAXPFX-V6> restart 15
local-address <IHRE-IPV6>
neighbor 2001:7f8:15b:1::c122:cbc1 { descr "RS01 IPv6" }
neighbor 2001:7f8:15b:1::c122:cbc2 { descr "RS02 IPv6" }
neighbor 2001:7f8:15b:1::c122:cbc3 { descr "RS03 IPv6" }
}
# OpenBGPD wertet von oben nach unten aus; es gewinnt die LETZTE
# zutreffende Regel - ausser bei "quick", das sofort abbricht.
allow from any
deny quick from ebgp ovs invalid
deny to group "frankonIX-v4"
allow to group "frankonIX-v4" prefix-set meine-v4
deny to group "frankonIX-v6"
allow to group "frankonIX-v6" prefix-set meine-v6
What to check once it is up
- Six sessions established – three IPv4, three IPv6. Fewer than that is a configuration problem, not something we did on purpose.
- RTR sessions established to both validators, and the ROA table populated. An empty table with an established session means the initial sync is still running – that takes a few minutes after start-up.
-
Your prefixes arrive. Check in the looking glass whether
they show up on all three route servers, and whether a
214591:1101:*community is attached.
Common problems
| Symptom | Cause |
|---|---|
Session stays in Active / Connect |
Wrong peering IP, or the VLAN is not tagged on your port |
| Session comes up but we send you no routes | enforce-first-as is active – see your platform above |
| Nobody receives your routes | Check the 1101:* community in the looking glass. Usually :9 or :10 – the prefix is missing from your AS-SET |
| Only some of your prefixes get through | Prefix limit reached, or prefixes longer than /24 resp. /48 |
| RTR session will not come up | Did you configure port 3323 rather than 323? |
| Routes only appear hours after an IRR change | The IRRDB refresh runs every six hours |
Questions? Support & Contact