本帖最后由 陈璨 于 2025-4-30 21:38 编辑
【问题背景】 1、最近在配置防火墙策略路由的时候,出现了一个奇怪的事情,明明配置了策略路由要求某些IP走ETH3的静态ip出去公网,但是仍然走的eth0的pppoe拨号口出去。我意识到,这是一个策略路由不生效的问题。
可以看到 ping 8.8.8.8的数据包没有走eth3专线 反而是从eth1出去了。
【有效排查步骤】 1、在已经抓包明确数据包能被转发到互联网的情况下,我们就不多阐述白名单ACL之类的排查步骤。直接进入到为什么数据包被转发错了出接口的问题。
2、正常情况下旧架构AF路由的优先级应该是:【VPN路由】>【静态路由/动态路由】>【策略路由】>【默认路由】
3、那么实际上呢?我们通过 ip rule 查路由表匹配顺序
可以看到当前版本AF路由表的查询顺序为:local--241(vpn)--243(查询临时表238)--10000(策略路由表)--main表 理论上来说,pppoe所生成默认路由应该会存在于main表中被最后匹配,但是pppoe的所生成的默认路由不一样,实际情况中会和静态路由一并被拷贝至238这个临时表中。
4、由此可得出结论,是因为底层设计原因,让本该最后匹配的pppoe默认路由被归类为静态路由优先于策略路由被匹配了。这个pppoe的默认路由在防火墙的【路由测试】也会显示为最后匹配次于策略路由,但是实际上在查路由表的时候优于策略路由。
【解决方案】 方案一、如果是老架构防火墙,可以在【PPPoE高级设置】中,取消勾选【新增默认路由】,这样就不会生成默认路由了,也就不会优于策略路由被匹配。
方案二、如果是 新架构 8.0.95防火墙,可以在【系统】-【通用设置】-【网络参数】-【路由优先级】中调整策略路由的优先级,策略路由表优先于静态路由。(8.0.51版本之前的老架构防火墙不支持该操作)
方案三、可以通过后台命令删除静态路由表中的pppoe默认路由,让他仅在main表中最后被匹配到。(此操作需联系400协助)
【最终效果】 1、通过curl cip.cc 能看到是正常通过指定的ip地址上网。 |