查看: 50|回复: 0

[Mikrotik Ros] RouterOS Wireguard+OSPF Mesh组网

[复制链接]

124

主题

0

回帖

508

积分

管理员

积分
508
发表于 2026-8-28 21:57:10 | 显示全部楼层 |阅读模式
关于Wireguard的Mesh组网问题,Wireguard只是作为隧道连接实现远端的通道,而这个通道我们可以选择其他任何的隧道协议,视乎Wireguard更受欢迎。如何实现Mesh的路径选择和网络动态自愈能力,才是关键,就像无线网络的802.11s,考虑到这个问题整个网络建立在三层路由通信需要实现路径选择和网络自愈能力,自然就想到了使用OSPF建立动态路由。
该实例为了保证网络的冗余,会要求到每个Peer允许相同的IP通过,需要采用多个Wireguard实例,因为单个Wireguard接口实例无法实现多Peer允许相同IP通过,包括OSPF的组播地址(会导致Cryptokey Routing路由冲突),网络拓扑如下:

使用Wireguard建立3台路由器的远端隧道连接,3台通过OSP使用Area0建立路由关系,其中R3路由器发布192.168.10.0/24的LAN网络路由到OSPF。
基础网络配置

R1路由器
配置IP地址:
  1. /ip address
  2. /ip/address>add address=192.168.88.30/24 interface=ether1
复制代码
创建2个Wireguard接口,分别对应R2和R3,监听端口分别使用13231和13232
  1. /ip/address>/interface wireguard
  2. /interface/wireguard >add listen-port=13231 name=wireguard1-R2
  3. /interface/wireguard >add listen-port=13232 name=wireguard2-R3
复制代码
创建完成后自行查看public key,用于对端连接,这里不再赘述
R2路由器
配置IP地址:
  1. /ip address
  2. /ip/address>add address=192.168.88.31/24 interface=ether1
复制代码
创建2个Wireguard接口,分别对应R1和R3,监听端口分别使用13231和13230
  1. /ip/address>/interface wireguard
  2. /interface/wireguard >add listen-port=13231 name=wireguard1-R1
  3. /interface/wireguard >add listen-port=13230 name=wireguard2-R3
复制代码
创建完成后自行查看public key,用于对端连接,这里不再赘述
R3路由器
配置IP地址,在R3路由器添加bridge-lan的192.168.10.1:
  1. /ip address
  2. /ip/address>add address=192.168.88.32/24 interface=ether1
  3. /ip/address>add address=192.168.10.1/24 interface=bridge-lan
复制代码
创建Wireguard接口
  1. /ip/address>/interface wireguard
  2. /interface/wireguard > add listen-port=13232 name=wireguard1-R1
  3. /interface/wireguard > add listen-port=13230 mtu=1420 name=wireguard2-R2
复制代码
创建完成后自行查看public key,用于对端连接,这里不再赘述
Wireguard连接

3台路由器的创建两个Wireguard接口,分别和远端的两台连接,组成一个环形网络 ,多接口的wireguard实例才能让peer通过相同的IP段,多点的OSPF组播通信允许224.0.0.5通过才能实现
R1路由器
  1. /interface/wireguard >/ip address
  2. /ip/address> add address=172.16.0.1/30 interface=wireguard1-R2
  3. /ip/address> add address=172.17.0.1/30 interface=wireguard2-R3
复制代码
R2路由器
  1. /interface/wireguard >/ip address
  2. /ip/address> add address=172.16.0.2/30 interface=wireguard1-R1
  3. /ip/address> add address=172.18.0.1/30 interface=wireguard2-R3
复制代码
R3路由器
  1. /interface/wireguard >/ip address
  2. /ip/address> add address=172.17.0.2/30 interface=wireguard1-R1
  3. /ip/address> add address=172.18.0.2/30 interface=wireguard2-R2
复制代码
R1路由器
连接R2和R3路由器,R2连接IP192.168.88.31,指定端口13231和对端的Public key, R3连接192.168.88.32使用13232连接 ,设置相应的allowed-address通过
  1. /interface/wireguard >peer
  2. /interface/wireguard/peers> add allowed-address=172.16.0.0/30,192.168.10.0/24,224.0.0.5/32 \ comment=R2 endpoint-address=192.168.88.31 endpoint-port=13231 \
  3. interface=wireguard1-R2 persistent-keepalive=10s public-key=\
  4. "EZlREKCgf4bwS+kEwzKXsVoayai9LfEVwG+tTghLhTA="
  5. /interface/wireguard/peers>add allowed-address=172.17.0.0/30,192.168.10.0/24,224.0.0.5/32 \
  6. comment=R3 endpoint-address=192.168.88.32 endpoint-port=13232 \
  7. interface=wireguard2-R3 persistent-keepalive=10s public-key=\
  8. "WB/NYqr4y/9IyedhOb9/UYLwBet+kG6B7ROHD56h+FE="
复制代码
R2路由器
连接R1和R3路由器,R1连接IP192.168.88.30,指定端口13231和对端的Public key, R3连接192.168.88.32使用13230连接 ,设置相应的allowed-address通过
  1. /interface/wireguard >peer
  2. /interface/wireguard/peers> add allowed-address=172.16.0.0/30,192.168.10.0/24,224.0.0.5/32 comment=R1 endpoint-address=192.168.99.30 endpoint-port=13231 interface=wireguard1-R1 \
  3. persistent-keepalive=10s public-key= "znDZo7Jotu2Vlgk3Iu8ZNfQoelG5bTnUvssHpOiJPTQ="
  4. /interface/wireguard/peers> add allowed-address=172.18.0.0/30,192.168.10.0/24,224.0.0.5/32 comment=R3 endpoint-address=192.168.99.32 endpoint-port=13230 interface=wireguard2-R3 \
  5. persistent-keepalive=10s public-key= "s9DJhc+43ryGaUgqwhW2NVDrAJFOQz0aPX4Eoo2Up1U="
复制代码
R3路由器
连接R1和R2路由器,R1连接IP192.168.88.30,指定端口13232和对端的Public key, R2连接192.168.88.31使用13230连接 ,设置相应的allowed-address通过
  1. /interface/wireguard >peer
  2. /interface/wireguard/peers>add allowed-address=172.17.0.0/30,192.168.10.0/24,224.0.0.5/32 comment=R1 endpoint-address=192.168.99.30 endpoint-port=13232 interface=wireguard1-R1 \
  3. persistent-keepalive=10s public-key="90xFXVRvk6Fkf1ldWBxaTgYNRovI0GbhyRZFAeL4uxo="
  4. /interface/wireguard/peers>add allowed-address=172.18.0.0/30,192.168.10.0/24,224.0.0.5/32 comment=R2 endpoint-address=192.168.99.31 endpoint-port=13230 interface=wireguard2-R2 \
  5. persistent-keepalive=10s public-key= "UNzDLBa+0ucXp7MzNwKvwaKW1vQeoazFXDWurEUwyW8="
复制代码
3台路由器的Wireguard连接建立完成,注意所有Peer都开启了persistent-keepalive为30秒,目的是能保持状态连接。
OSPF配置

R1路由器
创建ospf实例,设置area区域0
  1. /routing ospf instance
  2. add disabled=no name=ospf-instance-1 redistribute=static
  3. /routing ospf area
  4. add disabled=no instance=ospf-instance-1 name=ospf-area-0
复制代码
R1与R2和R3建立OSPF关系
  1. /routing ospf interface-template
  2. add area=ospf-area-0 disabled=no networks=172.16.0.0/30 type=ptp
  3. add area=ospf-area-0 disabled=no networks=172.17.0.0/30 type=ptp
复制代码
R2路由器
创建ospf实例,设置area区域0
  1. /routing ospf instance
  2. add disabled=no name=ospf-instance-1
  3. /routing ospf area
  4. add disabled=no instance=ospf-instance-1 name=ospf-area-0
复制代码
R2与R1和R3建立OSPF关系
  1. /routing ospf interface-template
  2. add area=ospf-area-0 disabled=no networks=172.16.0.0/30 type=ptp
  3. add area=ospf-area-0 disabled=no networks=172.18.0.0/30 type=ptp
复制代码
R3路由器
创建ospf实例,设置area区域0
  1. /routing ospf instance
  2. add disabled=no name=ospf-instance-1
  3. /routing ospf area
  4. add disabled=no instance=ospf-instance-1 name=ospf-area-1
复制代码
R3与R1和R2建立OSPF关系,并发布192.168.10.0/24的路由
  1. /routing ospf interface-template
  2. add area=ospf-area-1 disabled=no networks=172.18.0.0/30 type=ptp
  3. add area=ospf-area-1 disabled=no networks=172.17.0.0/30 type=ptp
  4. add area=ospf-area-1 disabled=no networks=192.168.10.0/24
复制代码
查看R3的OSPF邻居关系,到R1和R2的state状态为Full,查看R1和R2的OSPF状态这里不再展示
  1. /routing/ospf/neighbor> print
  2. Flags: V - virtual; D - dynamic
  3. 0 D instance=ospf-instance-1 area=ospf-area-1 address=172.17.0.1
  4. router-id=172.17.0.1 state="Full" state-changes=4 adjacency=32m11s
  5. timeout=39s
  6. 1 D instance=ospf-instance-1 area=ospf-area-1 address=172.18.0.1
  7. router-id=172.18.0.1 state="Full" state-changes=5 adjacency=34m21s
  8. timeout=39s
  9. /routing/ospf/neighbor>
复制代码
查看R1的路由,可以看到192.168.10.0/24路由来至172.17.0.2%wireguard2-R3,当前R1到R3是直接连接
  1. /ip/route> print
  2. Flags: D - DYNAMIC; A - ACTIVE; c, o, d, y - COPY; + - ECMP
  3. Columns: DST-ADDRESS, GATEWAY, DISTANCE
  4. DST-ADDRESS GATEWAY DISTANCE
  5. DAd 0.0.0.0/0 192.168.88.1 1
  6. DAc 172.16.0.0/30 wireguard1-R2 0
  7. DAc 172.17.0.0/30 wireguard2-R3 0
  8. DAo+ 172.18.0.0/30 172.16.0.2%wireguard1-R2 110
  9. DAo+ 172.18.0.0/30 172.17.0.2%wireguard2-R3 110
  10. DAo 192.168.10.0/24 172.17.0.2%wireguard2-R3 110
  11. DAc 192.168.88.0/24 ether1 0
复制代码
查看R2的路由
  1. /routing/ospf> /ip route print
  2. Flags: D - DYNAMIC; A - ACTIVE; c, o, d, y - COPY; + - ECMP
  3. Columns: DST-ADDRESS, GATEWAY, DISTANCE
  4. DST-ADDRESS GATEWAY DISTANCE
  5. DAd 0.0.0.0/0 192.168.88.1 1
  6. DAc 172.16.0.0/30 wireguard1-R1 0
  7. DAo+ 172.17.0.0/30 172.16.0.1%wireguard1-R1 110
  8. DAo+ 172.17.0.0/30 172.18.0.2%wireguard2-R3 110
  9. DAc 172.18.0.0/30 wireguard2-R3 0
  10. DAo 192.168.10.0/24 172.18.0.2%wireguard2-R3 110
  11. DAc 192.168.88.0/24 ether1 0
复制代码
中断R3到R1的wireguard连接,R3和R1之间的OSPF中断,OSPF发布的路由将从R3->R2->R1,可以查看R1的路由表,到192.168.10.0/24的路由来至172.16.0.2%wireguard1-R2,R1到192.168.10.0/24路由自动切换到R1->R2->R3。
  1. /interface/wireguard> /ip route/print
  2. Flags: D - DYNAMIC; A - ACTIVE; c, o, d, y - COPY
  3. Columns: DST-ADDRESS, GATEWAY, DISTANCE
  4. DST-ADDRESS GATEWAY DISTANCE
  5. DAd 0.0.0.0/0 192.168.88.1 1
  6. DAc 172.16.0.0/30 wireguard1-R2 0
  7. DAc 172.17.0.0/30 wireguard2-R3 0
  8. DAo 172.18.0.0/30 172.16.0.2%wireguard1-R2 110
  9. DAo 192.168.10.0/24 172.16.0.2%wireguard1-R2 110
  10. DAc 192.168.88.0/24 ether1 0
复制代码
从R3发布的路由R1和R2都能学习到,即使R1到R3路由中断,R1也能从R2学习到R3发布的192.168.10.0/24的路由,这样在基于Wireguard组建的Mesh网络中,使用OSPF实现了网络自愈能力。
选择静态路由也可以实现,R1到R3的192.168.10.0/24需配置两条静态路由,一条经过R2到R3,一条直接到R3,同时R2还要配置静态路由,然后通过distance来控制距离,还需要通过网络监控判断线路是否中断,整个一套配置很繁琐复杂,使用OSPF简化了很多配置。
整套配置思路如果你能理解,放在Openwrt或者其他Linux上,结合OSPF路由协议,也能按照这个方式部署,并不是一定局限于RouterOS平台,只是RouterOS在配置的UI方面要胜过Openwrt和其他Linux。RouterOS逐步完善Container后,在可玩性方面也开始赶上Openwrt。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:admin@discuz.vip

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.|蜀ICP备17024538号-6

在本版发帖
关注公众号
QQ客服返回顶部