[教程] 使用 RouterOS, OSPF 和树莓派为国内外 IP 智能分流

2020-12-29 02:26:45 +08:00
 dndx

对于 RouterOS 的用户们,谈到国内外智能分流都是泪。这种 OpenWRT 可以很简单的完成的任务在 RouterOS 上基本上都需要用策略路由这种杀鸡用牛刀的方式来进行。另外,PBR 还有很多缺点,比如更新起来麻烦(一不小心 CLI 也可能搞坏路由器配置),而且没有健康检查,如果旁路由断网或者掉电 RouterOS 还是会傻傻的把流量转发过去,结果就是旁路由一挂国外 IP 全部不通。

这篇问题记录了我在 RouterOS 上通过 OSPF 协议把国外的流量动态拉取到旁路由上的配置过程。这样也算是让 RouterOS 干最擅长的工作。而路由的动态更新也可以直接在旁路由上完成。文章里面包含了 IPv4 和 IPv6 的配置。

根据一个月来的实验,效果非常好,中间有两次隧道断线,BIRD 都成功的检测到了故障,及时的从主路由 withdraw announcement,这样最起码国外 IP 还是通的。

全文在此:https://idndx.com/use-routeros-ospf-and-raspberry-pi-to-create-split-routing-for-different-ip-ranges/

这个文章只侧重了 3 层的分流,对于比如 DNS 污染就没有讨论,所以不是一个完整的解决方案。反正架设无污染的 DNS 方法网上一搜一大把,就不值得再写一遍了。

19062 次点击
所在节点    宽带症候群
57 条回复
kennylam777
2020-12-29 16:58:41 +08:00
好方法,對於正規的路由器用標準協議準沒錯,魔改還是留給樹莓派擔當
stevefan1999
2020-12-29 17:23:11 +08:00
另外如果是 BGP 的 可以嘗試下 gobgp
dndx
2020-12-29 17:45:08 +08:00
@stevefan1999 要是跑 BGP,@noahzh 提到的的按照源 IP 路由的功能就能基于 BGP FlowSpec 做了,然而 Mikrotik 太懒了,到现在还没有加 FlowSpec 支持。。
ericbize
2020-12-29 18:46:03 +08:00
@dndx 我都是写好一个文件, 然后在命令行 import 这样不卡啊,8000 条大概一分钟就好了
ericbize
2020-12-29 18:49:36 +08:00
@ihipop 之前用阿里云 hk 跑满 30m, 广东电信 家宽。iepl 是公司的,成本大概 150/m/月
ihipop
2020-12-29 19:46:28 +08:00
@noahzh vrrp➕DHCP 为特定设备分配 vrrp 网关
noahzh
2020-12-29 21:55:41 +08:00
@ihipop 不同网关,那不同网关之间的互通是怎么搞定的?
bclerdx
2020-12-30 00:01:53 +08:00
很好的文章及科普,收藏了。多谢楼主。
ihipop
2020-12-30 08:05:39 +08:00
@noahzh vrrp 指向旁路 旁路指向上级
terrancesiu
2020-12-30 09:28:40 +08:00
我的方法,目前运行了半年了。有国内 vds 的朋友都可以照我的搞,没 vds 也可以用树莓派,n1 替代。我目前用的是 n1,放在楼道的 gpon onu 交换机那(我们这 fttb 上下行对等),用自己的第二条宽带账号拨号。
一、n1 安装了 armbian 后,安装和配置 pppoe 、ddclient 、strongswan 、clash premium 这几个基本服务。非常重要的一点,clash 需要开启 dns 且端口是 53,并用 fakeip 模式,最后做好防火墙白名单,只开放 22 端口。
二、routeros 通过 ikev2 vpn 拨入 n1,拿到 n1 下发的 ip 后,并和 n1 之间打 gre 隧道。然后互加对方的路由,这样 3 层就通了,最后加入一条策略路由将 198.18.0.0/16 的目的地址都交给 n1 处理。
三、再 routeros 上做 dns fwd,将需要走 n1 的域名写入 /ip dns static 内,因为可以用正则表达式,基本上常用的流媒体,社交网络、新闻和其他的,我 30 行就解决了。转发地址为 n1 上 clash tun 的地址 198.18.0.1 。
四、灵活运用 clash 的策略,分流不通区域的流媒体。
五、至于其他需要依靠 ip 直接通信的应用,比如 tg 就直接将 ip 加入 ros 的策略路由表,然后在 n1 的 iptales 写 redir 到 clash 的 redir 端口。最后做个 dns 劫持,避免 chromecast 走 4 个 8.
六、如果 n1 和 routeros 之间的 gre 速度很慢,看看 tcp mss,我改成了 1260 才正常。最后建议用 iperf3 打流测,避免瓶颈。如果 ros 的物理设备不支持 aes 解密,那么只能做未加密的 gre 隧道了。
ttvast
2020-12-30 10:06:03 +08:00
@cwbsw
我以前用的静态路由表,cpu 是 j1900. 宽带升级 500m 以后,测速老觉得跑不满带宽,后来发现是路由器 cpu 利用率 100%。
后来改成了 ipset,现在 1000m 宽带,cpu 利用率也不超过 20%。

主要是因为,ipset 使用 hash 查询, 而路由表匹配不到的话,是逐条查询。
dndx
2020-12-30 14:57:04 +08:00
@ttvast 这就很奇怪了,实际上 Linux 的内核路由表一开始也是哈希查询,2.6 之后为了优化前缀查询性能才改成了 trie 树。另外只有第一个数据包需要走 trie,后面往同一地址的数据包直接走路由缓存,O(1)。

https://vincent.bernat.ch/en/blog/2017-performance-progression-ipv4-route-lookup-linux

因为改成 ipset 也不是个小改动,CPU 100% 很有可能不是路由导致的。可以在 RoS 里跑一下 profiler 看看是什么东西用了 CPU 。

我在 hEX 上实测的,200M 跑满测速 CPU 最高峰也只用了 10%。平均在 3-7% 之间。
ixiaoyui
2020-12-30 15:11:19 +08:00
这家用都上 OSPF 了.....
asdgsdg98
2020-12-30 23:46:05 +08:00
相比于爱快之类的系统,ROS 有什么优势吗,有人说 ROS NAT 性能更好,那为什么不用硬路由 NAT+智能网关解决呢?
希望有人能解答
JamesLewisLiu
2020-12-31 15:06:05 +08:00
弱弱的问一句 能配合 OpenWRT 使用吗
dndx
2020-12-31 15:24:37 +08:00
@JamesLewisLiu 当然可以的,如果用 OpenWRT 作为主路由,只要在上面跑 OSPF 协议即可,树莓派这边的配置是一样的。

因为 OSPF 是常见的标准协议,同理主路由可以为任何支持 OSPF 的系统,OpenWRT,Cisco IOS,JunOS 等等都应该可以。
DopaminePlz
2021-01-02 08:54:23 +08:00
楼主在诱惑我折腾家庭网络了,在骗我去学习 ospf
oovveeaarr
2021-01-03 14:43:13 +08:00
感谢 LZ 分享,LZ 做了我一直想做,但是一直懒得做的事情))
smileawei
2021-01-03 16:44:32 +08:00
感谢提供思路。我这边用 openVPN 打隧道成功了。
不过没用 ROS 我设置 ROS 的 mtu 总是设置不到最优,导致用 ROS 卡卡的。直接用 Linux 做了网关。
jdwinter
2021-01-07 00:05:47 +08:00
家用网络都上 ospf 了,我们公司还在用腾达

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/739809

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX