Bird2 + Wireguard + RouterOS
Page content
概述
想要实现的事情是,用VPN把在本地的bugtik与云主机相连,然后用OSPF将他们各自的网段发布出去,实现互访。
当然除了互访之外还能有很多种玩法
化简后的拓扑大概是这样的。
┌─────────────────────┐ ┌─────────────────────┐
│ VPS │ │ RouterOS │
│ Debian 12 │ │ │
│ ─┼──────────────────────┼── │
│ │ WireGuard │ │
│ ─┼──────────────────────┼── │
│169.254.254.45/30 │ │169.254.254.46/30 │
└─────────────────────┘ └─────────────────────┘
为了现这玩意儿,要做的事大概有:
- 架设 Wireguard
- 设置防火墙规则(主要是 RouterOS 上的)
- 配置 RouterOS 上的 OSPF
- 配置 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:~#