正好和我的网名一样,缘分妙不可言
项目地址#
GitHub: https://github.com/slackhq/nebula
主要文件#
nebula:主程序
nebula-cert:证书生成工具
基本使用#
创建CA证书#
1
2
3
4
| #linux
./nebula-cert ca -name "网络证书名"
#windows
nebula-cert ca -name "网络证书名"
|
网络证书名随意填写,方便记忆即可
执行完成后生成ca.key
(私钥)和ca.crt
(公钥)两个文件
ca.key
用于签名所有的Nebula节点,尽可能单独存放不要放在任何一个节点上
创建密钥与证书#
格式:#
1
| ./nebula-cert sign -name "节点名称" -ip "节点IP/24" -subnets "子网" -groups "组名"
|
- -name,节点名称,可以任意填写,也可以用域名的方式填写
- -ip,指定IP地址,需要手动指定,且不能与已分配的IP地址冲突
- -subnets,指定当前节点的非Nebula路由,以便其它节点能访问当前节点的子网
- -group,指定该节点所在的组,方便 Nebula 进行防火墙规则配置
1
2
3
| ./nebula-cert sign -name "lighthouse" -ip "192.168.100.1/24"
./nebula-cert sign -name "router" -ip "192.168.100.11/24" -subnets "172.16.1.0/24" -groups "router,servers"
./nebula-cert sign -name "laptop" -ip "192.168.100.100/24" -groups "laptop,ssh"
|
配置节点#
官方配置文件:https://github.com/slackhq/nebula/blob/master/examples/config.yml
在Nebula中节点分为两类:LightHouse
节点和和Nebula
节点,LightHouse
节点需要部署在有公网IP的服务器上
在Nebula网络中,节点之间通过Nebula IP
进行通信,注意区分Nebula IP
和IP
的区别
配置LightHouse
节点#
配置重点#
1
2
3
4
5
6
7
8
9
| static_host_map: #静态路由设置为空
lighthouse:
am_lighthouse: true #设置为LightHouse节点
listen:
host: "[::]" #同时监听Ipv6和Ipv4
port: 4242 #监听端口
relay: #如果NAT穿透连接异常,可以设置转发节点通过中继节点进行流量转发
am_relay: true #是否为中继节点
use_relays: true
|
示例配置文件#
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
| pki:
ca: /etc/nebula/ca.crt
cert: /etc/nebula/host.crt
key: /etc/nebula/host.key
static_host_map: #空
lighthouse:
am_lighthouse: true #设置为LightHouse节点
listen:
host: "[::]" #同时监听Ipv6和Ipv4
port: 4242
punchy:
punch: true
cipher: aes
relay:
am_relay: true
use_relays: true
tun:
disabled: false
dev: nebula1
drop_local_broadcast: false
drop_multicast: false
tx_queue: 500
mtu: 1300
routes:
unsafe_routes:
logging:
level: info
format: text
firewall:
conntrack:
tcp_timeout: 12m
udp_timeout: 3m
default_timeout: 10m
max_connections: 100000
outbound:
- port: any
proto: any
host: any
inbound:
- port: any
proto: any
host: any
|
配置Nebula节点#
配置重点#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| static_host_map:
"192.168.100.1": ["LightHouse域名或IP:端口"] #设置Nebula IP到真实域名或IP的映射
lighthouse:
am_lighthouse: false #设置为Nebula节点
interval: 60
hosts:
- "192.168.100.1" #LightHouse的Nebula IP
listen:
host: "[::]" #同时监听Ipv6和Ipv4
port: 0 #启用动态端口
tun:
unsafe_routes: #(可选配置)可以路由某个子节点所在的路由,在所有需要访问该转发节点的访问节点中添加
- route: 172.16.1.0/24 #想要访问子节点的网段
via: 192.168.100.11 # 转发节点对应的路由
|
示例配置文件#
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: "/etc/nebula/ca.crt"
cert: "/etc/nebula/host.crt"
key: "/etc/nebula/host.key"
static_host_map:
"192.168.100.1": ["124.222.162.210:4242"]
lighthouse:
am_lighthouse: false
interval: 60
hosts:
- "192.168.100.1"
listen:
host: "[::]"
port: 0
punchy:
punch: true
relay:
relays:
- 192.168.100.1 #中继节点的Nebula IP
am_relay: false
use_relays: true
tun:
disabled: false
dev: nebula1
drop_local_broadcast: false
drop_multicast: false
tx_queue: 500
mtu: 1300
routes:
unsafe_routes:
logging:
level: info
format: text
firewall:
outbound_action: drop
inbound_action: drop
conntrack:
tcp_timeout: 12m
udp_timeout: 3m
default_timeout: 10m
outbound:
- port: any
proto: any
host: any
inbound:
- port: any
proto: any
host: any
|
防火墙规则#
官方默认:对外访问网络没有任何限制,对内访问只能通过PING,属于laptop和home组的可以通过443/TCP访问当前节点
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
| firewall:
outbound:
# 允许所有出站
- port: any
proto: any
host: any
inbound:
# 入站只允许ping
- port: any
proto: icmp
host: any
# 允许laptop和home组通过443端口访问
- port: 443
proto: tcp
groups:
- laptop
- home
# 允许192.168.100.1/24网段下的remote_client组通过8080端口访问
- port: 8080
proto: tcp
group: remote_client
local_cidr: 192.168.100.1/24
|
运行节点#
创建目录#
创建目录并将配置文件和证书移动到指定目录
1
2
3
4
| mv config.yaml /etc/nebula/config.yaml
mv ca.crt /etc/nebula/ca.crt
mv router.crt /etc/nebula/host.crt
mv router.key /etc/nebula/host.key
|
1
| ./nebula -config /etc/nebula/config.yaml
|
在任何一个非Lighthouse的节点上,都可以ping通Lighthouse则证明配置成功