使用 WireGuard + OSPF 快速组网

折腾了半天,兜兜转转还是回到了 OSPF 组网,不过这次充分吸取了之前的教训,应该不会再出现意外了。


前期准备

非常重要的系统设置

  • 首先,千万 一定 绝对 要打开 Linux 内核的数据包转发功能,即 ip_forwarding
1
2
3
4
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
echo "net.ipv6.conf.default.forwarding=1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding=1" >> /etc/sysctl.conf
sysctl -p
  • 然后,千万 一定 绝对 要关闭 Linux 内核 rp_filter 的严格模式
1
2
3
echo "net.ipv4.conf.default.rp_filter=0" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.rp_filter=0" >> /etc/sysctl.conf
sysctl -p
  • 最后,检查一下自己的系统是不是预装iptables,我自己就因为这个问题翻过车,如果没有装上,请自行安装。

软件前期安装

必装:bird2wireguard

强烈建议:wireguard-tools,装上这个才能愉快的用 wg-quick,如果你的系统不支持(如 OpenWrt),请自行抉择。

可选:其他组网软件(如 zerotier

内网组网

WireGuard VPN

把你需要配置的服务器通过 WireGuard 直接或间接的连接到一起。

你可以参考我的 WireGuard 配置:

1
2
3
4
5
6
7
8
9
10
11
[Interface]
PrivateKey = <PrivateKey>
ListenPort = <Ports>
Table = off # 非常重要!
PostUp = ip addr add <YourIP> peer <PeerIP> dev %i

[Peer]
PublicKey = <Peer_PublicKey>
Endpoint = <Peer_Endpoint>
AllowedIPs = 0.0.0.0/0,::/0
PersistentKeepalive = 25

Zerotier(可选)

把你需要配置的服务器通过 Zerotier 组成 Full Mesh 网络。

配置 Bird

为了方便管理,这里主要把 bird.conf 作为入口文件,然后逐一细分到其他配置文件。

bird.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
################################################
# Variable header #
################################################

define OWNAS = 4237377373; # change it
define OWNIP = 10.50.211.1; # change it

################################################
# Header end #
################################################

log syslog all;
debug protocols all;

router id OWNIP;

protocol device{
scan time 10;
}

protocol kernel{
ipv4 {
import none;
export all;
};
}

protocol bfd{
}

ipv4 table OSPF_table;
ipv4 table BGP_table;

roa4 table roa4_fwnet;
roa6 table roa6_fwnet;

protocol rpki rpki_fwnet {
roa4 { table roa4_fwnet; };
roa6 { table roa6_fwnet; };
remote "example.com" port 8237; # change it
refresh 30;
retry 5;
expire 600;
}

include "/etc/bird/ospf.conf";
include "/etc/bird/bgp.conf";
include "/etc/bird/ibgp.conf";

protocol pipe pipe_ospf_table{
table master4;
peer table OSPF_table;
import filter {
krt_prefsrc=OWNIP;
accept;
};
export none;
}

protocol pipe pipe_bgp_table {
table master4;
peer table BGP_table;
import filter {
if source != RTS_BGP then reject;
krt_prefsrc=OWNIP;
accept;
};
export none;
}

include "/etc/bird/peers/*";
include "/etc/bird/bxnets/*";

简单介绍一下:

  • 一开始先是定义了我们内网的 IP 和 ASN
  • 然后是 ROA 这里,这里我引入了一个 RPKI,你应该根据自己的需要修改
  • 中间使用了三个 include,这里是引用了三个文件,即一会 OSPF、IBGP、EBGP 都会在这三个文件内实现
  • 最后的两个 include 则是引用了我分别放 EBGP 和 IBGP Peer 文件的地方

ospf.conf

下面使用 OSPF 来确保 AS 内部的连通性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
protocol ospf v2 bxnets {
ipv4 {
table OSPF_table;
export all;
import all;
};
area 0.0.0.0 {
# change it
interface "wg-*" {
cost 5;
type ptp;
};
# change it
interface "zt*" {
cost 7;
};
# may change it
interface "lo" {
type bcast;
};

};
}

同时手动在 lo 接口配置一个 ip 并通过广播 lo 接口的 ip 的方式把你的设备广播在你的 OSPF 里。

1
ip addr add 10.50.211.1 dev lo

为了让这个添加到 lo 的 ip 永久生效,你需要看看你的系统下的网络是怎么管理的。

下面分别展示 netplan 和 interfaces 的配置方法:

1
2
3
4
5
6
# netplan
network:
ethernets:
lo:
addresses: [10.50.211.1/32]
version: 2
1
2
3
4
5
6
7
8
9
# interfaces
auto lo
iface lo inet loopback
dns-nameservers 114.114.114.114 2400:3200::1
dns-search inwang.net

iface lo inet static
address 10.50.211.1
netmask 255.255.255.255

ospf 的 cost 随你喜欢,我个人一般综合判断带宽和延时决定大概给多少 cost。

如果你在调试 bird 的时候发现日志里有提到 MTU 问题,请添加 MTU = 1420 在两边的 [Interface] 下。还是有问题的话尝试继续减小 MTU。

ibgp.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
template bgp bxnet {
local as OWNAS;
source address OWNIP;
ipv4 {
next hop self;
igp table OSPF_table;
table BGP_table;
import all;
export filter {
if source = RTS_STATIC then reject;
accept;
};
};
}

bgp.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
protocol static {
ipv4 {
table BGP_table;
import all;
export none;
};
# change it
route 10.50.211.0/24 reject;
}

template bgp fwnet {
local OWNIP as OWNAS;
ipv4 {
table BGP_table;
import filter {
if (roa_check(roa4_fwnet, net, bgp_path.last) != ROA_VALID) then {
print "[fwnet] ROA check failed for ", net, " ASN ", bgp_path.last;
reject;
} else accept;
};
export filter {
if source ~ [RTS_STATIC, RTS_BGP] then accept;
reject;
};
};
}

这里的过滤器引入了之前提到过的 ROA,如果你用不上应该自行删除。

继续增加节点

这里涉及三个协议,OSPF IBGP EBGP。

对于 OSPF 增加节点只要有一条隧道通上就好了,不过有条件的还是做 WireGuard Fullmesh,这会大幅度提升你的网络稳定性。

EBGP 照样配就是,尽可能就近 peer。

IBGP,你每增加一个节点,这个节点要和现存的所有节点 peer,也就是说 IBGP 需要 fullmesh。

疑难解答

OSPF 没连上

ip addr 看看你的 wg 接口绑定了几个 IP 上去,多于一个那就重写 WireGuard 配置文件。如果你在 PostUp 里绑 IP 了那就不要 Address 字段了。

参考资料

IBGP FullMesh 实现多节点自治域 | bs’ realm

Bird2 - DN42 Wiki


使用 WireGuard + OSPF 快速组网
https://blog.byteloid.one/2024/10/19/使用 WireGuard + OSPF 快速组网/
作者
bingxin666
发布于
2024年10月19日
许可协议