nebula组网

nebula是一款开源P2P VPN,只需要有一个中心节点(Lighthouse),其余edge节点通过中心节点建立一次连接之后,edge之间会自己进行fullmesh,从而达到一个P2P的一个使用情况,当遇到无法P2P的时候,也可通过中心节点进行relay

github地址:https://github.com/slackhq/nebula

创建CA证书

Nebula 通过将 ip 地址和路由等信息嵌入到证书文件,可以实现只需要证书和一个固定的配置文件即可加入网络。CA 证书的创建可直接使用 nebula-cert 创建:

证书的创建需要几个字段:

  • -groups: 该CA证书签发的子证书可以使用哪些组,这些组可以方便地配置防火墙策略。
  • -ips:该CA证书适用的IP地址段。
  • -name:该CA的名称。
nebula-cert ca -groups groupsname -ips x.x.x.x/x -name "Networking CA"

执行该步骤后,会在目录下生成 ca.crt(证书)和 ca.key(密钥)。

创建用户证书

如果没有指定参数,nebula-cert 将默认使用本目录的 ca.crt/ca.key

有以下几个参数:

  • -group:该证书所属的设备流量将被归为哪些组。
  • -ip:IP 地址将被嵌入在证书中,这增加了网络的稳定性,除非配置错误,否则不太可能出现 IP 地址冲突的状况,同时也能够在不同的用户端使用相同的配置模板,同时也便于大规模部署。
  • -name:名称是可以随便取的,但我依然按照域名来写。
  • (可选)-subnets:该节点可以通过本参数被指定为 Nebula 网络的出口,与其他网络互联。
nebula-cert sign -groups groupsname -ip x.x.x.x/x -name name

配置文件详解

  • lighthouse端
pki:
  ca: |
    -----BEGIN NEBULA CERTIFICATE-----
    # CA公钥
    -----END NEBULA CERTIFICATE-----
  cert: |
    -----BEGIN NEBULA CERTIFICATE-----
    # lighthouse公钥
    -----END NEBULA CERTIFICATE-----
  key: |
    -----BEGIN NEBULA X25519 PRIVATE KEY-----
    # lighthouse私钥
    -----END NEBULA X25519 PRIVATE KEY-----

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

listen:
  host: "::" 代表同时监听IPV6与IPV4
  port: 14142 #nebula端口

punchy:
  punch: true #开启P2P打洞功能

relay:
  am_relay: 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

#配置nebula自带的SSH服务,方便调试
sshd:
  enabled: true
  listen: 127.0.0.1:2222
  host_key: /etc/nebula/ssh_host_ed25519_key
  authorized_users:
    - user: root
      keys:
      - 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC7wWNqkTg6Gs4hRHy6KWrPCHVYdVynmpRfa3qwWcsDgACaW7182BNA3g173L9CTAEebeXxMyalYcpGDiqu5xOLF6BDLiRK2GcN5ekTuwev8Qv2AVXMso1wrYGfEBk5ZF43kiByQMNN6heEyoWycH+0lYr1C4I+JKuV/3pb6cBNNaWyJzBymrH7C6mWIKZ0eVW9QyQW3ofRjG/Kt0w7nei6JoT3ia3Gewgii779fgHObT6kEdQbQIC5TKe5XfW/giSEPdjI8V1myayOrUMTKGy/LSYoubPyWOffV2QZjTHzTBosE9t6UPiZ6cK0R664K3SdfHusJImhM/8hIu45JxiKc7GoGok+FnmThFbJHSjuRlKHkuEMSkgIMJMSa1kFWgwy1gv6zDpeTFVCZjyi/i5z9wkVh+tkSiTmImOKSIFa67VUnb7EMdGwhleFJmFFSLNZX1DQGAN8CeJpCujmnIHWPbQSxwdf9WipmKtj8YHoiLQyaacenB6ARmlhnRA1UCk= root@AliCloud'
  • 客户端
pki:
  ca: |
    -----BEGIN NEBULA CERTIFICATE-----
	# CA公钥
    -----END NEBULA CERTIFICATE-----

  cert: |
    -----BEGIN NEBULA CERTIFICATE-----
	# 客户端公钥
    -----END NEBULA CERTIFICATE-----
  key: |
    -----BEGIN NEBULA X25519 PRIVATE KEY-----
    # 客户端私钥
    -----END NEBULA X25519 PRIVATE KEY-----

lighthouse:
  am_lighthouse: false
  hosts:
   - "192.168.40.1" #lighthouse IP

static_host_map:
  "192.168.40.1": ["x.x.x.x:14142"] # 静态映射lighthouse对应的公网地址/端口

punchy:
  punch: true

relay:
  relays:
    - 192.168.40.1 # 打洞不成功则经过中心节点relay
  am_relay: false # 自身非中转节点
  use_relays: true # 开启relay

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

systemd 服务

ubuntu下,我创建一个 Nebula 的 systemd 服务,它被放置在 /etc/systemd/system/nebula.service,相应的配置文件则在 /etc/nebula/config.yml,日志写入到/var/log/nebula.log

[Unit]
Description=Nebula VPN Service
After=network.target

[Service]
ExecStart=/bin/bash -c '/usr/local/bin/nebula -config /etc/nebula/config.yml 2>&1 | logger -t nebula'
Restart=on-failure
RestartSec=5
User=root
AmbientCapabilities=CAP_NET_ADMIN
CapabilityBoundingSet=CAP_NET_ADMIN
NoNewPrivileges=true
LimitNOFILE=1048576
StandardOutput=journal
StandardError=journal
SyslogIdentifier=nebula

[Install]
WantedBy=multi-user.target

配合配置rsyslog,配置文件位置/etc/rsyslog.d

if $programname == 'nebula' then /var/log/nebula.log
& stop

转载请注明来源