BGP again

BGP again
Photo by Thomas Jensen / Unsplash

为啥本来以为在RouterOS上配置BGP就完事了,结果今天发现一个场景,访问一个LB IP超时,但从某个k8s node上访问就正常,通过mtr看到产生了回环,后来猜测是这样的:k8s nodes都使用了旁路网关而不是主路由作为网关,是因为nodes需要拉取docker image,旁路网关有透明代理,而之前的配置是主路由和nodes建立了bgp connection,所以主路由上学习了LB ips, 当请求发到主路由,转到某个node, node并不知道在本机可以处理这个请求,而且LB IP是另一个网段,他就发回自己的gateway了,而gateway又发给主路由,主路由又发回来。。。

这次设置BGP没有使用之前的quagga,因为新版的openwrt默认没有包,不过有frr的一系列,似乎他们是一家?于是有了下文。

Installation

opkg update
opkg install frr-bgpd frr-zebra frr-staticd frr-watchfrr

Configuration

  1. /etc/frr/daemons, modify bgpd=yes
  2. restart frr: /etc/init.d/frr restart
  3. configure with vtysh
# 本机的as号,对端会声明这一侧的as号,两个要对应好,例如metallb声明它的as号是65009,对方是65000,那在openwrt这边就要写本机as号是65000,对端是65009
router bgp 65000

# no ebgp requires policy非常关键,在之前使用quagga时并没有写过,但用frr后,由于新的rfc建议,默认情况下会对收到的数据进行policy过滤,不符合policy就直接丢弃了。。。这是一个简化配置,真实情况下需要考虑policy怎么定义好
no bgp ebgp-requires-policy

#后续是多个neighbor,有几个就配置几个
neighbor 192.168.1.20 remote-as 65009
...

exit到最上层后执行write写入配置到文件,应该在1分钟内就能同步routes到这边了,可以通过show ip route看到更新后的路由表,如果通过show ip bgp summary看到了(Policy),那检查一下是否配置正确了policy,或者关闭policy检查。

因为k8s用的metallb,于是增加了一个bgp peer

apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
  name: secondary-bgp-peer
  namespace: metallb-system
spec:
  myASN: 65009
  peerASN: 65001 #主路由用的as是65000,这里区别一下,但也可以是一样的,不过根据as的含义,我认为这里可以用一个新的,只要在metallb这边配置正确即可
  peerAddress: 192.168.1.6

有多个bgp peer时,默认都能收到通知,例如我的bgp advertisement是这样,但也可以指定这个ip pool通过某个peer通知

apiVersion: metallb.io/v1beta1
kind: BGPAdvertisement
metadata:
  name: bgp-advertisement
  namespace: metallb-system
spec:
  ipAddressPools:
  - default-ip-pool

旁路网关学习到了新路由后,再访问LB IP就正常了。。。只是frr需要配置好policy,这里花了不少时间。