mrlesmithjr.frr

Table des Matières générée avec DocToc

ansible-frr

Rôle Ansible pour installer/configurer FRR

REMARQUE : FRRouting (FRR) est un ensemble de protocoles de routage IP pour Linux et les plateformes Unix, qui inclut des démons de protocole pour BFD, BGP, IS-IS, LDP, OSPF, PIM et RIP.

Statut de Construction

Actions GitHub

Test Molécule

Travis CI

Statut de Construction

Exigences

Pour les rôles Ansible requis, consultez : requirements.yml

Variables de Rôle

defaults/main.yml

Dépendances

Exemple de Playbook

playbook.yml

Cartes de Routes et Listes de Préfixes

Cartes de Routes

Configuration des Cartes de Routes

Voici un exemple de configuration des Cartes de Routes :

frr_route_map:
  RTBH:
    permit 10:
      interface: blackhole
      prefix_list: Bad_IPs
      origin: igp
      community: "12345:100"
      src: 2001:db8::bf03
  RTBH_IN:
    deny 10: []

Options Générales

Transfert IP/IPv6

Voici un exemple d'activation du transfert IP et IPv6 :

frr_ip_forwarding: true
frr_ipv6_forwarding: true

Pour activer le transfert kernel, le rôle définit les variables sysctl net.ipv4.ip_forward et net.ipv6.conf.all.forwarding. Pour personnaliser l'emplacement de la configuration sysctl, la variable suivante peut être utilisée :

frr_sysctl_file: /etc/sysctl.d/100-ansible-frr.conf

Suivi du prochain saut via la route par défaut

Résoudre les prochains sauts en utilisant la route par défaut ; cela est utile si le pair BGP est uniquement accessible via la passerelle par défaut (désactivé par défaut).

Pour activer :

frr_nht_resolve_default: true

Listes de Préfixes

Configuration des Listes de Préfixes

Voici un exemple de configuration des Listes de Préfixes :

frr_prefix_list:
  Bad_IPs:
    05 permit:
      prefix: 192.168.88.0/24
      match: ge 32
    10 permit:
      prefix: 172.16.0.0/16
      match: le 32
frr_prefix_list_v6:
  Bad_IPs:
    05 permit:
      prefix: 1234:5678::/32
      match: ge 128

Listes d'Accès

Configuration des Listes d'Accès

Voici un exemple :

frr_access_list:
  - "10 permit 10.10.10.21/32"
  - "10 permit 192.168.0.0/17"
  - "101 permit ip 10.0.0.0 0.0.0.255 any"

Détection de Transfert Bidirectionnel (BFD)

Activer BFD

Pour activer BFD, assurez-vous que bfdd: true est configuré sous :

frr_daemons:
  bfdd: true
  bgpd: false
  isisd: false
  ldpd: false
  nhrpd: false
  ospf6d: false
  ospfd: false
  pimd: false
  ripd: false
  ripngd: false
  zebra: true

Configuration de BFD

La configuration de BFD se fait sous les paramètres voisins BGP. BFD pour OSPF n'est pas encore pris en charge.

Protocoles de Routage Supportés

Protocole Implémenté Remarques
BGP X Seulement la config initiale
OSPF X Seulement la config initiale
STATIC X Seulement la config initiale

BGP

Activer BGP

Pour activer le routage BGP, assurez-vous que bgpd: true est configuré sous :

frr_daemons:
  bfdd: false
  bgpd: false
  isisd: false
  ldpd: false
  nhrpd: false
  ospf6d: false
  ospfd: false
  pimd: false
  ripd: false
  ripngd: false
  zebra: true

Configuration de BGP

Pour configurer BGP, définissez ce qui suit en fonction de vos besoins :

frr_bgp:
  asns:
    65000:
      log_neighbor_changes: true
      no_ebgp_requires_policy: true
      timers: '3 9'
      other:
        - "bgp bestpath as-path multipath-relax"
        - "no bgp network import-check"
      neighbors:
        group1:
          asn: 66000
          is_peer_group: true
          multihop: 255
        192.168.250.11:
          asn: 65000
          default_originate: false
          description: node1
          next_hop_self: true
          timers_connect: 5
          v6only: true
          bfd_peer: true
          bfd_peer_detect_multiplier: 3
          bfd_peer_receive_interval: 50
          bfd_peer_transmit_interval: 50
          bfd_peer_echo_interval: 50
          bfd_peer_passive_mode: true
          bfd_peer_minimum_ttl: 253
          other:
            - "capability dynamic"
        192.168.250.12:
          asn: 65000
          default_originate: false
          description: node2
          next_hop_self: true
          v4_route_reflector_client: true
          password: secret
          bfd_peer: true
          bfd_peer_transmit_interval: 2000
          bfd_peer_echo_mode: true
          other:
            - "prefix-list Bad_IPs in"
        192.168.250.12:
          peer_group: group1
          description: far_away
      listen_range:
        192.168.250.0/24: group1
      networks:
        - "{{ frr_router_id }}/32"
        - "{{ hostvars[inventory_hostname]['ansible_enp0s8']['ipv4']['address'] }}/24"
      redistribute:
        - bgp
        - connected
        - kernel
        - ospf
        - static
      redistribute_v6:
        - bgp
        - connected
        - kernel

Exemple BGP

Voici un exemple de configuration BGP :

frr_bgp:
  asns:
    65000:
      log_neighbor_changes: true
      af_v4:
        - "maximum-paths 2"
      af_v6:
        - "maximum-paths 2"
      af_evpn:
        - "advertise-all-vni"
        - "rd {{ frr_router_id }}:1"
      neighbors:
        192.168.250.11:
          asn: 65000
          default_originate: false
          description: node1
          next_hop_self: true
          af_v4:
            - "soft-reconfiguration inbound"
        192.168.250.12:
          asn: 65000
          default_originate: false
          description: node2
          next_hop_self: true
        "::1":
          asn: 65000
          default_originate: false
          description: node1
          next_hop_self: true
          af_v6:
            - "activate"
            - "soft-reconfiguration inbound"
        172.16.250.10:
          asn: internal
          timers_connect: 5
          description: "Voisin L2VPN EVPN"
          af_evpn:
            - "activate"
          other:
            - "capability extended-nexthop"
      networks:
        - "{{ frr_router_id }}/32"
        - "{{ hostvars[inventory_hostname]['ansible_enp0s8']['ipv4']['address'] }}/24"
        - "{{ hostvars[inventory_hostname]['ansible_enp0s9']['ipv4']['address'] }}/24"
        - "{{ hostvars[inventory_hostname]['ansible_enp0s10']['ipv4']['address'] }}/24"
        - "{{ hostvars[inventory_hostname]['ansible_enp0s16']['ipv4']['address'] }}/24"
      networks_v6:
        - "1::3/64"

Voici un exemple de résumé BGP basé sur la configuration ci-dessus :

La version de la table BGP est 13, l'ID du routeur local est 1.1.1.1
Codes d'état : s supprimé, d amorti, h historique, * valide, > meilleur, = multipath,
              i interne, r échec du RIB, S obsolète, R supprimé
Codes d'origine : i - IGP, e - EGP, ? - incomplet

   Réseau          Prochain saut            Métrique LocPrf Poids Chemin
*> 1.1.1.1/32       0.0.0.0                  0         32768 i
*>i2.2.2.2/32       192.168.250.11           0    100      0 i
*>i3.3.3.3/32       192.168.250.12           0    100      0 i
*> 192.168.10.0     0.0.0.0                  0         32768 i
*>i192.168.11.0     192.168.250.11           0    100      0 i
*>i192.168.12.0     192.168.250.12           0    100      0 i
*> 192.168.20.0     0.0.0.0                  0         32768 i
*>i192.168.21.0     192.168.250.11           0    100      0 i
*>i192.168.22.0     192.168.250.12           0    100      0 i
*> 192.168.30.0     0.0.0.0                  0         32768 i
*>i192.168.31.0     192.168.250.11           0    100      0 i
*>i192.168.32.0     192.168.250.12           0    100      0 i
* i192.168.250.0    192.168.250.11           0    100      0 i
* i                 192.168.250.12           0    100      0 i
*>                  0.0.0.0                  0         32768 i

Affichés  13 routes et 15 chemins au total

OSPF

Activer OSPF

Pour activer le routage OSPF, assurez-vous que ospfd: true est configuré sous :

frr_daemons:
  bfdd: false
  bgpd: false
  isisd: false
  ldpd: false
  nhrpd: false
  ospf6d: false
  ospfd: false
  pimd: false
  ripd: false
  ripngd: false
  zebra: true

Configuration de OSPF

Pour configurer OSPF, définissez ce qui suit selon vos besoins :

frr_ospf:
  areas:
    0:
      networks:
        - "{{ frr_router_id }}/32"
    1:
      networks:
        - "{{ hostvars[inventory_hostname]['ansible_enp0s8']['ipv4']['address'] }}/24"
      auth: true

    2:
      networks:
        - "{{ hostvars[inventory_hostname]['ansible_enp0s9']['ipv4']['address'] }}/24"
      type: nssa

  log_adjacency_changes: true
  passive_interfaces: # Une liste d'interfaces à rendre passives
    - default
  redistribute: # Une liste de protocoles à redistribuer
    - bgp
    - connected
    - kernel
    - ospf
    - static
  distribute_list:
    - name: 10
      dir: out
      protocol: connected

OSPF sensible au VRF

Chaque clé sous frr_ospf_vrf_enabled représente le nom de VRF :

frr_ospf_vrf_enabled:
  public:
    redistribute:
    - bgp
    - connected
    passive_interfaces:
     - lo
    log_adjacency_changes: true
    areas:
      1:
        networks:
          - "{{ hostvars[inventory_hostname]['ansible_ens3']['ipv4']['address'] }}/30"
        auth: true
  mgmt:
    redistribute:
      - kernel
    areas:
      0:
        networks:
          - 172.16.0.0/12
      2:
        networks:
          - 192.168.0.0/16
        type: nssa

STATIC

Configuration des Routes STATIC

Pour configurer des routes statiques, définissez ce qui suit selon vos besoins :

frr_static: # Un dictionnaire. clé = destination, valeur = prochain saut
  10.0.0.0/8: 192.168.1.1
  1.1.1.1: 192.168.1.1
  1.1.1.2: blackhole
frr_static_v6: # Un dictionnaire. clé = destination, valeur = prochain saut
  2001:0db8:85a3:8a2e::/64 2001::1

Configuration des Interfaces

Interfaces

frr_interfaces: # Un dictionnaire. clé = nom de l'interface, valeur = données de l'interface
  lo:
    ip: 10.0.0.0/32 # ip peut être une seule valeur ou une liste
    ipv6: 2001:0db8:85a3:8a2e::1/64 # ipv6 peut être une seule valeur ou une liste
    description: loopback
  eth0:
    ip: # ip peut être une seule valeur ou une liste
      - 10.0.0.0/32
      - 172.16.0.0/32
    ipv6: # ipv6 peut être une seule valeur ou une liste
      - 2001:0db8:85a3:8a2e::1/64
      - 2001:0db8:85a3:8a2e::2/64
    vrf: management # mettre l'interface dans le VRF 'management'
    auth:
      id: 1
      key: supersecret
    other:
      - "no ipv6 nd suppress-ra"
      - "link-detect"

REMARQUE : Le dispositif doit avoir l'attribution correcte de VRF sur chaque interface consciente du VRF :

ip link set dev ${IFACE} master ${VRF}

Mise à Niveau/Dégrada

REMARQUE : FRR ne peut pas être dégradé à partir de 6.0.2 en utilisant ce rôle.

Vous pouvez mettre à niveau ou dégrader FRR en définissant la variable suivante :

frr_version: 6.0.2 depuis frr_version: 6.0

Configuration de Quagga

REMARQUE : Quagga doit être installé à partir des dépôts locaux de l'OS.

Vous pouvez configurer Quagga au lieu de FRR en utilisant la variable suivante :

routing_type: quagga

Configurations supplémentaires spécifiques à Quagga

frr_bgp:
  asns:
    65000:
      neighbors:
        swp1:
          **interface: true**

Licence

MIT

Informations sur l'Auteur

Larry Smith Jr.

Achetez-moi un café

REMARQUE : Le dépôt a été créé/mis à jour en utilisant https://github.com/mrlesmithjr/cookiecutter-ansible-role comme modèle.

À propos du projet

Ansible role to install/configure [FRR](https://frrouting.org/)

Installer
ansible-galaxy install mrlesmithjr.frr
Licence
mit
Téléchargements
102.6k
Propriétaire
Doing my thang with #automation #DevOps and cloudy things! Providing hopefully valuable content for others to consume easily and also learn from.