What’s Changed
- 父母家和自己家之间的静态路由改为BGP通告
Bug fix
- 解决父母家客户端访问k8s apiserver提示TLS握手失败
起因
之前爸妈家(phome)和自己家(ihome)之间的路由是通过在两侧网关写静态路由互通的,换用cilium CNI的BGP模式后,来自k8s集群的IP CIDR变得丰富了起来,灵活的LoadBalancer IP池配置使得静态路由的方式不再那么方便。毕竟不想在增加CiliumLoadBalancerIPPool或者物理网络CIDR时,还要到ihome的网关手动添加路由,做戏不能做半套。于是给两侧的网关之间也建立了BGP连接,当然,不管是vxlan还是bgp都是建立在wireguard隧道之上的。
过程
过程不复杂,增加一个BGP Neighbor,然后选择重分发一下直连路由,这样的话ihome侧网关就能收到物理网络cidr的路由了。
BGP路由反射器
然而ihome侧还是无法收到来自cilium通告的路由,Fortigate也没有Redistribute BGP路由的选项,BGP的设计也不是这么用的。
如果不想所有BGP Peer之间互相建立连接的话,可以用route-reflector或者route-server来转发BGP路由,前者及设计用于简化ibgp连接的功能。
# 针对指定邻居启用reflector
config neighbor
edit "192.168.31.1"
set remote-as 65001
set route-reflector-client enable
next
end
此时ihome侧已经可以接收到phome网关下的所有BGP路由。
路由过滤
由于选择重分发了直连路由,所以包括互联网出口pppoe接口的路由也会通过BGP宣告出去,为了避免异常,这里对BGP出方向路由进行过滤。
# 创建需要过滤前缀清单
config router access-list
edit "ifppp_address"
set comments ''
config rule
edit 1
set action permit
set prefix 10.246.0.0 255.255.0.0
unset wildcard
set exact-match disable
next
end
next
end
# 创建route map
config router route-map
edit "deny_board_ppp_route"
config rule
edit 10
set match-ip-address "ifppp_address"
set action deny # 拒绝前缀清单中的条目
next
edit 20
set action permit # 默认允许其他条目
next
end
next
end
# 对指定邻居进行过滤
config router bgp
config neighbor
edit "192.168.31.1"
set remote-as 65001
set route-map-out "deny_board_ppp_route" # 应用出站方向上的route-map
next
end
end
至此,两边的路由可以通过BGP互相通告无需手动维护了。
小插曲
之前发现phome侧的客户端访问k8s apiserver有问题,提示TLS握手失败但是icmp和telnet都没问题。在经历过vxlan故障排查后,立马就怀疑起了MTU的问题,调试了一晚上MTU仍旧没有头绪。最终发现,apiserver节点当初为了拉镜像,默认网关改成了旁路由的地址,往返路径不一致,导致了这个端口通但是传输有问题的奇怪现象。被这个愚蠢的原因困住了许久,笑……