nebula 简单教程
nebula 简单教程
nebula 是 slack 开源的基于 P2P 主机加密组网项目
为了满足内部加密、分区隔离以及其他操作的需求, Slack 开发了可扩展的覆盖网络(Overlay Network)工具 Nebula. 覆盖网络是一种创建在互联网之上的网络, 覆盖网络中的节点, 可通过虚拟或是逻辑相连接。Nebula 让 Slack 能够无缝地连接位在世界各地的计算机, 目前支持在 Linux, OSX 和 Windows,甚至 Slack 也正在开发 iOS 版本
nebula 项目地址 https://github.com/slackhq/nebula
下面就记录搭建一个简单网络教程
搭建节点目标
名称 | 公网ip | nebula ip | 简介 |
---|---|---|---|
lighthouse1 | lighthouse1.example.com | 10.1.1.1/24 | 灯塔1, 拥有公网ip |
lighthouse2 | lighthouse2.example.com | 10.1.1.2/24 | 灯塔2, 拥有公网ip |
node1 | 无 | 10.1.1.11/24 | 普通节点1, 没有公网ip |
node2 | 无 | 10.1.1.12/24 | 普通节点2, 没有公网ip |
node3 | 无 | 10.1.1.13/24 | 普通节点3, 没有公网ip |
生成证书
- 生成主证书
CA
, 后面所有节点证书都是这个主证书签名的
# 生成一个机构名为 nebula test 的主证书 # 当前目录下会产生两个文件 ca.crt 主密钥的证书, ca.key 主密钥的私钥 ./nebula-cert ca -name "nebula test"
新版本可以设置
key
过期时间了, 默认过期时间是87600h0m0s
也就是一年
# 设置 key 过期时间为十年 ./nebula-cert ca -name "nebula network" -duration 876000h0m0s # sign 也有 duration 参数, 默认是 CA 过期时前一秒
- 签署 lighthouse 节点证书
# 生成一个名为 lighthouse1, ip 为 10.1.1.1/24 节点 # 产生两个文件 lighthouse1.crt lighthouse1 的证书, lighthouse1.key 私钥 # 只要修改参数 name, ip 就可以生成 lighthouse2 证书了 ./nebula-cert sign -name "lighthouse1" -ip "10.1.1.1/24" # ./nebula-cert sign -name "lighthouse2" -ip "10.1.1.2/24"
app 端证书签名, 需要使用 app 生成的
device.pub
# 使用 app 生存的 device.pub 来生成 phone1.crt 即可 ./nebula-cert sign -in-pub device.pub -name "phone1" -ip "10.1.1.100/24"
- 签署普通节点证书
# 产生两个文件 node1.crt node1 的证书, node2.key 私钥 # 其实普通证书跟 lighthouse 没有啥区别, 在 nebula 看来都是节点 # groups 参数可以看作给节点打标签, 供后面的 firewall 挑选/过滤使用 ./nebula-cert sign -name "node1" -ip "10.1.1.11/24" -groups "g1, g2" # ./nebula-cert sign -name "node2" -ip "10.1.1.12/24" -groups "g1, g2" # ./nebula-cert sign -name "node3" -ip "10.1.1.13/24" -groups "g1, g2"
配置文件
复制 example 的配置文件修改下就行
https://github.com/slackhq/nebula/blob/master/examples/config.yml
- lighthouse 节点
# pki 修改证书文件位置 pki: ca: ${nebula_home}/ca.crt # 对应节点修改即可 cert: ${nebula_home}/lighthouse1.crt key: ${nebula_home}/lighthouse1.key static_host_map: "10.1.1.1": ["lighthouse1.example.com:4242"] "10.1.1.2": ["lighthouse2.example.com:4242"] lighthouse: # lighthouse 节点为 true am_lighthouse: true #serve_dns: false interval: 60 # hosts is a list of lighthouse hosts this node should report to and query from # IMPORTANT: THIS SHOULD BE EMPTY ON LIGHTHOUSE NODES # lighthouse 节点不要配置该项 # hosts: # - "192.168.100.1" listen: host: 0.0.0.0 port: 4242 #batch: 64 #read_buffer: 10485760 #write_buffer: 10485760 # 开启强力打洞 punchy: true punch_back: true # Nebula security group configuration firewall: conntrack: tcp_timeout: 120h udp_timeout: 3m default_timeout: 10m max_connections: 100000 outbound: # Allow all outbound traffic from this node - port: any proto: any host: any inbound: # Allow icmp between any nebula hosts - port: any proto: icmp host: any # 节点间允许所有通讯 - port: any proto: any cidr: "10.1.1.1/24"
- 普通节点
# pki 修改成对应证书即可 pki: ca: ${nebula_home}/ca.crt # 对应节点修改即可 cert: ${nebula_home}/node1.crt key: ${nebula_home}/node1.key # 告诉 nebula 有公网 ip 的对应关系, 特别是 lighthouse 节点公网 ip, # 普通节点有公网 ip 也可以配置, 就免去 nat 打洞查找了 static_host_map: "10.1.1.1": ["lighthouse1.example.com:4242"] "10.1.1.2": ["lighthouse2.example.com:4242"] lighthouse: # 普通节点为 false am_lighthouse: false #serve_dns: false interval: 60 # hosts is a list of lighthouse hosts this node should report to and query from # IMPORTANT: THIS SHOULD BE EMPTY ON LIGHTHOUSE NODES # 普通节点要配置该项, 列出知道的 lighthouse 节点 hosts: - "10.1.1.1" - "10.1.1.2" listen: host: 0.0.0.0 port: 4242 #batch: 64 #read_buffer: 10485760 #write_buffer: 10485760 # 开启强力打洞 punchy: true punch_back: true # Nebula security group configuration firewall: conntrack: tcp_timeout: 120h udp_timeout: 3m default_timeout: 10m max_connections: 100000 outbound: # Allow all outbound traffic from this node - port: any proto: any host: any inbound: # Allow icmp between any nebula hosts - port: any proto: icmp host: any # 节点间允许所有通讯 - port: any proto: any cidr: "10.1.1.1/24"
备注
- 所有节点签名都是由同一个主密钥的证书(ca.crt), 跟私钥(ca.key) 来签名的
- 所有节点 ip 必须在同一个网段下面, 比喻上面就是 "10.1.1.1/24" 网段, 支持
cidr
网段- 目前
nebula
打洞能力不怎么好, 在复杂的nat
后面的两个普通节点不容易打洞成功- nebula 电报交流群 t.me/nebula_net