宿舍网络改造Part2 虚拟组网

axty 1939 字 预计阅读时间: 9 分钟 发布于 2026-06-04 289 次阅读


AI 摘要

宿舍网络改造总卡在公网IP?不如用Netbird自建一套完全自主可控的虚拟组网!从部署、分组到内网DNS,手把手教你梭哈开源方案,彻底告别第三方中转的不可控风险。

目前虚拟组网有三种选择,ZeroTailer【1】/Tailscale【2】/Netbird【3】

如果基于三者自带的Saas服务【5】的话,三者的难易程度其实差不多,都是敲个命令就能弹出来链接,再去后台确认服务器就可以。最多再加两个自建中继服务器【6】去,其全套基础设施仍是不自主可控【7】的状态。而NetBird【4】的好处便是可以把全套都拿来自部署,既然选择自建,便是尽可能自主可控为上等(笑),于是便梭哈【8】netbird。

配置环境

我们依据官方文档来进行后续操作,如有变化请以官方文档为准。
上方的为老版官方文档,新版的官方文档更为方便快捷,我们依据新版文档继续:

curl -fsSL https://github.com/netbirdio/netbird/releases/latest/download/getting-started.sh | bash

首先我们会遇见第一个问题:

The NETBIRD_DOMAIN variable cannot be empty.                                            
Enter the domain you want to use for NetBird (e.g. netbird.my-domain.com): 

这里我们已经准备好了域名,所以直接填入netbird.seewater.cc

Which reverse proxy will you use?
  [0] Traefik (recommended - automatic TLS, included in Docker Compose)
  [1] Existing Traefik (labels for external Traefik instance)
  [2] Nginx (generates config template)
  [3] Nginx Proxy Manager (generates config + instructions)
  [4] External Caddy (generates Caddyfile snippet)
  [5] Other/Manual (displays setup documentation)

Enter choice [0-5] (default: 0):

由于这台vps上已经存在着Nginx【9】,我们选择2让它生成nginx-netbird.conf

Should container ports be bound to localhost only (127.0.0.1)?                          
Choose 'yes' if your reverse proxy runs on the same host (more secure).                 
Bind to localhost only? [Y/n]: y

这里是是否让它只绑定到localhost【11】而不是0.0.0.0【12】,我们这里选择只让它监听localhost而非0.0.0.0以防止出现与Docker【13】之流的host桥接【15】ip打架【16】的问题。

Is Nginx running in Docker?                                                             
If yes, enter the Docker network Nginx is on (NetBird will join it).                    
Docker network (leave empty if not in Docker):                                          

由于我用nginx【10】的时候docker【14】还在源里面等着我,所以这里直接留空。

Rendering initial files...                                                              
==========================================                                              
  NGINX SETUP                                                                           
==========================================                                              
Generated: nginx-netbird.conf                                                           
IMPORTANT: Nginx requires manual TLS certificate setup.                                 
You'll need to obtain SSL/TLS certificates and configure the paths in the               
generated config file. The config includes examples for common certificate sources.     
Next steps:                                                                             
  1. Obtain SSL/TLS certificates (Let's Encrypt recommended)                            
  2. Edit nginx-netbird.conf and update certificate paths                               
  3. Install to /etc/nginx/sites-available/ (Debian) or /etc/nginx/conf.d/ (RHEL)       
  4. Test and reload: nginx -t && systemctl reload nginx                                
For detailed TLS setup instructions, see:                                               
https://docs.netbird.io/selfhosted/reverse-proxy#tls-certificate-setup-for-nginx        
Container ports (bound to 127.0.0.1):                                                   
  Dashboard:     8080                                                                   
  NetBird Server: 8081 (all services)                                                   
Press Enter when your reverse proxy is configured (or Ctrl+C to exit)...

这里让你跑去nginx那里改一下脚本生成的nginx-netbird.conf,我们直接退出然后重载nginx配置。

生成的nginx-netbird.conf由于行数过多,不做展开,我们找到使用ssl和http2模块监听443端口的server块,在里面修改最关键的两处ssl_certificatessl_certificate_key。这里的证书我在使用nginx建站时已搭配acme.sh【17】签发过通配符域名【18】+根域名【19】的证书,所以直接填入证书路径即可。填完后使用以下命令跑一下子:

nginx -t
nginx -s reload

第一行的是检查一下nginx配置文件是否有错,可以有效防止使用第二行命令热重载配置时由于配置文件问题直接挂掉nginx整个服务。

跑镜像

我们在有docker-compose.yml的目录里面执行一下docker compose up -d来按照yaml【20】里面写的配置pull到netbird的latest image【21】,然后按照这个image创建一个container【23】并且run起来(docker的正常流程),执行docker ps可以看到如下所示的列表:

CONTAINER ID   IMAGE                             COMMAND                  CREATED       STATUS      PORTS   

                                                              NAMES                     

85ccf7447211   netbirdio/dashboard:latest        "/usr/bin/supervisor…"   13 days ago   Up 9 days   443/tcp,

 127.0.0.1:8080->80/tcp                                       netbird-dashboard                             

08c117b962b0   netbirdio/netbird-server:latest   "/go/bin/netbird-ser…"   13 days ago   Up 9 days   0.0.0.0:

3478->3478/udp, [::]:3478->3478/udp, 127.0.0.1:8081->80/tcp   netbird-server            

其中netbird-dashboard顾名思义,则是给你的后台相关(这里指代netbird.seewater.cc )提供服务支持的,而netbird-server则是负责运行stun服务器【24】来提供打洞【25】与流量中继【26】的。

倒腾后台

添加客户端

打开对应的安装网址,可以看到如下图的登录界面:

登录进去后会有一个新手指导,最后会指向添加客户端的界面,与直接使用官方服务相比,我们只需要修改对应客户端的Management URL即可,添加setup key环节与官方服务一致。

在后台setup key页面创建完对应的setup key后,与官方后台一样会进入到Install netbird的环节,其指明了如何在对应平台的客户端上修改Management URL,故于此不再赘述,仅额外提一点注意事项:

如选择docker方式【27】跑客户端,需注意以下两点内容:

  • 安装命令依照官方的文档,如遇到部分权限问题,可以考虑插入--cap-add=SYS_ADMIN 和 --cap-add=SYS_RESOURCE参数以提升权限。文档里自称用了许多eBPF【28】 和 raw 套接字【29】所以推荐上这两个权限,但是其实为可选项,依最小权限原则【30】为妙。
  • 若期望对应客户端能够转发流量,在跑前加上--Network【31】 host来让对应的container跑在host模式【32】(此时container会自己创建个网口来接管对应流量)下为妙,否则会出现丢包无法转发流量的情况。

Network

Group

伴随着我们的Peer【33】数量与日俱增,如何能够方便的管理这些设备随之提上了日程。最后按照用途与位置将Peer划为四组:

组名归类Policies【34】
ALL兜底用,不知道放哪就丢这里nope
AAU宿舍内网的基础设施,一般日常不跟着我走access vps【35】, access aau【36】, aau p2p【37】
Users会跟着我一块走的随身电子设备access vps, access aau
vps各式服务器小鸡access vps, access aau, vps p2p【38】

在给Peer分完组后,我们按如下列表划出两个Network:
这里有一点需要注意,Network那里显示的POLICIES是按照你内部的resource【39】所绑定的policy来的,而非你绑定的peer的policy。

namepeersresource
aau直接用AAU那个peer的组加一个路由器的内网ip以便直接访问路由器,加一个thinkpad的内网ip以便通过备线访问
vps直接用vps那个peer的组🈚️

同时伴随着对应的Policies的去向:

NAMEDIRECTION
access vpsAAU, Users <--> vps
access aauvps, Users <--> aau
aau p2paau <--> aau
vpsvps <--> vps

最后便是dns,我们搞一点内网域名以便直接使用域名访问而非记一堆ip:
首先添加一个Nameservers【40】,ip可以随心所欲,port是否随心所欲存疑,Distribution Groups【42】记得勾选上你想要在让这个ns生效的peer group,如下图所示。

然后添加对应的Zone【43】,这里的Zone起到了添加自定义的一级域名的作用。同时可以在Zone里面添加对应的解析记录,跟平常的dns解析后台一样的使用,如下图举例:

反代

由于我们部署的时候并未选择在docker里面也跑Traefik【44】而是与vps上的nginx进行集成,所以与官方实例相比我们无法使用Reverse Proxy这一部分。Reverse Proxy需要你在Custom Domains里面添加一个Domain cluster(其实就是一个特定的公网域名 用于netbird接管这个子域名来对外生成一个暴露对应服务的直链供没装netbird的设备直接使用对应的内网服务)
最终成品如下: