基于FRR深入实践BGP协议(八):多场景路由策略与反射器配置实战

基于FRR深入实践BGP协议(八):多场景路由策略与反射器配置实战 1. 从零搭建BGP实验环境在开始BGP路由策略和反射器的实战之前我们需要先搭建一个可靠的实验环境。我推荐使用Linux Namespace来创建隔离的网络空间这样可以在单台物理机上模拟复杂的网络拓扑。最近我在测试CentOS 7.6上的FRR 7.3时发现Namespace配合veth设备简直是网络实验的神器。首先确保你的系统已经安装了FRR套件。如果还没安装可以这样操作yum install frr frr-pythontools接着我们需要配置zebra守护进程支持Namespace。打开/etc/frr/daemons文件找到zebra的配置行zebra_options -A 127.0.0.1 -s 90000000 -n这里的-n参数很关键它让zebra支持网络命名空间。我刚开始实验时漏了这个参数结果折腾了半天才发现问题。创建两个Namespace作为我们的初始实验环境ip netns add ns1 ip netns add ns2然后用veth pair把这两个命名空间连接起来ip link add veth_ns2 type veth peer name veth_ns1这里有个坑需要注意 - Linux默认的ARP过滤可能会导致通信问题。我们需要调整几个内核参数echo 1 /proc/sys/net/ipv4/conf/veth_ns1/accept_local echo 1 /proc/sys/net/ipv4/conf/veth_ns2/accept_local echo 0 /proc/sys/net/ipv4/conf/all/rp_filter分配IP地址并启动接口ip link set veth_ns1 netns ns1 ip netns exec ns1 ip link set veth_ns1 up ip netns exec ns1 ip addr add 10.10.1.2/24 dev veth_ns1 ip link set veth_ns2 netns ns2 ip netns exec ns2 ip link set veth_ns2 up ip netns exec ns2 ip addr add 10.10.1.4/24 dev veth_ns2测试连通性时建议先用ping命令验证ip netns exec ns1 ping 10.10.1.4如果ping不通八成是ARP或者路由过滤的问题。我在实验室里经常遇到这种情况这时候就需要回头检查那些内核参数是否设置正确了。2. EBGP基础配置实战有了实验环境我们现在可以开始配置BGP了。先来个简单的EBGP场景 - 让ns1(AS100)和ns2(AS200)建立EBGP邻居关系。FRR的配置主要写在/etc/frr/bgpd.conf里。下面是我调试多次后总结出的可靠配置hostname bgpd password zebra router bgp 100 vrf ns1 bgp router-id 10.10.1.2 network 100.10.1.0/24 neighbor 10.10.1.4 remote-as 200 neighbor 10.10.1.4 ebgp-multihop 255 address-family ipv4 unicast exit-address-family router bgp 200 vrf ns2 bgp router-id 10.10.1.4 neighbor 10.10.1.2 remote-as 100 neighbor 10.10.1.2 ebgp-multihop 255 network 200.10.1.0/24 address-family ipv4 unicast exit-address-family这里有几个关键点需要注意ebgp-multihop 255是必须的因为我们在Namespace环境下每个router bgp块都指定了vrf参数对应不同的Namespace记得在两边都配置network语句来通告路由配置完成后重启FRR服务systemctl restart frr验证邻居状态时我特别喜欢用FRR自带的vtysh工具vtysh -c show bgp vrf ns1 neighbors正常的话应该能看到状态是Established。如果卡在Active状态通常是IP连通性问题如果是Connect可能是AS号配置错了。查看路由表也很简单vtysh -c show bgp vrf ns1 ipv4这时候你应该能看到对端通告的路由。我在第一次实验时太兴奋了忘了在两边都配置network语句结果只有单向路由排查了好久才发现这个低级错误。3. IBGP与水平分割问题接下来我们扩展拓扑创建一个IBGP环境。在原有ns1(AS100)和ns2(AS200)的基础上新增ns3和ns4都属于AS200。网络设置部分需要增加几对vethip netns add ns3 ip link add veth_ns3_2 type veth peer name veth_ns2_3 ip link set veth_ns2_3 netns ns2 ip netns exec ns2 ip link set veth_ns2_3 up ip netns exec ns2 ip addr add 20.10.1.4/24 dev veth_ns2_3 ip link set veth_ns3_2 netns ns3 ip netns exec ns3 ip link set veth_ns3_2 up ip netns exec ns3 ip addr add 20.10.1.6/24 dev veth_ns3_2IBGP的配置有个大坑 - 水平分割规则。简单来说IBGP路由器不会把从IBGP邻居学到的路由再传给其他IBGP邻居。这就导致ns4收不到来自ns1的路由。看看这个配置示例router bgp 200 vrf ns2 neighbor 20.10.1.6 remote-as 200 neighbor 20.10.1.6 update-source 20.10.1.4 neighbor 20.10.1.6 next-hop-self router bgp 200 vrf ns3 neighbor 20.10.1.4 remote-as 200 neighbor 30.10.1.8 remote-as 200 neighbor 30.10.1.8 next-hop-self allnext-hop-self是个关键配置它确保路由的下一跳地址被正确设置。不过即使这样ns4还是收不到路由这就是IBGP的水平分割在作祟。4. 路由反射器实战配置解决IBGP水平分割问题最常用的方法就是部署路由反射器(Route Reflector)。我们把ns3配置成RRns4作为它的client。配置改动主要在ns3上router bgp 200 vrf ns3 bgp router-id 20.10.1.6 bgp cluster-id 6.6.6.6 neighbor 30.10.1.8 remote-as 200 neighbor 30.10.1.8 route-reflector-client关键点bgp cluster-id通常设置为RR的router-id使用route-reflector-client标识client节点其他配置保持不变配置完成后ns4现在应该能收到来自ns1的路由了。验证时可以看路由的路径属性vtysh -c show bgp vrf ns4 ipv4 4.0.1.0输出中应该能看到类似这样的信息Originator: 10.10.1.4, Cluster list: 6.6.6.6这表明路由反射器正常工作而且路径属性也被正确传递了。我在生产环境部署时曾经因为cluster-id配置不一致导致路由环路所以这个值一定要规划好。5. 路由策略与Local-Preference实战BGP最强大的特性之一就是可以通过路由策略影响选路。我们通过一个具体场景来演示ns1(AS100)通告路由4.0.1.0/24ns5(AS500)也通告同样的路由我们想让ns3优先选择来自AS500的路由。实现方法是使用route-map设置Local_Preference属性。Local_Preference是BGP的一个重要路径属性值越大优先级越高。首先在ns2上配置bgp as-path access-list permit-100 permit _100$ route-map ns2_setlp permit 10 match as-path permit-100 set local-preference 80 route-map ns2_setlp permit 20然后在ns4上配置ip prefix-list 1 permit 40.10.1.0/24 route-map ns4_setlp permit 10 match ip address prefix-list 1 set local-preference 100 route-map ns4_setlp permit 20最后把route-map应用到对应的邻居上router bgp 200 vrf ns2 neighbor 20.10.1.6 route-map ns2_setlp out router bgp 200 vrf ns4 neighbor 30.10.1.6 route-map ns4_setlp out这样配置后ns3会比较两条4.0.1.0/24路由的Local_Preference值选择较大的那条来自ns4的。验证方法vtysh -c show bgp vrf ns3 ipv4 4.0.1.0输出中会显示优选的路由及其Local_Preference值。我在客户现场遇到过Local_Preference不生效的情况后来发现是route-map的匹配条件写得太宽泛导致策略没有按预期应用。所以写route-map时一定要仔细检查匹配条件。6. 常见问题排查技巧在实际部署中BGP的问题排查往往让人头疼。根据我的经验90%的问题可以通过以下几个步骤解决检查邻居状态vtysh -c show bgp summary邻居状态必须是Established其他状态都表示有问题。查看调试日志tail -f /var/log/frr/bgpd.logFRR的日志非常详细能告诉你邻居为什么没建立。验证路由通告vtysh -c show ip bgp确认预期的路由是否被正确通告和接收。检查路由策略vtysh -c show route-map vtysh -c show ip prefix-list确保你的route-map和prefix-list按预期工作。抓包分析ip netns exec ns1 tcpdump -i veth_ns1 -nn -w bgp.pcap当所有方法都失效时抓包是终极武器。我遇到过最棘手的一个问题是BGP会话不断重置最后发现是MTU不匹配导致的。所以当遇到奇怪的问题时别忘了检查基础网络配置包括MTU、TCP MSS等参数。7. 生产环境部署建议在实验室跑通BGP配置只是第一步真正部署到生产环境还需要考虑更多因素路由反射器集群大型网络应该部署多个RR形成集群提高可靠性。配置时记得设置相同的cluster-id。路由过滤一定要配置适当的过滤策略只接收和发送必要的路由。可以使用prefix-list和route-map配合实现。BGP安全启用MD5认证防止会话被劫持neighbor 10.10.1.2 password MySecurePassword路由聚合合理使用aggregate-address减少路由表规模。监控告警部署监控系统跟踪BGP会话状态和路由变化。PrometheusFRR Exporter是个不错的组合。变更管理BGP配置变更要谨慎最好有回滚计划。我曾经因为一个错误的route-map导致整个网络路由混乱教训深刻。文档记录详细记录AS号、router-id、cluster-id等关键信息。网络规模大了之后这些信息很容易混淆。