Ubuntu 22.04 安装 Nebula VPN 指南

Ubuntu 22.04 安装 Nebula VPN 1.11.2 完整指南:官方二进制下载与 sha256 校验、证书签发、最小配置、-test 校验、systemd 托管与开机自启、离线安装方案、常见故障与卸载清理,全程实机实测。

Nebula VPNVPN网络配置Ubuntu2026/10/20

Ubuntu 22.04 安装 Nebula VPN 指南

目标:在一台 Ubuntu 22.04 服务器上以官方二进制 + systemd 方式安装 Nebula VPN 1.11.2,跑通证书签发、配置校验、服务托管与开机自启的完整链路。文中全部命令与回显均来自本机实测(执行日期 2026-10-20),方案设计与软件背景见《Nebula VPN 1.11.2 介绍与选型指南》(https://www.quzuo.net/document/pyoceG4tz3PZ),配置参数逐项说明见《Nebula VPN 1.11.2 配置参数详解》。

一、环境信息

  • 操作系统:Ubuntu 22.04.4 LTS(x86_64),systemd 249(systemctl --version 实测首行 systemd 249 (249.11-0ubuntu3.23))
  • 内核要求:具备 TUN 设备(/dev/net/tun 存在),Ubuntu 默认内核自带
  • 软件版本:Nebula VPN 1.11.2(当前最新稳定版,2026-09-22 发布,GitHub releases.atom 实查)
  • 安装方式:官方 GitHub Releases 二进制包 nebula-linux-amd64.tar.gz
  • 部署形态:单机部署一个 lighthouse(信标)节点,systemd 托管,/usr/local/bin + /etc/nebula 标准目录布局
  • 网络参数:overlay 网段 10.99.0.0/24,节点 IP 10.99.0.1,underlay 监听 UDP 4242

二、前置条件

安装前逐项确认:

  1. root 或 sudo 权限:nebula 需要创建 TUN 网卡(CAP_NET_ADMIN)并写 /etc、/usr/local/bin。
  2. TUN 设备存在(虚拟机/云主机环境需额外确认,物理机默认满足):
ls -l /dev/net/tun

实测输出:

crw-rw-rw- 1 root root 10, 200 10月 19 23:47 /dev/net/tun
  1. UDP 4242 端口空闲。注意 Nebula 监听的是 UDP 而非 TCP,排查时用 ss -lunp:
ss -lunp | grep ':4242 ' || echo "4242 free"

实测输出:

4242 free
  1. 系统防火墙与云安全组放行 UDP 4242。实测本机 ufw 为关闭状态(ufw status 回显 Status: inactive);若开启 ufw 则执行 sudo ufw allow 4242/udp;云主机还需在控制台安全组放行同规则。
  2. 下载通道可达 github.com(离线环境直接看方案 B)。

三、版本选型说明

版本发布日期(releases.atom 实查)说明
v1.10.12026-01-16v1.10 系列首个稳定版
v1.10.22026-01-21补丁版
v1.10.32026-02-08v1.10 系列当前末版
v1.11.02026-07-23v1.11 首版
v1.11.12026-08-21补丁版
v1.11.22026-09-22当前最新稳定版,本文版本

选型结论:新装一律用最新稳定版 v1.11.2(v1.11.2 修复了 Windows 端 NLMTU 处理、Android netlink 绑定、macOS 自地址校验三个缺陷,属低风险补丁版);生产升级前留意 Release Notes 是否有兼容性变更。架构选择:x86_64 选 linux-amd64,ARM 主机选 linux-arm64。

安装渠道说明:Nebula 官方只提供 GitHub Releases 二进制分发,Ubuntu 官方 apt 源中没有 nebula 包,因此「官方二进制 + systemd」就是社区标准装法。v1.11.2 的发布件不再附带 CHECKSUMS 校验清单(发布资产实测仅含各平台压缩包),下载后用 sha256sum 记录哈希与官方发布页大小核对即可。

四、方案 A:官方二进制在线安装

4.1 下载与校验

cd /tmp
curl -LO "https://github.com/slackhq/nebula/releases/download/v1.11.2/nebula-linux-amd64.tar.gz"
ls -l nebula-linux-amd64.tar.gz
sha256sum nebula-linux-amd64.tar.gz

实测输出:

-rw-r--r-- 1 root root 18600385 10月 20 18:16 nebula-linux-amd64.tar.gz
6140d33f2ec21ce7f6b655b5bc820e93a684d97e51d0ddcf907324b5b28aac1e  nebula-linux-amd64.tar.gz

文件大小 18,600,385 字节与 GitHub 发布页一致;sha256 可留存与后续升级包比对。

4.2 解压并安装二进制

tar xzf nebula-linux-amd64.tar.gz
ls -l nebula nebula-cert
install -m 0755 nebula /usr/local/bin/nebula
install -m 0755 nebula-cert /usr/local/bin/nebula-cert
nebula -version
nebula-cert -version

实测输出(ls -l 与两个版本号均为实测,uid 1001 为 tar 包内保留的打包者 uid):

-rwxr-xr-x 1 1001 1001 26317909  9月 22 21:02 nebula
-rwxr-xr-x 1 1001 1001 10336960  9月 22 21:02 nebula-cert
Version: 1.11.2
Version: 1.11.2

💡 注意:v1.11.2 起 tar 包内同时包含 nebula(主程序)与 nebula-cert(证书工具)两个二进制,一次解压即齐;老版本教程里的 nebula-cert-linux-amd64.tar.gz 单独包已不存在。

4.3 生成 CA 与节点证书

mkdir -p /etc/nebula
nebula-cert ca -name "Quzuo Nebula CA" -duration 87600h -out-crt /etc/nebula/ca.crt -out-key /etc/nebula/ca.key
nebula-cert sign -name lighthouse -networks "10.99.0.1/24" -groups "lighthouse" -ca-crt /etc/nebula/ca.crt -ca-key /etc/nebula/ca.key -out-crt /etc/nebula/host.crt -out-key /etc/nebula/host.key
ls -l /etc/nebula/

实测输出(两条签发命令静默成功,exit=0;ls 回显如下,四个文件均为 600 权限):

total 16
-rw------- 1 root root 261 10月 20 18:20 ca.crt
-rw------- 1 root root 174 10月 20 18:20 ca.key
-rw------- 1 root root 326 10月 20 18:20 host.crt
-rw------- 1 root root 127 10月 20 18:20 host.key

要点:-duration 87600h 表示 CA 有效期 10 年;节点证书默认跟随 CA 有效期上限,可用 nebula-cert sign -duration 收短。证书参数与运维组合在《Nebula VPN 1.11.2 常用 CLI 命令详解》篇逐条展开。

4.4 编写节点配置

写入 /etc/nebula/config.yaml(lighthouse 节点最小可用配置):

pki:
  ca: /etc/nebula/ca.crt
  cert: /etc/nebula/host.crt
  key: /etc/nebula/host.key

lighthouse:
  am_lighthouse: true
  interval: 60

listen:
  host: 0.0.0.0
  port: 4242

tun:
  dev: nebula0
  mtu: 1300

firewall:
  outbound:
    - port: any
      proto: any
      host: any
  inbound:
    - port: any
      proto: any
      host: any

4.5 配置校验与前台试运行

先用 -test 校验配置再启动是好习惯:

nebula -test -config /etc/nebula/config.yaml
echo "exit=$?"

实测输出节选(实测尾部;首行为整份配置回显故略去):

time=2026-10-20T18:21:10.771+08:00 level=INFO msg="Firewall rule added" firewallRule="map[caName: caSha: cidr: direction:incoming endPort:0 groups:[] host:any localCidr: proto:0 startPort:0]"
time=2026-10-20T18:21:10.771+08:00 level=INFO msg="Firewall started" firewallHashes=SHA:498215dec4e5687a2353f51c10838c113bd1af35ef72b8e8c9f536986ada5417,FNV:2782948616
time=2026-10-20T18:21:10.771+08:00 level=INFO msg="Main HostMap created" preferredRanges=[]
time=2026-10-20T18:21:10.771+08:00 level=INFO msg="punchy enabled"
exit=0

配置有问题时 -test 会直接给出原因并以非零退出(实测故障配置回显):

time=2026-10-20T18:21:10.785+08:00 level=ERROR msg="Could not load client cert" error="unable to read pki.cert file /etc/nebula/missing.crt: open /etc/nebula/missing.crt: no such file or directory"
exit=1

前台试运行观察启动日志:

nebula -config /etc/nebula/config.yaml

实测输出(出现 Nebula interface is active 即启动成功,Ctrl+C 可退出):

time=2026-10-20T18:21:28.491+08:00 level=INFO msg=listening addr=0.0.0.0:4242
time=2026-10-20T18:21:28.491+08:00 level=INFO msg="Nebula interface is active" interface=nebula0 networks=[10.99.0.1/24] build=1.11.2 udpAddr=0.0.0.0:4242 boringcrypto=false

4.6 systemd 托管与开机自启

Ctrl+C 停掉前台进程后,创建 /etc/systemd/system/nebula.service(实测单元全文):

[Unit]
Description=Nebula VPN Service
Documentation=https://nebula.defined.net/docs/
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/nebula -config /etc/nebula/config.yaml
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

启用并启动:

systemctl daemon-reload
systemctl enable --now nebula
systemctl is-enabled nebula; systemctl is-active nebula

实测输出:

enabled
active

服务状态核查:

systemctl status nebula --no-pager -l | head -14

实测输出:

● nebula.service - Nebula VPN Service
     Loaded: loaded (/etc/systemd/system/nebula.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2026-10-20 18:33:16 CST; 29s ago
       Docs: https://nebula.defined.net/docs/
   Main PID: 1463729 (nebula)
      Tasks: 10 (limit: 38359)
     Memory: 9.8M
        CPU: 39ms
     CGroup: /system.slice/nebula.service
             └─1463729 /usr/local/bin/nebula -config /etc/nebula/config.yaml

10月 20 18:33:16 ops nebula[1463729]: time=2026-10-20T18:33:16.688+08:00 level=INFO msg=listening addr=0.0.0.0:4242

实测单节点内存占用仅 9.8M,lighthouse 无业务流量时 CPU 接近零。

4.7 验证

ss -lunp | grep ':4242 '
journalctl -u nebula --no-pager | tail -3

实测输出:

UNCONN 0      0            0.0.0.0:4242       0.0.0.0:*    users:(("nebula",pid=1463825,fd=8))          
time=2026-10-20T18:33:16.688+08:00 level=INFO msg="Firewall started" firewallHashes=SHA:498215dec4e5687a2353f51c10838c113bd1af35ef72b8e8c9f536986ada5417,FNV:2782948616
time=2026-10-20T18:33:16.688+08:00 level=INFO msg=listening addr=0.0.0.0:4242
time=2026-10-20T18:33:16.689+08:00 level=INFO msg="Nebula interface is active" interface=nebula0 networks=[10.99.0.1/24] build=1.11.2 udpAddr=0.0.0.0:4242 boringcrypto=false

同时 ip addr show nebula0 应能看到 10.99.0.1/24 已落在网卡上。至此单节点安装完成;接入 client 节点、防火墙分组与 relay 的配置在《Nebula VPN 1.11.2 配置参数详解》篇实测展开。

五、方案 B:离线二进制安装

适用于无法直连 GitHub 的内网主机,思路是「联网机下载 → 校验 → 传输 → 相同安装步骤」。

  1. 在联网机上下载(同 4.1)并记录校验值:
大小:18,600,385 字节
sha256:6140d33f2ec21ce7f6b655b5bc820e93a684d97e51d0ddcf907324b5b28aac1e
  1. 传输到目标主机(U 盘/内网文件服务均可,以 scp 为例):
scp nebula-linux-amd64.tar.gz user@内网主机:/tmp/
  1. 目标主机上校验后按 4.2–4.7 完全相同步骤安装:sha256sum 比对哈希一致 → 解压 → install 到 /usr/local/bin → 证书与配置 → systemd 单元。所有后续步骤与方案 A 完全一致,无需联网。

💡 离线环境的证书建议在运维机上统一签发(nebula-cert 是独立二进制,可离线运行),把 ca.crt/host.crt/host.key 与 config.yaml 一起分发,节点上不留 CA 私钥,缩小密钥暴露面。

六、方案对比与选择建议

维度方案 A:在线安装方案 B:离线安装
网络要求安装机可达 github.com仅传输介质可用即可
校验手段sha256 + 文件大小对照发布页sha256 提前在联网机算好,离线侧复算比对
适用场景单台/少量可上网服务器无外网的数据中心、涉密机房
升级方式重新 curl 下载替换二进制联网机制作升级包,走内网分发
一致性风险低(直取官方发布件)中(注意别把解压后的二进制与包混传)

选择建议:能联网一律方案 A;批量离线机器建议把「下载+校验+签证书」做成一条内网流水线,避免逐台手抄。两种方案最终的运行形态(二进制路径、目录、systemd 单元)完全一致,后续篇章不再区分。

七、安装产物与配置说明

安装完成后系统内留下的产物清单(路径均为实测):

路径说明实测权限
/usr/local/bin/nebula主程序守护进程0755
/usr/local/bin/nebula-cert证书签发/校验工具0755
/etc/nebula/ca.crtCA 证书(分发给所有节点)0600
/etc/nebula/ca.keyCA 私钥(只留签发机,严禁随节点分发)0600
/etc/nebula/host.crt本节点证书0600
/etc/nebula/host.key本节点私钥0600
/etc/nebula/config.yaml节点配置0644
/etc/systemd/system/nebula.servicesystemd 单元0644
journald tag nebula运行日志(journalctl -u nebula)-

systemd 单元字段解读:

  • Type=simple + ExecStart=/usr/local/bin/nebula -config /etc/nebula/config.yaml:nebula 前台常驻,无需 fork 守护。
  • Restart=on-failure / RestartSec=5:异常退出自动拉起;手动 systemctl stop 不会被重启。
  • LimitNOFILE=65536:节点规模大时(几千条隧道)抬高句柄上限。
  • WantedBy=multi-user.target:随系统启动,is-enabled 实测回显 enabled。

安全建议:ca.key 建议迁移到签发机或离线保管,节点只留 ca.crt 与自身证书/私钥;config.yaml 中如果写有 lighthouse 地址等信息,注意不要把含真实拓扑的配置公开。

八、常见问题

8.1 启动报 unable to bind to socket: address already in use

端口被其他进程占用。先用 UDP 视角排查(Nebula 是 UDP 监听,用 ss -lunp 而非 -ltnp):

ss -lunp | grep ':4242 '

实测占用时的 journalctl -u nebula 报错(真实复现):

time=2026-10-20T18:44:39.490+08:00 level=INFO msg=listening addr=0.0.0.0:4242
time=2026-10-20T18:44:39.500+08:00 level=ERROR msg="Failed to open udp listener" queue=0 error="unable to bind to socket: address already in use"

(注意该场景下 nebula 会先打一条 listening 再报 bind 失败并退出,以 ERROR 行为准。)释放占用进程或改 listen.port 后重启服务即可。

8.2 重复签发报 refusing to overwrite existing cert

nebula-cert sign 的 -out-crt/-out-key 指向已存在的文件时会拒绝覆盖(实测):

Error: refusing to overwrite existing cert: dup.crt

(exit=1)先删除旧文件或改用新文件名;轮换证书时用带日期的新文件名(如 host-2026.crt)更稳妥。

8.3 -test 校验失败排查

nebula -test 的 ERROR 行会直接指出问题文件与原因,常见是 pki 三个路径写错或文件权限不可读,见 4.5 节实测故障回显;修好后再启动。

8.4 两节点握手一直不通(Handshake timed out)

client 侧日志反复出现 Handshake message sent 后伴随 Handshake timed out 且无 Handshake message received,常见原因依次排查:① UDP 4242 未放行(云安全组/ufw);② static_host_map 里 lighthouse 的 underlay 地址写错;③ 两侧 cipher 显式钉死了不同算法(默认不写则自动协商,实测不匹配时的现象与修法见《Nebula VPN 1.11.2 配置参数详解》5.5 节)。

8.5 升级前必须留意的点

升级 = 替换二进制 + 重启服务(先 nebula -version 确认新版本),回滚同理放回旧二进制。证书与配置与二进制版本解耦,不用重签;跨大版本(如 1.9→1.11)先读 Release Notes 的变更说明。

九、卸载与清理

按依赖顺序完整移除(以下为实测卸载过程,回显逐行照抄):

systemctl disable --now nebula
systemctl is-active nebula
ss -lunp | grep ':4242 ' || echo "4242 not listening"
ip link show nebula0
rm /etc/systemd/system/nebula.service
systemctl daemon-reload
rm -rf /etc/nebula
rm -f /usr/local/bin/nebula /usr/local/bin/nebula-cert

实测输出:

Removed /etc/systemd/system/multi-user.target.wants/nebula.service.
inactive
4242 not listening
Device "nebula0" does not exist.

最终核验(实测,三项均应无输出或回显“不存在”):

systemctl list-unit-files | grep nebula || echo "no nebula unit"
pgrep -ax nebula || echo "no nebula process"
ss -lunp | grep ':4242 ' || echo "4242 not listening"

实测输出:

no nebula unit
no nebula process
4242 not listening

如在其他节点也要卸载,同样先 disable --now 再删文件;删除 /etc/nebula 前确认 ca.key 是否还需保留(CA 私钥一旦删除,全网证书都要重新签发)。

十、参考链接