Dreamc's blog

分类: 运维管理

  • zerotier组网(自建planet、moon)联动rustdesk远程管理 附加公网ipv6配置

    zerotier组网(自建planet、moon)联动rustdesk远程管理 附加公网ipv6配置

    一、Zerotier 原理(不想了解可跳过)

    一个“分布式网络虚拟化器(distributed network hypervisor)”= 加密 P2P 网络(VL1) + 以太网虚拟层(VL2)

    1️⃣ VL1:Peer-to-Peer 虚拟链路层(底层)

    核心组件:

    • 行星根服务器:planet 负责节点发现、identity 查询(whois)、rendezvous 协助
    • 卫星根服务器:moon 协助planet,功能类似(提升稳定性 / 内网穿透能力)
    • 叶节点客户端:LEAF 客户端节点

    每个节点在VL1上都被唯一标识为40位(10十六进制数字)的zerotier地址。

    通信流程:
    初始通信(还没直连)

            ┌──────────────┐
            │   Planet /   │
            │    Moon(R)   │
            └──────┬───────┘
                   │
            ┌──────▼──────┐
            │             │
         ┌──▼───┐     ┌───▼──┐
         │Node A│     │Node B│
         └──────┘     └──────┘
    
               1. A→R 发包   
             ──────▼────────
            ┌──────────────┐
            │   Planet /   │
            │    Moon(R)   │
            └──────┬───────┘
                   │
                   │ 2. R 查找 B
                   │
                   ▼
            ┌──────────────┐
            │ 如果知道 B   │
            │ 转发给 B     │
            └──────┬───────┘
                   │
            3. 同时发送 rendezvous
                   │
         ┌─────────┴─────────┐
         │                   │
    ┌────▼────┐         ┌────▼────┐
    │ 告诉 A   │         │ 告诉 B   │
    │ 如何找B  │         │ 如何找A  │
    └─────────┘         └─────────┘
    

    🔁 打洞阶段(关键)

    Node A                     Node B
       │                          │
       │ 4. 发送探测包(UDP)       │
       ├──────────────►           │
       │                          │
       │◄───────────────          │
       │ 5. 同时回包               │
       │                          │
    
    👉 NAT 被“打洞”
    ✅ 成功后(直连)
    Node A  ◄──────────────►  Node B
             P2P 直连(VL1)
    
    不再经过 root
    ❌ 失败(fallback)
    Node A → Root → Node B
    (继续中继)
    

    **安全性: **

    Node ID:10 位十六进制字符串,每个 ZeroTier 客户端的唯一标识。该地址是从公共部分计算的公钥/私钥对的。节点的地址、公钥和私钥 密钥共同构成其身份。

    数据包经过非对称公钥加密。

    支持将ZeroTier作为高性能SDN/NFV协议使用在物理安全的网络上,该协议支持一种称为可信路径的功能。可以将所有zerotier设备配置在给定网络以跳过加密和认证。

    2️⃣ VL2:虚拟以太网层(上层)

    主要功能:
    ARP / 广播 / 多播
    VLAN(network ID)
    ACL / flow rules
    IP 分配(IPv4 / IPv6)

    每个VL2网络(VLAN)通过一个64位(16十六进制数字)zerotier网络ID标识,该ID包含网络控制器的40位zerotier地址和一个24位数字确认该网络在该控制器上。

    Network ID: 8056c2e21c123456
                |      |
                |         Network number on controller
                |
                ZeroTier address of controller
    

    控制器是本层的核心,管理着节点的加入,证书的管理、网络的配置。与planet、moon服务器不同(他们负责VL1层的连接)

    controller配置的网络路由和ip会即时的同步给在线的节点。

    网络控制器向给特定成员节点颁发的所有凭据网络由控制器的密钥签名,以允许所有网络成员们来核实这些信息.

    控制器数据以 JSON 格式存储在 ZeroTier 工作目录下。它可以复制、同步、放进去等等。控制器运行时,下面的文件不应被修改,否则可能导致数据丢失;如果直接编辑,请务必避免保存损坏的JSON,因为这可能导致控制器重启时的数据丢失。通过API远胜于直接修改这些文件。controller.d
    本地网络控制器通常运行在127.0.0.1 端口 9993
    具体API可以参考下面链接:https://docs.zerotier.com/api/service/v1/

    本节参考官方文档:The Protocol | ZeroTier Documentation

    问题点:

    • 国内访问官方 planet 有时不稳定
    • NAT / 防火墙导致打洞失败

    👉 解决:

    • 自建 moon(加速+稳定)
    • 或自建 planet(完全私有网络)

    二、组网实践()

    1. 安装 Zerotier

    Linux:

    curl -s https://install.zerotier.com | sudo bash
    

    windows:

    https://download.zerotier.com/dist/ZeroTier One.msi

    macos:

    https://download.zerotier.com/dist/ZeroTier One.pkg

    ios:

    https://apps.apple.com/us/app/zerotier-one/id1084101492

    官方下载网页:

    ZeroTier | Download ZeroTier for All Platforms

    官方github地址:

    zerotier/ZeroTierOne: A Smart Ethernet Switch for Earth

    2. 创建网络

    方式1-官网创建

    登录官网:
    👉 https://my.zerotier.com
    有新旧两个版本,都可以注册,选一个就行。
    新版本只支持1个免费网络、10个设备
    老版本支持3个免费网络、10个设备

    方式2-使用自建控制器创建(私有化)

    使用ztncui自建控制器
    https://key-networks.com/ztncui/#installation

    使用功能和官网差不多。
    支持docker、EL8/9、Debian/Ubuntu。

    x86架构deb包:
    https://s3-us-west-1.amazonaws.com/key-networks/deb/ztncui/1/x86_64/ztncui_0.8.14_amd64.deb
    示例:

    #安装ztncui前务必安装zeroiter
    #安装ztncui
    sudo apt install ./ztncui_0.8.14_amd64.deb
    
    #配置防火墙规则
    sudo ufw allow 3443 # ztncui后端端口,若无公网ip则不需要
    
    #配置文件默认位置/opt/key-networks/ztncui/.env 需自建
    sudo sh -c "echo ZT_TOKEN=`cat /var/lib/zerotier-one/authtoken.secret` > /opt/key-networks/ztncui/.env"
    sudo sh -c "echo ZT_ADDR=127.0.0.1:9993 >> /opt/key-networks/ztncui/.env"  #这个就是zerotier的控制api接口地址
    sudo sh -c "echo HTTPS_PORT=3443 >> /opt/key-networks/ztncui/.env"
    sudo sh -c "echo NODE_ENV=production >> /opt/key-networks/ztncui/.env"
    
    #权限管理
    sudo chmod 400 /opt/key-networks/ztncui/.env
    sudo chown ztncui:ztncui /opt/key-networks/ztncui/.env
    
    #重启服务
    sudo systemctl restart ztncui
    
    #url:https://你的ip:3443/
    #默认账户:admin
    #默认密码:password
    
    

    这个控制器安装在任意节点均可,但务必保持在线。
    打开web界面后add network即可。

    github链接:
    https://github.com/key-networks/ztncui

    3. 加入网络

    管理员权限执行:

    zerotier-cli join <network_id>
    

    4. 授权节点

    在控制器web界面
    勾选设备授权

    5. 配置路由和ip

    添加虚拟局域网路由、ip分配起始地址、自动分配ipv4、ipv6。

    至此,所有授权设备可以通过虚拟网络互相访问。


    三、Moon 节点配置(可选)

    👉 Moon = 你自己的“辅助根节点”

    1. 准备条件

    • 一台公网服务器(推荐有 IPv6)
    • 开放端口:
    9993/udp
    

    2. 生成 moon 配置

    在服务器执行:

    sudo zerotier-idtool initmoon identity.public | sudo tee  moon.json
    

    3. 修改 moon.json(关键)

    编辑:

    "stableEndpoints": [
      "你的公网IP/9993"
    ]
    

    支持 IPv6:

    "stableEndpoints": [
      "[你的IPv6]:9993"
    ]
    

    👉 注意:

    • IPv6 必须加 []
    • 可以写多个 endpoint(IPv4 + IPv6)

    4. 生成签名文件

    sudo zerotier-idtool genmoon moon.json
    

    生成:

    000000xxxxxxxx.moon
    

    5. 部署 moon

    sudo mkdir -p /var/lib/zerotier-one/moons.d
    sudo cp 000000*.moon /var/lib/zerotier-one/moons.d/
    sudo systemctl restart zerotier-one
    

    6. 客户端加入 moon

    方式一

    管理员权限执行

    zerotier-cli orbit [moon节点id] [moon节点id]

    方式二

    .moon 文件复制到客户端:

    /var/lib/zerotier-one/moons.d/
    

    然后:

    systemctl restart zerotier-one
    

    检查:

    zerotier-cli listmoons
    

    7. 验证

    zerotier-cli peers
    

    看到类似:

    moon  OK
    

    四、Planet 节点(完全私有 Zerotier)

    👉 Planet = 官方根服务器替代


    把moon.json copy到个人目录
    cd && sudo cp /var/lib/zerotier-one/moon.json ./planet.json

    修改最后一行的”worldType”: “planet”

    “stableEndpoints”: [填写你的planet公网ip和端口]

    需要用mkmoonworld来编译planet文件(官网github上该工具源文件已经没有了)
    https://g.in0.re/github.com/kaaass/ZeroTierOne/releases/download/mkmoonworld-1.0/mkmoonworld-x86

    # 下载工具
    wget https://g.in0.re/github.com/kaaass/ZeroTierOne/releases/download/mkmoonworld-1.0/mkmoonworld-x86 && sudo chmod +x mkmoonworld-x86
    
    # 编译文件
    ./mkmoonworld-x86 ./moon.json && mv world.bin planet
    
    # 复制到本机zerotier
    sudo rm /var/lib/zerotier-one/planet && sudo cp planet /var/lib/zerotier-one/ && sudo chmod 755 /var/lib/zerotier-one/planet && sudo systemctl restart zerotier-one
    

    下载planet文件 /var/lib/zerotier-one/planet
    客户端替换planet
    客户端目录

    /var/lib/zerotier-one/planet #linux
    
    C:\ProgramData\ZeroTier\One  #win
    
    

    官网手机端需要base64 执行下面命令复制过去。
    base64 planet

    安卓端可以用这位师傅的
    https://github.com/kaaass/ZerotierFix

    • 所有节点必须使用同一个 planet
    • 官方网络将不可用
    • 网络完全由你控制

    👉 一句话总结:

    moon = 辅助
    planet = 接管
    

    moon和planet配置参考博客:https://twiyin0.github.io/views/experience/ztncui.html#编译moons节点


    五、构建SDN家庭网络


    在控制器设置到局域网的静态路由

    目标网段 网关
    局域网网段 安装zerotier的用于转发的设备的虚拟网段ip

    通过路由组网

    1. windows客户端作为中继网关构建

    开启ip转发

    #管理员权限执行启用命令
    
    reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v IPEnableRouter /t REG_DWORD /d 1 /f
    
    # 查看是否成功 
    
    ipconfig /all
    
        Windows IP 配置
    
            主机名  . . . . . . . . . . . . . : WIN-2PXXXXX
            主 DNS 后缀 . . . . . . . . . . . :
            节点类型  . . . . . . . . . . . . : 混合
            IP 路由已启用 . . . . . . . . . . : 是           # 成功
            WINS 代理已启用 . . . . . . . . . : 否
            DNS 后缀搜索列表  . . . . . . . . : lan
            
            
    # 指定网络接口的ipv4开启转发功能  可用下条命令查看ifindex后再填入本命令
    Set-NetIPInterface -ifindex zerotier的网络接口索引 -AddressFamily IPv4 -Forwarding Enabled
    
    # 查看网络接口的转发情况
    Get-NetIPInterface | Select-Object ifIndex, InterfaceAlias, AddressFamily, Forwarding | Format-Table
    
    # 然后可看到其中
         60 ZeroTier One [xxxxxxxxxxxxxxxx]          IPv4    Enabled
    

    配置局域网需要互联的设备:
    有两种方式可以让局域网设备与zerotier虚拟网段设备互通。

    # 方式一 很简单,把局域网需要组网的设备的网关设置成中继网关的ip
    # 例子 配置静态ip
    ip地址 xxx   局域网设备ip
    子网掩码 xxx  同局域网一致
    网关   xxx   中继网关的局域网ip
    dns   xxx    任意dns
    
    # 方式二 在路由器设置转发路由 需把防火墙局域网转发策略设置成允许
    目标网段                    网关
    zerotier的虚拟网段          中继网关的局域网ip
    

    如果配置完仍无法访问
    可能的原因

    1. 路由冲突 #查看路由表 route -4 print
    2. 防火墙转发策略未允许 # 检查配置项或文件/etc/config/firewall
    3. 中继网关的zerotier网络接口转发未启用 #Get-NetIPInterface | Select-Object ifIndex, InterfaceAlias, AddressFamily, Forwarding | Format-Table
    4. zerotier节点是否连上

    2. Linux(ubuntu)客户端作为中继网关构建

    开启ip转发


    # 临时启用
    echo 1 > /proc/sys/net/ipv4/ip_forward
    
    # 永久启用,编辑 /etc/sysctl.conf 添加
    net.ipv4.ip_forward=1
    
    # 应用更改
    sysctl -p
    
    # 配置iptables
    # 对物理网卡和虚拟网卡设置shell变量
    PHY_IFACE=eth0; ZT_IFACE=zt7nnig26
    
    # 启用nat 设置转发
    sudo iptables -t nat -A POSTROUTING -o $PHY_IFACE -j MASQUERADE
    sudo iptables -A FORWARD -i $PHY_IFACE -o $ZT_IFACE -m state --state RELATED,ESTABLISHED -j ACCEPT
    sudo iptables -A FORWARD -i $ZT_IFACE -o $PHY_IFACE -j ACCEPT
    
    # 设置持久化
    sudo apt install iptables-persistent
    sudo bash -c iptables-save > /etc/iptables/rules.v4
    
    

    配置局域网需要互联的设备:
    方式一: 添加路由 虚拟网段 中继网关ip
    方式二:修改网关为中继网关ip
    方式三: 路由器配置路由转发

    3. openwrt作为中继网关构建

    安装软件包 zerotier

    # 安装
    opkg update
    opkg install zerotier
    
    # 启用并加入网络
    uci set zerotier.global.enabled='1'
    uci delete zerotier.earth
    uci set zerotier.mynet=network
    uci set zerotier.mynet.id=<network_id>
    uci commit zerotier
    service zerotier restart
    
    # 配置文件在/etc/config/zerotier
    
    启用 IP 转发(OpenWrt 默认已启用)
    `cat /proc/sys/net/ipv4/ip_forward`
    
    # 创建新网络接口
    uci -q delete network.ZeroTier
    uci set network.ZeroTier=interface
    uci set network.ZeroTier.proto='none'
    uci set network.ZeroTier.device='ztXXXXXXXX' # Replace ztXXXXXXXX with your own ZeroTier device name
     
    # 配置防火墙区域
    uci add firewall zone
    uci set firewall.@zone[-1].name='vpn'
    uci set firewall.@zone[-1].input='ACCEPT'
    uci set firewall.@zone[-1].output='ACCEPT'
    uci set firewall.@zone[-1].forward='ACCEPT'
    uci set firewall.@zone[-1].masq='1'
    uci add_list firewall.@zone[-1].network='ZeroTier'
    uci add firewall forwarding
    uci set firewall.@forwarding[-1].src='vpn'
    uci set firewall.@forwarding[-1].dest='lan'
    uci add firewall forwarding
    uci set firewall.@forwarding[-1].src='vpn'
    uci set firewall.@forwarding[-1].dest='wan'
    uci add firewall forwarding
    uci set firewall.@forwarding[-1].src='lan'
    uci set firewall.@forwarding[-1].dest='vpn'
     
    # 提交更改
    uci commit
     
    # 重启防火墙
    /etc/init.d/firewall restart
    # 重启openwrt
    reboot
    
    # 查看防火墙状态和防火墙通信规则
    /etc/init.d/firewall status
    nft list ruleset
    

    openwrt官方文档:https://openwrt.org/docs/guide-user/services/vpn/zerotier

    通过网络桥接组网

    没有尝试,比路由组网复杂
    官网文档:https://docs.zerotier.com/bridging/


    六、rustdesk远程桌面工具配置


    1. 下载即可使用

    https://github.com/rustdesk/rustdesk/releases/tag/1.4.6
    无需注册登录
    被控端和控制端均需安装rustdesk。

    2. 自建ID/中继服务器(自托管计划)

    使用免费自托管计划就够用
    官网不同环境安装参考:https://rustdesk.com/docs/en/self-host/rustdesk-server-oss/

    # 打开防火墙,云服务的话需到控制台打开
    ufw allow 21114:21119/tcp
    ufw allow 21116/udp
    sudo ufw enable
    
    # 方式一 docker安装
    bash <(wget -qO- https://get.docker.com)
    wget rustdesk.com/oss.yml -O compose.yml
    sudo docker compose up -d
    
    # 方式二 脚本安装服务
    wget https://raw.githubusercontent.com/techahold/rustdeskinstall/master/install.sh
    chmod +x install.sh
    ./install.sh
    从那里,记下安装结束时显示的IP/DNS和密钥
    
    # 方式三 使用deb包安装
    wget https://github.com/rustdesk/rustdesk-server/releases/latest
    sudo apt install <filename>.deb
    

    3. 客户端配置ID/中继服务器

    将安装后显示IP/DNS和密钥 分别插入客户端设置 > 网络 > ID/中继服务器的ID服务器密钥字段中,其他字段留空。如果不用官方中继服务器,那就把中继服务器字段也填上。

    4. 联合zerotier使用

    被控端安装rustdesk后开启ip访问,默认端口21118
    可以在控制远程桌面的输入框直接输入zerotier组网后的ip进行访问。

    实际应用中,rustdesk用的较少。


    七、IPv6 公网访问配置(可选)

    为什么想起折腾ipv6呢,因为在我zerotier手机端用移动网络进行打洞的时候,总是失败,看到有人说移动网络优先ipv6连接,才有了此尝试。如果需要组网的局域网都有ipv6,是不是就可以抛弃zerotier,进行直接访问呢,当然可以,配置路由器防火墙规则,把需要访问的设备应用端口进行端口转发。

    1. planet/moon服务器有 IPv6

    开放对应端口,zerotier默认udp 9993

    重新配置planet或moon,步骤和上面章节一样,不赘述。


    2. 家庭宽带使用 IPv6

    路由器的ipv6配置为native,
    openwrt2512默认配置即可
    然后测试
    curl https://v6.ipgg.cn
    返回了ipv6,说明已经有ipv6
    没有ipv6则需要查看路由器或光猫是否开启ipv6配置,(具体不同型号操作不同,需自行搜索)
    如果开启了还没有公网ipv6,则联系运营商(宽带小哥)


    3. 防火墙放行

    建议根据需要进行端口转发,不要直接让wan访问路由器或lan。


    4. NAT6 配置

    这篇文章很好
    https://www.xrgzs.top/posts/openwrt-istoreos-x-wrt-config-ipv6-nat6

  • ubuntu删除windows分区并管理磁盘附加到文件系统

    一、背景说明

    当前系统为 Ubuntu,磁盘采用 MBR(dos)分区表,存在历史 Windows 分区或未使用分区空间。目标是:

    • 安全删除 Windows / 无用分区
    • 避免破坏现有系统(/ 根分区)
    • 将释放空间用于 /home 目录
    • 提高磁盘利用率,同时保证系统稳定性

    二、当前磁盘结构分析

    示例结构(基于实际环境):

    /dev/sda  59.6G
     ├─sda1   38.3G   (win分区)
     ├─sda2   512M    /boot/esp
     ├─sda3   扩展分区
     └─sda5   20.9G   /   (当前系统根分区)

    关键结论

    • /dev/sda5 是当前系统根分区(不能删除)
    • /dev/sda1 可作为待清理目标(需确认数据)
    • 存在扩展分区(MBR 特有结构)

    三、总体实施策略

    采用 低风险方案

    删除 Windows/旧分区 → 格式化 → 挂载为 /home

    优势

    • 无需移动分区(避免高风险操作)
    • 不影响系统启动
    • 操作简单、可回滚

    四、实施步骤


    1. 数据确认与备份(必须)

    检查 /dev/sda1 是否包含重要数据:

    sudo mount /dev/sda1 /mnt
    ls /mnt

    如有重要数据:

    cp -r /mnt /path/to/backup

    卸载:

    sudo umount /mnt

    2. 删除原 Windows 分区

    使用分区工具:

    sudo apt install gparted
    sudo gparted

    操作:

    • 选择 /dev/sda1
    • 删除(Delete)
    • 应用(Apply)

    3. 创建新分区

    在释放空间上:

    • 新建分区(Primary)
    • 文件系统:ext4
    • 应用更改

    假设新分区为:

    /dev/sda1(重新创建)

    4. 格式化分区

    sudo mkfs.ext4 /dev/sda1

    5. 创建挂载目录

    如果有数据,先备份目标目录再创建挂载分区。示例为把挂载/home目录,实际你也可以挂载其他目录。

    sudo mkdir -p /home

    6. 挂载分区

    sudo mount /dev/sda1 /home

    7. 设置开机自动挂载

    获取 UUID:

    blkid /dev/sda1

    编辑 /etc/fstab

    sudo nano /etc/fstab

    添加:

    UUID=xxxx-xxxx  /home  ext4  defaults  0  2

    测试:

    sudo mount -a

    8. 权限修复

    sudo chown -R ubuntu:ubuntu /home
    chmod 755 /home

    五、可选优化(数据迁移)

    如果 /home 已存在数据:

    sudo rsync -aXS /home /mnt/newhome/

    然后再挂载替换。备份恢复后可用diff查看有无遗失。


    六、安全风险分析


    1. 误删分区

    风险:

    • 删除错误分区导致数据永久丢失

    防护:

    • 使用 lsblkblkid 双重确认
    • 不依赖分区编号(sda1/sda2)

    2. 分区表损坏(MBR 特有)

    风险:

    • 扩展分区结构破坏
    • 分区不可识别

    防护:

    sudo sfdisk -d /dev/sda > partition.bak

    3. 数据残留风险

    删除分区不会清除数据:

    攻击方式:

    • 使用恢复工具(TestDisk / PhotoRec)

    防护:

    sudo shred -v -n 3 /dev/sda1

    4. 挂载失败风险

    原因:

    • UUID 错误
    • 文件系统损坏

    检测:

    dmesg | grep ext4

    5. 权限错误

    表现:

    • /home 无法写入

    修复:

    sudo chown ubuntu:ubuntu /home

    七、性能与优化建议


    1. 文件系统选择

    推荐:

    • ext4(稳定)
    • xfs(大文件场景)

    2. 挂载参数优化

    defaults,noatime

    减少磁盘写入


    3. SSD 优化

    启用 TRIM:

    sudo fstrim -av

    查看磁盘使用情况

    df -h

    卸载过期依赖包

    sudo apt autoremove -y

    查看文件夹占用情况并排序

    sudo du -xh / | sort -rh | head -20

    查看并删除snap旧软件

    sudo snap list --all | awk '$NF=="已禁用"{print $1, $3}' | while read snapname revision; do
        sudo snap remove "$snapname" --revision="$revision"
    done

    八、最终结构示例

    /dev/sda
    ├─sda1   → /home/ubuntu
    ├─sda2   → /boot/efi
    └─sda5   → /
Index