V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
supemaomao
V2EX  ›  宽带症候群

请教, ROS 在使用 OSPF 进行分流的前提下,如何使用路由标记实现白名单功能。

  •  
  •   supemaomao · 206 天前 · 1693 次点击
    这是一个创建于 206 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

    ESXI 中安装了 ROS 与 OpenWrt,并且实现了 Op 通过 OSPF 下发路由表,使国外流量通过 OP 出口,内网流量直接通过 ROS 的 PPPoe 出口。

    需求

    部分国外地址,直接通过国内访问效果更好,比如巨硬相关的域名。所以需要实现一个白名单的功能,即虽然 OSPF 下发了这个地址需要通过 OP 出口,但是仍然通过 pppoe 直接出口。

    尝试的措施

    1. 目前尝试通过路由标记,将需要白名单的地址放在了 ip/firewall/address-list 名为 DstallowGo 的 list 中

    2. 尝试标记 list 中的流量包

      chain=prerouting action=mark-routing new-routing-mark=white_list passthrough=no dst-address-list=DstallowGo in-interface-list=Lan log=no log-prefix=""

    3. 创建了如下的路由表

      As dst-address=0.0.0.0/0 routing-table=white_list pref-src="" gateway=pppoe-out1 immediate-gw=pppoe-out1 distance=5 scope=30 target-scope=10 suppress-hw-offload=no

      As dst-address=10.0.2.0/24 routing-table=white_list pref-src="" gateway=wireguard1 immediate-gw=wireguard1 distance=1 scope=30 target-scope=10 suppress-hw-offload=no

      As dst-address=192.168.2.0/24 routing-table=white_list pref-src="" gateway=bridge1 immediate-gw=bridge1 distance=1 scope=30 target-scope=10 suppress-hw-offload=no

    4. 检查 OSPF 默认的路由表,确保路由优先级,贴出一条 OSPF 的默认路由

      DAo dst-address=1.0.4.0/22 routing-table=main gateway=192.168.2.2%bridge1 immediate-gw=192.168.2.2%bridge1 distance=110 scope=20 target-scope=10 suppress-hw-offload=no

    故障

    上述设置完成后,在本地局域网访问特定的地址(即标记路由中的地址)总会提示连接重置。类似这样

    ca@caserver:~$ curl -v 104.19.223.79
    *   Trying 104.19.223.79:80...
    * Connected to 104.19.223.79 (104.19.223.79) port 80 (#0)
    > GET / HTTP/1.1
    > Host: 104.19.223.79
    > User-Agent: curl/7.81.0
    > Accept: */*
    > 
    * Recv failure: Connection reset by peer
    * Closing connection 0
    curl: (56) Recv failure: Connection reset by peer
    ca@caserver:~$  
    

    期望

    想请求一下有哪些地方设置有问题吗?或者怎么实现最开始的需求。谢谢各位指点 第一次码字,有格式错误还请多包涵。

    第 1 条附言  ·  206 天前

    网络拓扑

    网络拓扑.png

    补充新情况

    在做了主题正文的操作后,当我通过wg的设备访问list中的地址时,是可以正常做到白名单的情况。

    比如当我把 whatismyipaddress.com 这个地址放进list中时,通过wg的设备访问这个网页,会显示国内的ip地址, 但是当交换机下的电脑访问时,会提示连接重置。

    当我在list中禁用这个地址时,wg与交换机下的电脑访问该域名都会显示梯子的ip信息。

    第 2 条附言  ·  202 天前

    已经解决,补充一下方案以及原因

    原因

    防火墙使用了fast-track 导致了mark-routing的数据包无法被防火墙捕获,而触发连接重置。

    解决方案

    1. 如果不在乎性能关闭fast-track即可(关闭后需要重启)。
    2. 先根据地址列表,先使用mark-connection,再根据new-mark-connection 去进行mark-routing。在fatk-track的防火墙规则中Connection Mark 选择no-mark (这个解决方案OP还没测试,但是思路是这样的)。
    27 条回复    2024-06-06 11:44:19 +08:00
    Naples
        1
    Naples  
       206 天前 via Android   ❤️ 1
    需要直连的境外 ip 或段,直接优先静态到 pppoe 就行,不需要标记的
    povsister
        2
    povsister  
       206 天前   ❤️ 1
    你只加路由表没用啊。。不加 IP rule 它又不会查询那个路由表
    所以你还需要有一个 ip rule
    /ip route rule add routing-mark=white_list interface=Lan action=lookup-only-in-table table=white_list

    标记路由和主路由不在一个表里,你得加 rule 才行

    另外你这个玩法其实我之前搞过,就是因为基于 IP 的规则很不方便,所以自己搓了基于域名的 OSPF 规则。
    感兴趣可以来看看,基本原理和你这个一样的。
    https://v2ex.com/t/1039732
    supemaomao
        3
    supemaomao  
    OP
       206 天前
    @Naples 主要是在 list 里面可以直接写域名,如果静态路由只能写 ip 或者段,有点不太方便,所以才想着用 list 实现。
    supemaomao
        4
    supemaomao  
    OP
       206 天前
    @povsister 看了一下你帖子,感觉好复杂的样子,感觉是大佬的样子。
    之所以没有 ip rule 是因为在 ROS 的文档中 https://help.mikrotik.com/docs/display/ROS/Policy+Routing#:~:text=It%20is%20not%20recommended%20to%20use%20both%20methods
    对于策略路由的描述中,不建议混合使用路由标记与路由规则。所以我就没有这样用过。晚上试试加上 rule ,谢谢回复。
    povsister
        5
    povsister  
       206 天前
    @supemaomao
    > 对于策略路由的描述中,不建议混合使用路由标记与路由规则。

    这样说是没错,但是你只用 firewall 的 mangle 去做了标记,然后又没添加另一个规则去处理这个标记,所以。。。
    另外,记得在你自己建的 white_list 路由表中添加自己内网网段的静态路由,否则加 ip rule 后会出现回程无路由的情况
    supemaomao
        6
    supemaomao  
    OP
       206 天前
    @povsister 原来是这样,那如果标记的表依然是 main 表是不是就不用添加路由规则去处理了,我 white_list 的路由表中已经添加了对于内网的出口了。
    另外还有一个疑问想请教一下,我目前没添加路由规则的前提下,在局域网中使用 src 192.168.2.0/24 的网段会触发连接重置,但是当我使用 wg 连接至 ROS ,再访问特定的地址列表里面的域名服务时,就不触发连接重置。这是为什么呢?
    yyysuo
        7
    yyysuo  
       206 天前
    用 fakeip 网关实现这种需求更简单些吧。
    povsister
        8
    povsister  
       206 天前
    @supemaomao
    > 标记的表依然是 main 表

    按我理解是没有这种说法的,你都用标记路由了,那必然是为了某些情况不查询 main 路由表。

    第二个问题没理解,双方对于术语的理解不同,你也没给拓扑。而且 RST 是 TCP 行为,路由表处理的是 IP 报文,这个得具体分析或者抓包看是最快的。
    Dzsss
        9
    Dzsss  
       206 天前
    你那个做法是不彻底的,还要解决 DNS 污染问题。

    其实一个 OP 就足够解决全部问题。如果没其它网络需求,没必要强加个 ROS + OSPF 。
    supemaomao
        10
    supemaomao  
    OP
       206 天前
    @Dzsss 单 OP 的话,无法解决网络故障转移。如果梯子挂了,容易影响家里其他人上网。
    supemaomao
        11
    supemaomao  
    OP
       206 天前
    @povsister 感谢回复,已经补充了简易的拓补图(不太会做拓扑图),和关于第二个问题的详细情况。
    lcy630409
        12
    lcy630409  
       206 天前
    @supemaomao
    gfw 模式不行么,翻墙这个东西 如果用的人不多 建议本机翻墙 不要在路由上搞

    我目前是 ikuai+adg+win7 模式,win7 用来特殊协议连接外网 作为 ikuai 的出口

    ikuai 只写了简单的 两条规则 ,默认全部走 win7 香港出口 ,国内 ip 走 pppoe..
    adg 用文件模式,gfw 域名 8888 解析,其他 223.5.5.5
    0987363
        13
    0987363  
       205 天前 via iPhone
    @supemaomao 挺麻烦的,我是 ros 加 op 双播,默认 op 网关,ros 的 dhcp 当 op 打开的时候就自动关闭
    supemaomao
        14
    supemaomao  
    OP
       205 天前
    @lcy630409 感谢回复,其实单就梯子用途的话,现在已经是正常使用的。只是强迫症会想着让自己更懒一点。哈哈 🤣🤣
    supemaomao
        15
    supemaomao  
    OP
       205 天前
    @0987363 感谢回复,哈哈 ,折腾嘛,总想找一个自己舒服的借口。
    bao3
        16
    bao3  
       205 天前
    静态路由的优先级比较高,所以你可以直接用指静态路由的方式来躲避动态路由的匹配
    creepersssss
        17
    creepersssss  
       205 天前 via iPhone
    你可以相信我的做法,设立两个隔离网段(同时分配新增路由表),做好两个网段互通,一个网段实行 ospf ,一个直通 pppoe ,ospf 宣告主机 op 放在直通网段,啪 好了。
    terrancesiu
        18
    terrancesiu  
       205 天前 via iPhone
    如果你想部分 ip 的优先级高于 ospf ,在 rules 预埋策略路由即可。如果是 bgp 就直接找到 cidr 对应的 asn 写过滤策略和 set gw
    flynaj
        19
    flynaj  
       205 天前 via Android
    一个 openwrt 就可以,用 mwan3 分流。
    onion83
        20
    onion83  
       205 天前
    @supemaomao ROS 7.x 某个版本开始策略 Policy Routing 的优先级已经高于静态路由

    1 、如 #2 所言,Routing / rule 的规则必须加,而且最好是 lookup only in table
    2 、这 ip firewall 的 mangle 中 打完路由标后 Passthrough 的勾去掉,然后不再向下走。

    参考: https://forum.mikrotik.com/viewtopic.php?t=186638
    povsister
        21
    povsister  
       204 天前
    今天算是把这坑美美的踩了一遍,之前朋友警告我说慎用 mark routing ,会和 fasttrack 撞起来。。今天给我现场撞死,查了一下午麻了。
    OP 你这个问题,你看看把 filter 里的 fasttrack 规则关掉是不是就好了。

    策略路由可以正常被 fasttrack ,mark routing 在 fasttrack 开启的情况下几乎不能正常工作,需要配合 mark connection 才行,建议 fasttrack 最好只工作在 no-mark 的连接上。
    https://forum.mikrotik.com/viewtopic.php?f=2&t=134048&p=659612#p659676

    总结,你这个问题简单,不要用 firewall 的 mark-routing 了,直接 ip rule 写策略路由即可
    supemaomao
        22
    supemaomao  
    OP
       202 天前
    @povsister 确实如此,我禁用了 filter 中的 fasttrack 以后,重启。其它任何变动都不做。
    我的 mark-routing 就可以正常工作了,可以通过这个做白名单了。
    不用 ip rule 写策略的原因是,有很多地址是域名。在 ip rule 里面要自己解析以后 写 ip ,多了一个操作。
    我在研究一下搭配 mark-connection 并开启 fast-track 的情况下如何实现这个需求。感谢踩坑哈哈。
    povsister
        23
    povsister  
       202 天前
    @supemaomao
    ip rule 是可以针对于来源 IP 写规则的,一般可以用来豁免某个内网设备走特殊逻辑。
    但你要求是在目的 IP 里开白这个确实不太方便,得在防火墙上操作。

    搭配 mark connection 的操作我上面贴的 mikrotik 的论坛帖子里有讲到,主要是 fasttrack 要明确应用于 no-mark 的连接,然后先 mark connection ,再 mark routing 就 ok 了。

    我昨天试了下是可以的,但我现在用的方案 mark routing 和 ip rule 都可以,就干脆把 mark routing 删了只用 ip rule 了
    supemaomao
        24
    supemaomao  
    OP
       202 天前
    @povsister 是的,在目的 IP 里开白,就是有些麻烦,这个问题解决以后,就不折腾了。稳定用着就行了,后续就考虑 esxi 里面的虚拟机备份问题了。
    supemaomao
        25
    supemaomao  
    OP
       202 天前
    @onion83
    @flynaj
    @terrancesiu
    @creepersssss
    @bao3 已经解决了,感谢各位的回复。
    flynaj
        26
    flynaj  
       202 天前 via Android
    sp670
        27
    sp670  
       199 天前
    我以前是用 MARK ROUTING ,现在直接弃用 OSPF 了,还是有需要再用隧道好了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2733 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 144ms · UTC 15:00 · PVG 23:00 · LAX 07:00 · JFK 10:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.