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
转载请注明来源