环境:centos 7.6.1810
版本:FRR 7.3
下载FRR源代码包
wget https://github.com/FRRouting/frr/archive/frr-7.3.tar.gz
使用yum下载依赖包
yum install git autoconf automake libtool make \
readline-devel texinfo net-snmp-devel groff pkgconfig \
json-c-devel pam-devel bison flex pytest c-ares-devel \
python-devel systemd-devel python-sphinx libcap-devel
安装libyang,版本要求 >= 0.16.105,这里有各个系统的安装包,根据环境下载对应的libyang和libyang-devel。
#下载libyang
wget https://ci1.netdef.org/artifact/LIBYANG-YANGRELEASE/shared/build-10/CentOS-7-x86_64-Packages/libyang-0.16.111-0.x86_64.rpm
#下载libyang-devel
wget https://ci1.netdef.org/artifact/LIBYANG-YANGRELEASE/shared/build-10/CentOS-7-x86_64-Packages/libyang-devel-0.16.111-0.x86_64.rpm
#安装
rpm -ihv libyang-0.16.111-0.x86_64.rpm
rpm -ihv libyang-devel-0.16.111-0.x86_64.rpm
编译FRR源码
tar -zxvf frr-7.3.tar.gz
cd frr-frr-7.3/
sh bootstrap.sh
#安装目录改为/usr/local/frr
#使用root用户运行
./configure --prefix=/usr/local/frr -exec-prefix=/usr/local/frr --enable-watchfrr --enable-user=root --enable-group=root --enable-static --enable-static-bin --enable-systemd
这里的–enable-systemd很关键,使用systemctl启动时,frr.service使用了WatchdogSec,这个配置项如果没有在规定时间内调用sd_notify(3) ,就会重启FRR服务,而–enable-systemd就是用于定时调用sd_notify(3),避免FRR服务一直被重启。
make;make install
#创建日志目录
mkdir /usr/local/frr/var/log/ -p
安装Service和daemon配置文件
install -p -m 644 tools/frr.service /usr/lib/systemd/system/frr.service
#frr.service使用/usr/lib/frr/frrinit.sh脚本,我们需要改为/usr/local/frr/sbin目录下
sed "s#/usr/lib/frr#/usr/local/frr/sbin#g" -i /usr/lib/systemd/system/frr.service
install -p -m 644 tools/etc/frr/daemons /usr/local/frr/etc/daemons
使能ip转发
[root frr-frr-7.3]# cat /etc/sysctl.d/90-routing-sysctl.conf
# Sysctl for routing
#
# Routing: We need to forward packets
net.ipv4.conf.all.forwarding=1
net.ipv6.conf.all.forwarding=1
[root frr-frr-7.3]# sysctl -p /etc/sysctl.d/90-routing-sysctl.conf
至此FRR的安装已经完成,安装程序和配置在目录/usr/local/frr。
[root frr-frr-7.3]# ls /usr/local/frr
bin etc include lib sbin share
#sbin:FRR程序目录
#etc:配置文件目录
#bin:vtysh所在
下面开始配置运行BGP
运行BGP需要启动两个程序bgpd和zebra,bgpd是bgp协议的主要程序;zebra是FRR为BGP、OSPF、RIP等协议与内核交互的统一抽象层。作为一个IP路由管理工具,它支持路由表查询修改、支持网络接口查询、支持路由在不同协议之间的重发布。
拓扑结构
AS100的路由器IP是192.168.122.6,在ns1创建子网10.10.1.2/24,该路由器与AS号200的路由器建立EBGP对等体关系,AS200的IP是192.168.122.7,在ns1创建子网11.10.1.2/24。两个AS分别向对方通告ns1的子网网段。
子网网络设置
#添加网络,如果没有的话
ip link add br1 type bridge
ip link set br1 up
#添加子网ns1,ip 10.10.1.2
ip netns add ns1
ip link add veth_ns1 type veth peer name eth0 netns ns1
ip netns exec ns1 ip link set eth0 up
ip netns exec ns1 ip link set lo up
ip netns exec ns1 ip addr add 10.10.1.2/24 dev eth0
ip netns exec ns1 ip route add default via 10.10.1.254 dev eth0
ip link set veth_ns1 up
ip link set veth_ns1 master br1
ip addr add 10.10.1.254/24 dev br1
#打开端口转发
echo 1 > /proc/sys/net/ipv4/ip_forward
BGP配置
BGP缺省配置项位于/usr/local/frr/etc/bgpd.conf
[root frr-frr-7.3]# cat /usr/local/frr/etc/bgpd.conf
hostname bgpd
#shell连接bgpd使用的密码
password zebra
#注册AS100
router bgp 100
#绑定ip
bgp router-id 192.168.122.6
#通告路由
network 10.10.1.0/24
#对等体AS号和IP
neighbor 192.168.122.7 remote-as 200
#声明为EBGP多跳,由于EBGP默认TTL为1,为避免对等体之间不是直连而导致丢包
neighbor 192.168.122.7 ebgp-multihop
address-family ipv4 unicast
exit-address-family
#debug相关
debug bgp neighbor-events
debug bgp updates
debug bgp keepalives
debug bgp zebra
#日志文件
log file /usr/local/frr/var/log/bgpd.log
zebra配置文件
[root frr-frr-7.3]# cat /usr/local/frr/etc/zebra.conf
hostname zebra
#shell连接zebra使用的密码
password zebra
enable password zebra
#debug相关
debug zebra kernel
debug zebra event
debug zebra rib
log file /usr/local/frr/var/log/zebra.log
子网网络设置
#添加网络,如果没有的话
ip link add br1 type bridge
ip link set br1 up
#添加子网ns1,ip 11.10.1.2
ip netns add ns1
ip link add veth_ns1 type veth peer name eth0 netns ns1
ip netns exec ns1 ip link set eth0 up
ip netns exec ns1 ip link set lo up
ip netns exec ns1 ip addr add 11.10.1.2/24 dev eth0
ip netns exec ns1 ip route add default via 11.10.1.254 dev eth0
ip link set veth_ns1 up
ip link set veth_ns1 master br1
ip addr add 11.10.1.254/24 dev br1
#打开端口转发
echo 1 > /proc/sys/net/ipv4/ip_forward
BGP配置
[root frr-frr-7.3]# cat /usr/local/frr/etc/bgpd.conf
hostname bgpd
password zebra
router bgp 200
bgp router-id 192.168.122.7
neighbor 192.168.122.6 remote-as 100
neighbor 192.168.122.6 ebgp-multihop
network 11.10.1.0/24
address-family ipv4 unicast
exit-address-family
debug bgp neighbor-events
debug bgp updates
debug bgp keepalives
debug bgp zebra
log file /usr/local/frr/var/log/bgpd.log
zebra配置文件
[root frr-frr-7.3]# cat /usr/local/frr/etc/zebra.conf
hostname zebra
password zebra
enable password zebra
debug zebra kernel
debug zebra event
debug zebra rib
log file /usr/local/frr/var/log/zebra.log
frr启动方式有两种,一种是手动启动
/usr/local/frr/sbin/zebra -A 127.0.0.1 -d
/usr/local/frr/sbin/bgpd -A 127.0.0.1 -d
另一种是使用系统Service,系统Service启动方式会读取配置文件/usr/local/frr/etc/daemons,来决定启动哪些进程和进程的启动参数,因此我们要找到bgpd=no,改为bgpd=yes
[root frr-frr-7.3]# cat /usr/local/frr/etc/daemons |grep bgpd
#启动进程bgpd
bgpd=yes
#bgpd进程启动参数
bgpd_options=" -A 127.0.0.1"
启动FRR
#AS100和AS200分别启动
[root frr-frr-7.3]# systemctl start frr
看到进程bgpd和zebra都启动成功
[root frr-frr-7.3]# ps -ef |grep -e "zebra" -e "bgpd"
root 30830 1 0 17:36 ? 00:00:00 /usr/local/frr/sbin/watchfrr -d -F traditional zebra bgpd staticd
root 30847 1 0 17:36 ? 00:00:00 /usr/local/frr/sbin/zebra -d -F traditional -A 127.0.0.1 -s 90000000
root 30851 1 0 17:36 ? 00:00:00 /usr/local/frr/sbin/bgpd -d -F traditional -A 127.0.0.1
打开vtysh(也可以打开telnet连接bgpd的127.0.0.1:2605),查看BGP邻居和BGP路由情况,命令分别是show bgp neighbors 192.168.122.6和show ip bgp
[root frr-frr-7.3]# /usr/local/frr/bin/vtysh
Hello, this is FRRouting (version 7.3).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
AS200# show bgp neighbors 192.168.122.6
BGP neighbor is 192.168.122.6, remote AS 100, local AS 200, external link
Hostname: bgpd
BGP version 4, remote router ID 192.168.122.6, local router ID 192.168.122.7
BGP state = Established, up for 00:00:05
Last read 00:00:04, Last write 00:00:04
......
AS200# show ip bgp
BGP table version is 3, local router ID is 192.168.122.7, vrf id 0
Default local pref 100, local AS 200
Status codes: s suppressed, d damped, h history, * valid, > best, = multipath,
i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 10.10.1.0/24 192.168.122.6 0 0 100 i
Displayed 1 routes and 1 total paths
可以看到,与AS100的status状态是Established,说明已经建立了邻居关系,也收到了AS100通告的路由网络10.10.1.0/24。route -n可以看到10.10.1.0/24的路由已经被设置到系统路由。
[root frr-frr-7.3]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.122.1 0.0.0.0 UG 100 0 0 ens3
10.10.1.0 192.168.122.6 255.255.255.0 UG 20 0 0 ens3
11.10.1.0 0.0.0.0 255.255.255.0 U 0 0 0 br1
192.168.122.0 0.0.0.0 255.255.255.0 U 100 0 0 ens3
从AS200的ns1 ping AS100的子网10.10.1.2/24,可以ping通。反之AS100的ns1到AS200的子网11.10.1.2/24也要能够ping通,这样两个不同AS的子网就相互连通了。
[root frr-frr-7.3]# ip netns exec ns1 ping 10.10.1.2
PING 10.10.1.2 (10.10.1.2) 56(84) bytes of data.
64 bytes from 10.10.1.2: icmp_seq=1 ttl=63 time=0.583 ms
64 bytes from 10.10.1.2: icmp_seq=2 ttl=63 time=0.598 ms
64 bytes from 10.10.1.2: icmp_seq=3 ttl=63 time=0.499 ms