Konfigurationsbeispiele

Fertige Bausteine für die Anbindung an die frankonIX-Routeserver, einschließlich RPKI-Validierung. Alles, was Sie selbst eintragen müssen, steht als <PLATZHALTER>.

Die Beispiele sind bewusst knapp gehalten: drei Routeserver, beide Adressfamilien, RPKI, ein Prefix-Limit und ein Ausgangsfilter auf Ihre eigenen Prefixe. Sie ersetzen keine Prüfung gegen Ihre Softwareversion – gerade bei RPKI und enforce-first-as unterscheiden sich die Kommandos zwischen Releases derselben Plattform. Wo uns das bekannt ist, steht ein Hinweis dabei.

Alle Adressen, Filterregeln und Communities stehen auf der Seite Routeserver.

Was Sie eintragen müssen
PlatzhalterBedeutung
<IHRE-ASN>Ihre AS-Nummer
<IHRE-IPV4>Ihre Adresse aus 193.34.203.192/26
<IHRE-IPV6>Ihre Adresse aus 2001:7f8:15b:1::/64
<IHRE-ROUTER-ID>Ihre BGP-Router-ID
<MAXPFX-V4> / <MAXPFX-V6>Ihr Prefix-Limit je Adressfamilie
<IHR-PREFIX-V4> / <IHR-PREFIX-V6>Ihre anzukündigenden Prefixe

Kündigen Sie mehr als einen Prefix an, erweitern Sie die jeweilige Prefix-Liste entsprechend – in den Beispielen steht bewusst nur ein Eintrag. Zu den Prefix-Limits: Die Routeserver setzen ihrerseits ein Limit auf das, was sie von Ihnen annehmen; es stammt aus Ihren PeeringDB-Angaben. Ohne Eintrag greifen 250 (IPv4) und 50 (IPv6). Die Werte in Ihrer eigenen Konfiguration wählen Sie unabhängig davon – sie schützen Ihren Router.

Plattform wählen

Juniper Junos Arista EOS Cisco IOS-XR Cisco IOS / IOS-XE BIRD 2 FRRouting VyOS OpenBGPD


Juniper Junos

Junos erzwingt enforce-first-as nicht per Vorgabe – hier ist nichts abzuschalten. Achten Sie darauf, die Option nicht versehentlich zu setzen.

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 erzwingt enforce-first-as per Vorgabe – muss abgeschaltet werden. Die RPKI-Syntax hat sich über die EOS-Versionen mehrfach geändert; rpki cache gibt es erst ab 4.24.

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 kann enforce-first-as pro Nachbar abschalten – hier über die Neighbor-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 ist zwingend. Achtung: Der Befehl wirkt auf dieser Plattform global, nicht pro Nachbar – andere eBGP-Sessions verlieren die Prüfung mit.

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 ist in BIRD per Vorgabe aus – nichts zu tun.

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

Ab FRR 10.0 ist enforce-first-as per Vorgabe aktiv und muss für die Routeserver abgeschaltet werden.

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 setzt intern FRR ein, und FRR ≥ 10 aktiviert die Prüfung per Vorgabe; neuere VyOS-Stände schalten sie für Nachbarn ohne ausdrückliche Angabe wieder ab. Bitte nach dem Commit gegenprüfen: vtysh -c "show run" | grep enforce-first-as. Steht dort eine aktive Zeile und die Session kommt nicht hoch, melden Sie sich bei uns.

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 kennt kein enforce first-as. Die entsprechende Option heißt enforce neighbor-as und steht bei EBGP per Vorgabe auf yes – sie muss auf 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

Nach dem Einschalten prüfen

  1. Sechs Sessions established – drei IPv4, drei IPv6. Weniger ist ein Konfigurationsfehler, keine Absicht unsererseits.
  2. RTR-Sessions established zu beiden Validatoren, und die ROA-Tabelle ist gefüllt. Eine leere Tabelle bei established Session heißt, dass der erste Sync noch läuft – das dauert nach dem Start einige Minuten.
  3. Ihre Prefixe kommen an. Im Looking Glass nachsehen, ob sie auf allen drei Routeservern stehen und ob eine 214591:1101:*-Community dranhängt.

Häufige Fehler

SymptomUrsache
Session bleibt Active / Connect Falsche Peering-IP, oder das VLAN ist nicht auf Ihrem Port getaggt
Session kommt hoch, aber keine Routen von uns enforce-first-as aktiv – siehe Ihre Plattform oben
Ihre Routen kommen bei niemandem an Im Looking Glass die 1101:*-Community prüfen. Meist :9 oder :10 – dann fehlt der Prefix in Ihrem AS-SET
Nur ein Teil Ihrer Prefixe kommt durch Prefix-Limit erreicht, oder Prefixe länger als /24 bzw. /48
RTR-Session kommt nicht hoch Port 3323 statt 323 eingetragen?
Routen erscheinen erst Stunden nach einer IRR-Änderung Die IRRDB-Aktualisierung läuft alle sechs Stunden

Fragen? Support & Kontakt