nebula 简单教程

nebula 是 slack 开源的基于 P2P 主机加密组网项目

为了满足内部加密、分区隔离以及其他操作的需求, Slack 开发了可扩展的覆盖网络(Overlay Network)工具 Nebula. 覆盖网络是一种创建在互联网之上的网络, 覆盖网络中的节点, 可通过虚拟或是逻辑相连接。Nebula 让 Slack 能够无缝地连接位在世界各地的计算机, 目前支持在 Linux, OSX 和 Windows,甚至 Slack 也正在开发 iOS 版本

nebula 项目地址 https://github.com/slackhq/nebula
下面就记录搭建一个简单网络教程

搭建节点目标
名称公网ipnebula ip简介
lighthouse1lighthouse1.example.com10.1.1.1/24灯塔1, 拥有公网ip
lighthouse2lighthouse2.example.com10.1.1.2/24灯塔2, 拥有公网ip
node110.1.1.11/24普通节点1, 没有公网ip
node210.1.1.12/24普通节点2, 没有公网ip
node310.1.1.13/24普通节点3, 没有公网ip
生成证书
  1. 生成主证书 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 过期时前一秒

  1. 签署 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"

  1. 签署普通节点证书

# 产生两个文件 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

  1. 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"

  1. 普通节点

# 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