Bird2 + Wireguard + RouterOS

Page content

概述

想要实现的事情是,用VPN把在本地的bugtik与云主机相连,然后用OSPF将他们各自的网段发布出去,实现互访。
当然除了互访之外还能有很多种玩法
化简后的拓扑大概是这样的。

┌─────────────────────┐                      ┌─────────────────────┐
│ VPS                 │                      │ RouterOS            │
│ Debian 12           │                      │                     │
│                    ─┼──────────────────────┼──                   │
│                     │      WireGuard       │                     │
│                    ─┼──────────────────────┼──                   │
│169.254.254.45/30    │                      │169.254.254.46/30    │
└─────────────────────┘                      └─────────────────────┘
                                                                    

为了现这玩意儿,要做的事大概有:

  1. 架设 Wireguard
  2. 设置防火墙规则(主要是 RouterOS 上的)
  3. 配置 RouterOS 上的 OSPF
  4. 配置 VPS 上的 Bird2

确定思路之后就可以开干了。

实施

架设 Wireguard

在 VPS 端部署 Wireguard ,首先需要准备好配置文件,并上传到服务器上。然后使用命令 wg-quick up <conf> 启动 VPN 服务。 在配置过程中,有几个关键点需要注意。第一点是与 peer 的 AllowedIPs 需要设置为全零。这样做是为了让 Wireguard 能够接受从任何网段发来的数据包,但也意味着所有的流量都会默认通过 VPN 路由。为了避免这一点,我们需要添加 Table=off ,避免这样的事情发生。
在我自己的配置实例中,还创建了一个专门的路由表,将 VPN 与云主机原本的路由分开,避免搞混。

[Interface]
PrivateKey = vps_privkey
ListenPort = 14514
Table = off
PostUp = ip addr add 169.254.254.45/32 peer 169.254.254.46/32 dev %i
PostUp = ip link set %i up
PostUp = ip ro add 169.254.254.46/32 dev %i table 110
PostUp = ip rule add from 169.254.254.44/30 table 110
PreDown = ip rule del from 169.254.254.44/30 table 110
mtu = 1400 # 因为我是在IPv6下建立wg连接,此时MTU有可能会影响OSPF,所以要改改MTU。如果是在v4环境下使用可以把这个去掉。

[Peer]
PublicKey = ros_public_key
AllowedIPs = 0.0.0.0/0

然后是 RouterOS 的一端。记得将名字和key啥的按照实际情况修改。

/interface wireguard
add listen-port=40026 mtu=1400 name=to-v6 # 留意MTU设定
/interface wireguard peers
add allowed-address=0.0.0.0/0 endpoint-address=2409:1145:1419:19::810 endpoint-port=14514 interface=to-v6 persistent-keepalive=25s public-key="vps_pub_key"
/ip address
add address=169.254.254.46/30 interface=to-v6 network=169.254.254.44
/interface list # 设置一个接口列表,将Wireguard接口加进去,方便日后管理防火墙
add name=SDWAN
/interface list member
add interface=to-v6 list=SDWAN
/ip firewall filter # 加防火墙,允许 OSPF 从 Wireguard 入站
add action=accept chain=input comment="SDWAN: accept OSPF from SDWAN" in-interface-list=SDWAN protocol=ospf

弄好之后可以互相ping试一下,看看网是不是通了。

配置 RouterOS 的 OSPF

/routing ospf instance
add disabled=no name=ospf0 router-id=114.5.1.4
/routing ospf area
add disabled=no instance=ospf0 name=ospf0-area
/routing ospf interface-template
add area=ospf0-area disabled=no interfaces=to-v6,lo,bridge prefix-list="" type=ptp

配置 bird2

写配置文件 /etc/bird/bird.conf

log "/var/log/bird.log" all;
router id 192.168.4.254; # router id 记得改
protocol device {
    scan time 60;
};
# Filter 用来防止误发布的默认路由被学进来,影响VPS的网络
filter avoid_default_route {
    if (net ~ [0.0.0.0/0]) then reject;
    accept;
}
protocol kernel {
    learn;
    scan time 20;
    kernel table 110;
    ipv4 {
        import all;
        export all;
    };
};
protocol direct {
    ipv4;
    # 记得改成实际的wg网卡名称,下面的也是
    interface "to-01BF52";
};
protocol ospf myOSPF {
    area 0.0.0.0 {
        interface "to-01BF52" {
            cost 10;
            type pointopoint;
            hello 10;
            dead 40;
        };
    };
    ipv4 {
        import all;
        export filter avoid_default_route;
    };
};

写好之后 systemctl restart bird 重启 bird 服务。
然后稍等片刻。如无意外的好OSPF连接就建立好了。可以运行 birdc s o n 查看OSPF邻居状态,如果 State 显示 Full ,那就是OK。

root@v6:~# birdc s o n
BIRD 2.0.7 ready.
myOSPF:
Router ID       Pri          State      DTime   Interface  Router IP
114.5.1.4       128     Full/PtP        37.633  to-01BF52  169.254.254.46
root@v6:~# 

ROS上面的也是,state="Full"就是OK

[admin@KAFnet-Router-01BF52] /routing/ospf/neighbor> pr
Flags: V - virtual; D - dynamic
 0  D instance=ospf0 area=ospf0-area address=169.254.254.45 router-id=192.168.4.254 state="Full" state-changes=11 adjacency=2h18m32s timeout=37s

这时候应该可以查看到路由

root@v6:~# ip ro sh ta 110
169.254.254.44/30 via 169.254.254.46 dev to-01BF52 proto bird metric 32 
169.254.254.46 dev to-01BF52 scope link 
169.254.254.46 dev to-01BF52 proto bird scope link metric 32 
169.254.254.48/30 via 169.254.254.46 dev to-01BF52 proto bird metric 32 
169.254.254.50 via 169.254.254.46 dev to-01BF52 proto bird metric 32 
172.16.10.1 via 169.254.254.46 dev to-01BF52 proto bird metric 32 
192.168.11.0/24 via 169.254.254.46 dev to-01BF52 proto bird metric 32 
root@v6:~#