openwrt使用nebula组网

E= γ mc² Lv3

openwrt使用nebula组网

为什么选择nebula,而不是wireugard?

我的目标是两个不同地方的路由器,下面的子设备可以无障碍的互相访问,同时不在这两个子网的设备可以访问两个路由器子网

 graph LR
   subgraph "有公网"
       style 有公网 fill:#e8ffe8,stroke:#008000,stroke-width:2px
       A["openwrt旁路由
192.168.1.3"] <--> B["其他设备
192.168.1.x"] A <--> C["ikuai主路由
192.168.1.2"] end subgraph "无公网" style 无公网 fill:#fff8dc,stroke:#b8860b,stroke-width:2px D["openwrt主路由
192.168.100.1"] <--> E["其他设备
192.168.100.x"] end C <-- "虚拟局域网" --> D C <-- "虚拟局域网" --> F["其他设备"] D <-- "虚拟局域网" --> F

其中有公网的环境是动态公网,需要配合ddns才能使用

但是wireguard对于ddns这种情况的支持非常不好,wireguard只会在启动的时候解析一次域名,公网ip一旦改变连接就会断开

目前唯一的解决方案就是重启wireguard,这对于需要持久连接的场景来说是不能接受的,于是我换了虚拟局域网方案

而nebula会自动重连,无需其他操作就可以自动恢复连接

为什么不选择openvpn?

网状组网不方便,并且配置复杂

为什么不选择tailscale和zerotier?

因为这两个有时候某明奇妙会连接节点服务器失败,如果完全自建这两个服务会非常麻烦

所以我只把他们当成备用而不是主用

graph LR
      A[有公网nebula灯塔节点-路由器
局域网ip:192.168.1.2
虚拟局域网ip:192.168.40.1]:::green B[无公网nebula节点-路由器
局域网ip:192.168.100.1
虚拟局域网ip:192.168.40.2]:::orange C[无公网nebula节点-任意设备
局域网ip:x.x.x.x
虚拟局域网ip:192.168.40.3]:::purple A <-- nebula --> B B <-- nebula --> C C <-- nebula --> A classDef green fill:#e6f4e6,stroke:#86c86c,stroke-width:2px; classDef orange fill:#fff4e6,stroke:#ffc86c,stroke-width:2px; classDef purple fill:#f4e6f9,stroke:#c86cff,stroke-width:2px;

路由器上安装必须的软件包

nebula,nebula-cert,nebula-service

灯塔路由器上生成证书

新建存放配置的文件夹

1
2
mkdir /etc/nebula
cd /etc/nebula/

生成ca证书

1
nebula-cert ca -name "MyVPN"

生成各个节点的证书

1
2
3
nebula-cert sign -name "1" -ip "192.168.40.1/24" -subnets "192.168.1.0/24"
nebula-cert sign -name "2" -ip "192.168.40.2/24" -subnets "192.168.100.0/24"
nebula-cert sign -name "3" -ip "192.168.40.3/24"

编写nebula配置

灯塔路由器(公网节点)

/etc/nebula/config.yml

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
pki:
ca: |
-----BEGIN NEBULA CERTIFICATE-----
# 把/etc/nebula/ca.crt的内容放这里
-----END NEBULA CERTIFICATE-----
cert: |
-----BEGIN NEBULA CERTIFICATE-----
# 把/etc/nebula/1.crt的内容放这里
-----END NEBULA CERTIFICATE-----
key: |
-----BEGIN NEBULA X25519 PRIVATE KEY-----
# 把/etc/nebula/1.key的内容放这里
-----END NEBULA X25519 PRIVATE KEY-----

lighthouse:
am_lighthouse: true # 启用灯塔角色

listen:
host: "::"
port: 14142 #nebula端口 记得在主路由设置端口映射

punchy:
punch: true

firewall:
inbound:
- port: any
proto: any
host: any

outbound:
- port: any
proto: any
host: any

tun:
dev: nebula
drop_local_broadcast: false
drop_external_multicast: false
tx_queue: 500
mtu: 1300
unsafe_routes:
- route: 192.168.100.0/24
via: 192.168.40.2

另一端路由器

/etc/nebula/config.yml

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
pki:
ca: |
-----BEGIN NEBULA CERTIFICATE-----
# 把/etc/nebula/ca.crt的内容放这里
-----END NEBULA CERTIFICATE-----
cert: |
-----BEGIN NEBULA CERTIFICATE-----
# 把/etc/nebula/2.crt的内容放这里
-----END NEBULA CERTIFICATE-----
key: |
-----BEGIN NEBULA X25519 PRIVATE KEY-----
# 把/etc/nebula/2.key的内容放这里
-----END NEBULA X25519 PRIVATE KEY-----

lighthouse:
am_lighthouse: false
hosts:
- "192.168.40.1" # 灯塔路由器的虚拟IP

static_host_map:
# 灯塔路由器的虚拟IP,与灯塔路由器的ddns域名加nebula端口
"192.168.40.1": ["xxx.xxx:14142"]

punchy:
punch: true

firewall:
inbound:
- port: any
proto: any
host: any

outbound:
- port: any
proto: any
host: any

tun:
dev: nebula
drop_local_broadcast: false
drop_external_multicast: false
tx_queue: 500
mtu: 1300
unsafe_routes:
- route: 192.168.1.0/24
via: 192.168.40.1

别的节点

/etc/nebula/config.yml

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
pki:
ca: |
-----BEGIN NEBULA CERTIFICATE-----
# 把/etc/nebula/ca.crt的内容放这里
-----END NEBULA CERTIFICATE-----
cert: |
-----BEGIN NEBULA CERTIFICATE-----
# 把/etc/nebula/3.crt的内容放这里
-----END NEBULA CERTIFICATE-----
key: |
-----BEGIN NEBULA X25519 PRIVATE KEY-----
# 把/etc/nebula/3.key的内容放这里
-----END NEBULA X25519 PRIVATE KEY-----

lighthouse:
am_lighthouse: false
hosts:
- "192.168.40.1" # 灯塔路由器的虚拟IP

static_host_map:
# 灯塔路由器的虚拟IP,与灯塔路由器的ddns域名加nebula端口
"192.168.40.1": ["xxx.xxx:14142"]

punchy:
punch: true

firewall:
inbound:
- port: any
proto: any
host: any

outbound:
- port: any
proto: any
host: any

tun:
dev: nebula
drop_local_broadcast: false
drop_external_multicast: false
tx_queue: 500
mtu: 1300
unsafe_routes:
- route: 192.168.1.0/24
via: 192.168.40.1
- route: 192.168.100.0/24
via: 192.168.40.2

启动nebula

两个路由器

1
/etc/init.d/nebula start

别的节点(这里假设别的节点是一个使用systemd的linux电脑)

1
sudo systemctl start nebula.service

查看nebula是否工作正常

1
ip a | grep -A 3 nebula

在两个路由器设置nat

灯塔路由器

(第一个nat规则我不确定要不要)

设置防火墙允许转发

另一端路由器

(第一个nat规则我不确定要不要)

设置防火墙允许转发


目前互联网上关于openwrt使用nebula组网的资料很少,如有错误请谅解并指出

如果你两个路由器都没有v4和v6的公网,但是有一台公网的服务器,那么可以把灯塔节点放这台服务器上面

  • 标题: openwrt使用nebula组网
  • 作者: E= γ mc²
  • 创建于 : 2025-04-07 07:00:28
  • 更新于 : 2025-04-07 08:38:08
  • 链接: https://redefine.ohevan.com/2025/04/07/openwrt使用nebula组网/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论