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节点当初为了拉镜像,默认网关改成了旁路由的地址,往返路径不一致,导致了这个端口通但是传输有问题的奇怪现象。被这个愚蠢的原因困住了许久,笑……