# This is a basic configuration file, which contains boilerplate options and # some basic examples. It allows the BIRD daemon to start but will not cause # anything else to happen. # # Please refer to the BIRD User's Guide documentation, which is also available # online at http://bird.network.cz/ in HTML format, for more information on # configuring BIRD and adding routing protocols. # Configure logging log syslog all; # log "/var/log/bird.log" { debug, trace, info, remote, warning, error, auth, fatal, bug }; # Set router ID. It is a unique identification of your router, usually one of # IPv4 addresses of the router. It is recommended to configure it explicitly. # router id 198.51.100.1; # Turn on global debugging of all protocols (all messages or just selected classes) # debug protocols all; # debug protocols { events, states }; # Turn on internal watchdog # watchdog warning 5 s; # watchdog timeout 30 s; # You can define your own constants # define my_asn = 65000; # define my_addr = 198.51.100.1; # Tables master4 and master6 are defined by default # ipv4 table master4; # ipv6 table master6; # Define more tables, e.g. for policy routing or as MRIB # ipv4 table mrib4; # ipv6 table mrib6; # The Device protocol is not a real routing protocol. It does not generate any # routes and it only serves as a module for getting information about network # interfaces from the kernel. It is necessary in almost any configuration. protocol device { } # The direct protocol is not a real routing protocol. It automatically generates # direct routes to all network interfaces. Can exist in as many instances as you # wish if you want to populate multiple routing tables with direct routes. protocol direct { disabled; # Disable by default ipv4; # Connect to default IPv4 table ipv6; # ... and to default IPv6 table } # The Kernel protocol is not a real routing protocol. Instead of communicating # with other routers in the network, it performs synchronization of BIRD # routing tables with the OS kernel. One instance per table. protocol kernel { ipv4 { # Connect protocol to IPv4 table by channel # table master4; # Default IPv4 table is master4 # import all; # Import to table, default is import all export all; # Export to protocol. default is export none }; # learn; # Learn alien routes from the kernel # kernel table 10; # Kernel table to synchronize with (default: main) } # Another instance for IPv6, skipping default options protocol kernel { ipv6 { export all; }; } # Static routes (Again, there can be multiple instances, for different address # families and to disable/enable various groups of static routes on the fly). protocol static { ipv4; # Again, IPv4 channel with default options # route 0.0.0.0/0 via 198.51.100.10; # route 192.0.2.0/24 blackhole; # route 10.0.0.0/8 unreachable; # route 10.2.0.0/24 via "eth0"; # # Static routes can be defined with optional attributes # route 10.1.1.0/24 via 198.51.100.3 { rip_metric = 3; }; # route 10.1.2.0/24 via 198.51.100.3 { ospf_metric1 = 100; }; # route 10.1.3.0/24 via 198.51.100.4 { ospf_metric2 = 100; }; } # Pipe protocol connects two routing tables. Beware of loops. # protocol pipe { # table master4; # No ipv4/ipv6 channel definition like in other protocols # peer table mrib4; # import all; # Direction peer table -> table # export all; # Direction table -> peer table # } # RIP example, both RIP and RIPng are supported # protocol rip { # ipv4 { # # Export direct, static routes and ones from RIP itself # import all; # export where source ~ [ RTS_DEVICE, RTS_STATIC, RTS_RIP ]; # }; # interface "eth*" { # update time 10; # Default period is 30 # timeout time 60; # Default timeout is 180 # authentication cryptographic; # No authentication by default # password "hello" { algorithm hmac sha256; }; # Default is MD5 # }; # } # OSPF example, both OSPFv2 and OSPFv3 are supported # protocol ospf v3 { # ipv6 { # import all; # export where source = RTS_STATIC; # }; # area 0 { # interface "eth*" { # type broadcast; # Detected by default # cost 10; # Interface metric # hello 5; # Default hello perid 10 is too long # }; # interface "tun*" { # type ptp; # PtP mode, avoids DR selection # cost 100; # Interface metric # hello 5; # Default hello perid 10 is too long # }; # interface "dummy0" { # stub; # Stub interface, just propagate it # }; # }; #} # Define simple filter as an example for BGP import filter # See https://gitlab.labs.nic.cz/labs/bird/wikis/BGP_filtering for more examples # filter rt_import # { # if bgp_path.first != 64496 then accept; # if bgp_path.len > 64 then accept; # if bgp_next_hop != from then accept; # reject; # } # BGP example, explicit name 'uplink1' is used instead of default 'bgp1' # protocol bgp uplink1 { # description "My BGP uplink"; # local 198.51.100.1 as 65000; # neighbor 198.51.100.10 as 64496; # hold time 90; # Default is 240 # password "secret"; # Password used for MD5 authentication # # ipv4 { # regular IPv4 unicast (1/1) # import filter rt_import; # export where source ~ [ RTS_STATIC, RTS_BGP ]; # }; # # ipv6 { # regular IPv6 unicast (2/1) # import filter rt_import; # export filter { # The same as 'where' expression above # if source ~ [ RTS_STATIC, RTS_BGP ] # then accept; # else reject; # }; # }; # # ipv4 multicast { # IPv4 multicast topology (1/2) # table mrib4; # explicit IPv4 table # import filter rt_import; # export all; # }; # # ipv6 multicast { # IPv6 multicast topology (2/2) # table mrib6; # explicit IPv6 table # import filter rt_import; # export all; # }; #} # Template example. Using templates to define IBGP route reflector clients. # template bgp rr_clients { # local 10.0.0.1 as 65000; # neighbor as 65000; # rr client; # rr cluster id 1.0.0.1; # # ipv4 { # import all; # export where source = RTS_BGP; # }; # # ipv6 { # import all; # export where source = RTS_BGP; # }; # } # # protocol bgp client1 from rr_clients { # neighbor 10.0.1.1; # } # # protocol bgp client2 from rr_clients { # neighbor 10.0.2.1; # } # # protocol bgp client3 from rr_clients { # neighbor 10.0.3.1; # }