exabgp.conf(5) Configuration file controlling the BGP configuration for

DESCRIPTION

CONFIGURATION FILE SYNTAX

group <groupname> {
  // Most if not all the attributes under neighbor can be defined
  // at the group level as well, and the settings will be inherited
  // unless overridden in the neighbor section
  neighbor <ip-address> {
    description <text>;
    router-id <router-id>;
    local-address <ip-address>;
    local-as <asn>;
    peer-as <asn>;
    passive;
    hold-time <seconds>;
    md5 <md5-secret>;
    ttl-security;
    group-updates;
    aigp <truthvalue>;
    route-refresh <truthvalue>;
    graceful-restart <...>;
    multi-session <truthvalue);
    add-path <path>;
    auto-flush <truthvalue>;
    adj-rib-out <truthvalue>;
    // Can also have the groups listed under group <gn> { } below:
    static {
    }
    flow {
    }
    l2vpn {
    }
    process {
    }
    family {
    }
    capability {
    }
    operational {
    }
  }
  static {
    route <ip-address>/<prefixlength> {
      next-hop <ip-address>; // only mandatory attribute
      origin ( IGP | EGP | INCOMPLETE );
      as-path [ <as-sequence-asn> | ( <as-set ) ];
      as-sequence
      med <med>;
      aigp <aigp>;
      local-preference <preference>;
      atomic-aggregate;
      aggregator <asn>:<ip-address>;
      path-information <ip-address>;
      community ( <community> | [ <community> <community> ... ] );
      originator-id <ip-address>;
      cluster-list ( <ip-address> | [ <ip-address> <ip-address> ... ] );
      extended-community ( <extended-community> |
                           [ <extended-community>
                             <extended-community> ... ] );
      split /<prefixlength>;
      label ( <label> | [ <label> <label> ... ] );
      ( rd | route-distinguisher ) <route-distinguisher>;
      watchdog <watchdog-name>;
      withdraw;
    }
    // or alternatively
    route <ip-address>/<prefixlength> <attribute-sequence>;
    // where <attribute-sequence> is a sequence of
    // any of the attributes above
  }
  flow {
    route <route-name> {
      (rd | route-distinguisher ) <route-distinguisher>;
      next-hop <ip-address>; // for redirect-to-nexthop
      match {
        // one or more match terms
        source <ip-address>/<prefixlength>;
        destination <ip-address>/<prefixlength>;
        port <portnumber>;
        source-port <portnumber>;
        destination-port <portnumber-expression>;
        protocol [ udp | tcp ]; // IPv4 only
        next-header [ udp | tcp ]; // IPv6 only
        tcp-flags [ fin | syn | rst | push | ack | urgent ];
        icmp-type [ echo-reply | echo-request | info-reply |
                    info-request | mask-reply | mask-request |
                    parameter-problem | redirect | router-advertisment |
                    router-solicit | source-quench | time-exceeded |
                    timestamp | timestamp-reply | unreachable ];
        icmp-code [ communication-prohibited-by-filtering |
                    destination-host-prohibited |
                    destination-host-unknown |
                    destination-network-unknown | 
                    fragmentation-needed | host-precedence-violation |
                    ip-header-bad | network-unreachable |
                    network-unreachable-for-tos | port-unreachable | 
                    redirect-for-host | redirect-for-network |
                    redirect-for-tos-and-host |
                    redirect-for-tos-and-net |
                    required-option-missing | source-host-isolated |
                    source-route-failed |
                    ttl-eq-zero-during-reassembly |
                    ttl-eq-zero-during-transit ];
        fragment [ not-a-fragment | dont-fragment | is-fragment |
                   first-fragment | last-fragment ];
        // fragment is IPv4 only, poorly tested
        dscp <dscp-value>;
        traffic-class <traffic-class>;
        packet-length <packet-length-expression>;
        flow-label <flow-label-expression>; // IPv6 only
      }
      then {
        // one action only
        accept;
        discard;
        rate-limit <ratelimit>;
        redirect ( <route-distinguisher> | <ip-address> );
        redirect-to-nexthop; // Ref. next-hop above
        copy <ip-address>;
        mark <mark>;
        action ( sample | terminal | sample-terminal );
        community
        extended-community
      }
    }
  }
  l2vpn {
    vpls <site-name> {
      next-hop <ip-address>;
      origin ( IGP | EGP | INCOMPLETE );
      as-path [ <as-sequence-asn> | ( <as-set ) ];
      med <med>;
      local-preference <preference>;
      community ( <community> | [ <community> <community> ... ] );
      originator-id <ip-address>;
      cluster-list [ <ip-address> <ip-address> ... ];
      extended-community ( <extended-community> |
                           [ <extended-community>
                             <extended-community> ... ] );
      ( rd | route-distinguisher ) <route-distinguisher>;
      withdraw;
      endpoint ( <vpls-endpoint> | <integer> );
      offset ( <block-offset> | <integer> );
      size ( <block-size> | <integer> );
      base ( <label-base> | <integer> );
      name <route-name>;
  }
  process {
    run <command> <args>;
  }
  family {
    all; // default, or a list of the below
    minimal; // use AFI/SAFI required to announce routes in config
    ipv4 unicast;
    ipv4 multicast;
    ipv4 nlri-mpls;
    ipv4 mpls-vpn;
    ipv4 flow;
    ipv4 flow-vpn;
    ipv6 unicast;
    ipv6 flow;
    ipv6 flow-vpn;
  }
  capability {
    graceful-restart <seconds>;
    asn4 ( enable | disable );
    add-path ( disable | send | receive | send/receive );
    multi-session ( enable | disable );
    operational ( enable | disable );
  }
  operational {
    // ??
  }
}
neighbor <ip-address> {
  // Attributes and sections as for under
  // group <groupname> { neighbor <neighbor> {
  // ref. above
}

Please note that multi-line sections really do need to be written as multiple lines: the first one ending in "{", and ending with a line with a "}" by itself.

CAVEATS