← 返回首页

腾讯云主机安装proxmox面板,桥接也不断网的办法

📎Debian12纯命令清单.mdPHP下载
本地电脑目录:C:\Users\Administrator\Desktop\pyscan\Linux KVM
SQL
# 腾讯云 Debian 12 装 KVM + Proxmox VE:不断网操作手册

> **适用场景**:腾讯云 CVM / 轻量应用服务器(公网 IP 为 NAT 映射),Debian 12。
> **本文档来源**:2026-09-14 在 `114.132.244.13` 上的真实执行记录,桥接切换**零断网**通过。
> **文档目标**:让"改远程服务器网络"这件事,从"赌运气"变成"有兜底的工程操作"。

---

## 目录

- [0. 一页速查(下次直接照做)](#0-一页速查下次直接照做)
- [1. 结论先行:桥接到底会不会断网](#1-结论先行桥接到底会不会断网)
- [2. 原理:为什么腾讯云桥接可以不断网](#2-原理为什么腾讯云桥接可以不断网)
- [3. 四个高危点(比桥接更危险的三个)](#3-四个高危点比桥接更危险的三个)
- [4. 不断网的四层保险(核心方法论)](#4-不断网的四层保险核心方法论)
- [5. 完整操作流程(六步)](#5-完整操作流程六步)
- [6. netguard 看门狗详解](#6-netguard-看门狗详解)
- [7. 高危操作检查清单](#7-高危操作检查清单)
- [8. 故障处置手册](#8-故障处置手册)
- [9. 附录](#9-附录)

---

## 0. 一页速查(下次直接照做)

### 0.1 前置检查(三件事,缺一样别动手)

| 检查项 | 怎么查 | 本轮结果 |
|---|---|---|
| **有控制台 VNC** | 腾讯云控制台 → 实例 → 登录 → VNC 登录 | ✅ 有。这是终极兜底,必须先确认 |
| **SSH 能直连** | 本机 `nc -vz <IP> 22` | ✅ 通 |
| **公网 IP ≠ 网卡 IP** | 进机器 `curl ifconfig.me` 对比 `ip -4 addr` | ✅ `114.132.244.13` vs `10.1.24.4` → 说明是 NAT |

### 0.2 六步流水(复制即可)

bash

── 本机环境(Windows Git Bash)──

P=C:/Users/Administrator/.workbuddy/binaries/python/envs/default/Scripts/python.exe cd "C:/Users/Administrator/Desktop/pyscan/Linux KVM" export PVEHOST=<你的IP> PVEUSER=root PVEPASS='<你的密码>'

① 只读侦察(不改任何东西)

$P scripts/recon.py

② 备份 + 加固 + 部署并武装看门狗(不动网络)

$P scripts/rc.py put scripts/netguard.sh /tmp/netguard.sh $P scripts/rc.py put scripts/netguard.service /tmp/netguard.service $P scripts/rc.py sh scripts/01-backup-harden.sh

→ 必须看到 armed: YES 和 net_ok: YES 才能进下一步

③ 接入 PVE 源(自动测速选最优镜像)+ 预演

$P scripts/rc.py sh scripts/02-pve-repo.sh

→ 看 "会移除哪些包",确认 ifupdown 会被换成 ifupdown2

→ 看 "选用" 哪个镜像,速度应 > 1 MB/s

④ 后台安装 PVE(detached,不怕 SSH 断)

$P scripts/rc.py sh scripts/03-install-pve.sh

→ 轮询进度:

$P scripts/rc.py run "grep -E 'INSTALL_START|INSTALL_DONE|APT_EXIT' /var/log/pve-install.log; du -sh /var/cache/apt/archives"

⑤ 切桥接(高危,先开本机探活)

$P scripts/watch.py 1800 & # 本机裁判,后台跑 $P scripts/rc.py put scripts/04-switch-bridge.sh /tmp/04-switch-bridge.sh $P scripts/rc.py run "sed -i 's/\r\$//' /tmp/04-switch-bridge.sh; rm -f /root/netguard/switch.log; setsid nohup bash /tmp/04-switch-bridge.sh >/dev/null 2>&1 </dev/null & sleep 5; cat /root/netguard/switch.log"

⑥ 端到端验证

$P scripts/rc.py sh scripts/05-verify.sh
CODE
### 0.3 出事怎么办(三句话)

1. **SSH 断了**:先别慌,等 **5 分钟**——netguard 会自己回滚。回来看 `/var/log/netguard.log`。
2. **5 分钟后还没好**:上**腾讯云控制台 → VNC 登录**,跑 `/usr/local/sbin/netguard.sh rollback`。
3. **要全部还原**:见 [8.4 完全撤销](#84-场景-d想把机器还原成没装过) 。

---

## 1. 结论先行:桥接到底会不会断网

> **不会。至少在腾讯云上不会——只要做对一件事:让 `br0` 显式沿用原网卡的 MAC。**

本次实测数据:

| 指标 | 切换前 | 切换后 |
|---|---|---|
| 内网 IP | `10.1.24.4/22` | `10.1.24.4/22`(**没变**) |
| 出口公网 IP | `114.132.244.13` | `114.132.244.13`(**没变**) |
| MAC | `52:54:00:d7:a0:cc` | `52:54:00:d7:a0:cc`(**没变**,现在在 br0 上) |
| 切断时长 | — | **0 秒** |
| 切换耗时 | — | `ifreload` 2 秒 + 自检 9 秒 |

本机侧独立探活(每 15 秒探一次 22 端口,跑满全程):**零 DOWN 记录**,延迟稳定 115ms。

---

## 2. 原理:为什么腾讯云桥接可以不断网

### 2.1 腾讯云的网络模型

互联网

CODE
 │
 ▼

公网 IP 114.132.244.13 ← 这是"映射",不是绑在你网卡上的

CODE
 │

[ 腾讯云 NAT / 弹性网卡 ]

CODE
 │

内网 IP 10.1.24.4 ← 这才是真正配在 eth0 上的

CODE
 │

你的 eth0 (MAC 52:54:00:d7:a0:cc)

CODE
关键点:**公网 IP 是 NAT 映射到内网 IP 的,而 DHCP 是按 MAC 分配内网 IP 的。**

### 2.2 桥接不断网的充要条件

Linux bridge 有个特性:**创建时会继承第一个加入端口的 MAC**。

所以桥接时只要显式写死:

bash
auto br0
iface br0 inet dhcp

CODE
bridge-ports eth0
hwaddress ether 52:54:00:d7:a0:cc   # ← 这一行是命脉
CODE
效果链条:

br0 用 eth0 的 MAC 发 DHCP 请求

CODE
  → 腾讯云 DHCP 看到"同一个 MAC"
  → 发回"同一个内网 IP" 10.1.24.4
  → NAT 映射的对应关系完全不变
  → 公网 IP 照旧,SSH 照旧
CODE
**从云平台视角看,这根本不叫"换网卡",只是"同一张网卡换了个壳"。**

### 2.3 什么云会断(别被别人的经验吓到)

| 云平台 | 桥接会不会断 | 原因 |
|---|---|---|
| **腾讯云** | ❌ 不会(实测) | 不做 MAC 反欺骗过滤 |
| 阿里云 | 通常不会 | 同 NAT 模型,但部分机型有源/目标检查 |
| **AWS EC2** | ⚠️ **会断** | 有 **MAC 反欺骗** 过滤,只允许绑定的 MAC |
| **Oracle Cloud** | ⚠️ **会断** | 需要先在控制台把 VNIC 切成"混杂模式" |
| 华为云 | 视机型 | 部分做源 IP/MAC 检查 |

**结论**:网上说"桥接必断网"的,大多来自 AWS/Oracle 用户。你的经验不能直接套。

### 2.4 动手前如何自测"我这台会不会断"

进机器跑这一条,判断是否 NAT 模型:

bash

公网 IP(NAT 出口)与网卡真实 IP 不同 → 是 NAT 模型,可桥接

curl -s https://ifconfig.me; echo ip -4 -br addr show scope global

顺便确认元数据里的 MAC 与网卡一致(腾讯云会校验这个)

curl -s http://169.254.0.23/latest/meta-data/mac; echo cat /sys/class/net/eth0/address
CODE
若两者**不同**,说明是 NAT 模型,桥接沿用 MAC 即可不断网。
若公网 IP 直接配在网卡上(IP 相同),那就是另一套模型,需谨慎。

---

## 3. 四个高危点(比桥接更危险的三个)

按实际危险程度排序——**桥接只排第四**:

| # | 高危点 | 后果 | 对策 |
|---|---|---|---|
| 1 | **cloud-init 覆盖网络配置** | 重启后桥接配置被冲掉 → **开机失联** | 写 `99-disable-network-config.cfg`;新 `interfaces` **故意不 source `interfaces.d/*`**(双保险) |
| 2 | **装完 PVE 内核后重启,网卡改名** | `eth0` 变 `ens3`,配置里名字全失效 → 无网 | 用 `.link` 文件按 MAC 锁名,或 GRUB 加 `net.ifnames=0`;**本机已有该参数,风险为零** |
| 3 | **`ifupdown` → `ifupdown2` 的替换** | 包管理器替换瞬间可能动网 | 先确认可登录、装完立刻验证 SSH;`ifreload` 是 ifupdown2 才有的增量工具 |
| 4 | **应用 br0 桥接配置** | `interfaces` 写错 → 连接打断 | 沿用 MAC + detached 执行 + 看门狗 |

### 坑 1 详解:为什么 cloud-init 是"重启失联"的元凶

原 `/etc/network/interfaces.d/50-cloud-init` 是 cloud-init 生成的,它的文件头**自己就写着**:

Changes to it will not persist across an instance reboot.

To disable cloud-init's network configuration capabilities, write a file

/etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:

network: {config: disabled}

CODE
即:**这个文件重启后会重新生成,你改它没用。** 不处理的话,重启时它会把桥接配置冲掉。

**处理方式(双保险)**:

bash

保险 A:从源头禁止 cloud-init 管网络

mkdir -p /etc/cloud/cloud.cfg.d printf 'network: {config: disabled}\n' > /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg

保险 B:新的 interfaces 故意不写 "source /etc/network/interfaces.d/*"

就算 cloud-init 将来重新生成了那个文件,也根本不会被读取

CODE
### 坑 3 详解:Proxmox 官方源在国内几乎不可用

实测数据(同一台机器,同一时间):

| 源 | 下载速度 | 装 1.5GB 预计耗时 |
|---|---|---|
| `download.proxmox.com`(官方) | **935 B/s** | **约 20 天** |
| `mirrors.tuna.tsinghua.edu.cn`(清华) | **1.2 MB/s** | **3 分 54 秒** ✅ |
| `mirrors.ustc.edu.cn`(中科大) | 649 kB/s | 约 40 分钟 |
| 阿里云 / 腾讯云自有镜像站 | — | **没有 PVE 源** |

**换源后快约 1300 倍。** 这是整个流程里性价比最高的一步。

---

## 4. 不断网的四层保险(核心方法论)

这是全文最重要的一节。**"不断网"不是一个技巧,是四层防御的叠加结果。**

┌──────────────────────────────────────────────────────────────────┐
│ 第 4 层 · 终极兜底:云控制台 VNC │
│ 网卡彻底配死时唯一能救命的通道。动手前必须先确认它可用。 │
├──────────────────────────────────────────────────────────────────┤
│ 第 3 层 · 自动兜底:netguard 看门狗(systemd 常驻) │
│ 连续 300s 不通 → 三级自动回滚 → 全失败则不重启、保留现场。 │
├──────────────────────────────────────────────────────────────────┤
│ 第 2 层 · 让"改网络"这个动作本身不怕断 │
│ detached 执行 + ifreload 增量应用 + 脚本内置自检+立即回滚 │
│ + 本机侧独立探活(客观证据) │
├──────────────────────────────────────────────────────────────────┤
│ 第 1 层 · 事前:全量备份 + 切断干扰源 │
│ 备份 /etc/network 等 + 记录 MAC/IP/GW/DNS + 禁 cloud-init + 修 hosts │
└──────────────────────────────────────────────────────────────────┘

CODE
### 第 1 层 · 事前:备份 + 切断干扰源

**做三件事**(脚本 `01-backup-harden.sh` 已封装):

1. **全量备份**
   

bash
cp -a /etc/network /etc/hosts /etc/resolv.conf /etc/cloud \

CODE
     /etc/default/grub /etc/fstab  <备份目录>/
CODE
   并落一份现场快照:`ip addr` / `ip route` / `dpkg -l` / `lsblk` / `/proc/cmdline`。

2. **把原始网络参数记成变量**(看门狗回滚全靠它)
   

bash
ORIG_DEV / ORIG_MAC / ORIG_CIDR / ORIG_GW / ORIG_DNS

CODE
   写入 `/etc/netguard/config`。

3. **切断两个干扰源**:禁 cloud-init 管网络、把 `/etc/hosts` 的主机名从回环 `127.0.1.1` 改成真实内网 IP。

> **为什么备份要这么细?**
> 因为回滚时你可能是"半个脑子"的状态(网络断着、SSH 连不上、只能靠 VNC 敲命令)。
> 那时候你最需要的不是聪明,而是**一条已知正确的原配置**。

### 第 2 层 · 让"改网络"这个动作本身不怕断

三个具体做法:

**① detached 执行——SSH 断了脚本也要跑完**

bash
setsid nohup bash /tmp/04-switch-bridge.sh > /root/netguard/switch.log 2>&1 < /dev/null &

CODE
`setsid` 让脚本脱离 SSH 会话的进程组,`</dev/null` 切断 stdin。
否则网络一抖 SSH 断开 → 脚本收到 SIGHUP 被杀 → **配置写到一半,机器处于最危险状态**。

**② 用 `ifreload -a`,不用 `ifdown/ifup`,更不用 `systemctl restart networking`**

| 命令 | 行为 | 是否安全 |
|---|---|---|
| `ifreload -a` | **增量**应用差异,只动需要动的接口 | ✅ 安全 |
| `ifdown eth0 && ifup eth0` | 先把接口 down 掉 | ⚠️ 必断 |
| `systemctl restart networking` | 全量重启整个网络栈 | ⚠️ 必断 |

`ifreload` 是 `ifupdown2` 才有的。这也是为什么装 PVE 时必须让 `ifupdown2` 替换掉 `ifupdown`。

**③ 脚本内置自检 + 失败立即回滚**

切换脚本不等看门狗那 5 分钟窗口,自己最多自检 75 秒,不通就立刻调回滚:

bash
for i in $(seq 1 15); do

CODE
sleep 5
[ "$(/usr/local/sbin/netguard.sh check)" = "OK" ] && { OK=yes; break; }

done
[ "$OK" = "yes" ] || /usr/local/sbin/netguard.sh rollback # 立即回滚,不干等

CODE
**④ 本机侧独立探活——"裁判"与"运动员"分离**

改网络的脚本跑在目标机上,它自己说"我没断"不算数。`watch.py` 从**机器外面**每 15 秒探一次 22 端口,日志落 `netwatch.log`。这份日志就是"零断网"的客观证据,也可以事后复盘抖动时间点。

### 第 3 层 · 自动兜底:netguard 看门狗

详见 [第 6 节](#6-netguard-看门狗详解)。核心是三件事:**systemd 常驻、多目标投票判死、三级回滚且最后一级不重启**。

### 第 4 层 · 终极兜底:云控制台 VNC

**动手前必须先确认它可用。** 腾讯云 CVM 和轻量应用服务器都提供网页版 VNC 登录。

它的意义:**当所有自动化都失败时,你还有一个"物理接触"机器的手段。**
有它,你就不是"赌一把";没有它,你才真的是。

> ⚠️ **重要认知纠正**:很多人以为"云主机没有 VNC,所以必须一次成功"。
> 在腾讯云上这个前提**不成立**——VNC 有,IPMI 才没有。

---

## 5. 完整操作流程(六步)

> 所有脚本在 `scripts/` 目录,本机用 `rc.py` 驱动。
> 目标机侧脚本会用 `rc.py sh` 自动上传到 `/tmp` 并 `bash` 执行(自动去除 `\r`)。

### 步骤 0 · 只读侦察(不改任何配置)

bash
$P scripts/recon.py

CODE
**重点看四项**:

| 看什么 | 为什么 |
|---|---|
| `iface_files` | 是否存在 `interfaces.d/50-cloud-init` → 判断有没有 cloud-init 覆盖风险 |
| `boot` | GRUB 是否含 `net.ifnames=0` → 决定重启后网卡名会不会变 |
| `kvm` | 是否有 `/dev/kvm`、CPU 是否有 `vmx` → 决定能不能真跑 VM |
| `link` / `mac` / `route` | 记下网卡名 / MAC / IP / 网关 —— 后面全靠它 |

### 步骤 1 · 备份 + 加固 + 部署看门狗

bash
$P scripts/rc.py put scripts/netguard.sh /tmp/netguard.sh
$P scripts/rc.py put scripts/netguard.service /tmp/netguard.service
$P scripts/rc.py sh scripts/01-backup-harden.sh

CODE
**通过标准**:输出末尾出现

netguard : active
armed : YES
net_ok : YES

CODE
- `armed: YES` —— 看门狗已武装,随时能兜底
- `net_ok: YES` —— 当前网络正常,这是基准线

> **这一步网络零改动。** 先让保护就位,再动网络——顺序不能反。

### 步骤 2 · 接入 PVE 源(含测速选优)

bash
$P scripts/rc.py sh scripts/02-pve-repo.sh

CODE
**这一步不装任何包**,只做三件事:测速选源 → 写源 → 预演。

**要看两个结果**:

1. **"会移除哪些包"** —— 应该看到 `ifupdown` 被移除(被 `ifupdown2` 取代)。这是预期行为,也是桥接能生效的前提。
2. **"选用"哪个镜像** —— 速度应 > 1 MB/s。如果是 `download.proxmox.com` 且速度几百 B/s,说明测速逻辑或网络有问题。

### 步骤 3 · 安装 PVE

bash
$P scripts/rc.py sh scripts/03-install-pve.sh

CODE
后台跑,先看前 25 秒确认启动成功,然后轮询:

bash
$P scripts/rc.py run "grep -E 'INSTALL_START|INSTALL_DONE|APT_EXIT|^E: ' /var/log/pve-install.log | tail -10; du -sh /var/cache/apt/archives"

CODE
**通过标准**:

APT_EXIT=0
INSTALL_DONE 2026-09-14 18:46:xx

CODE
**注意**:这一步**不要重启**。装完 PVE 内核先不进它,把"重启"隔离成最后一个独立步骤,风险不扩散。

### 步骤 4 · 切桥接(高危)

**先开本机探活**(后台,充当裁判):

bash
$P scripts/watch.py 1800 &

CODE
**再 detached 执行切换**:

bash
$P scripts/rc.py put scripts/04-switch-bridge.sh /tmp/04-switch-bridge.sh
$P scripts/rc.py run "sed -i 's/\r\$//' /tmp/04-switch-bridge.sh; rm -f /root/netguard/switch.log; setsid nohup bash /tmp/04-switch-bridge.sh >/dev/null 2>&1 </dev/null & sleep 5; cat /root/netguard/switch.log"

CODE
**通过标准**(`/root/netguard/switch.log` 末尾):

--- ifreload rc=0
--- 自检结果: yes
SUCCESS br0=10.1.24.4/22
================ SWITCH END ... ================

CODE
**同时确认**:`netwatch.log` 里**没有 DOWN 行**。

### 步骤 5 · 端到端验证

bash
$P scripts/rc.py sh scripts/05-verify.sh

CODE
**六个区块都要看**:网络 / 外部连通性 / Proxmox / 配置卫生 / 看门狗 / 磁盘。

重点核对:

- `br0` 的 MAC == 物理网卡原 MAC
- 出口公网 IP == 切换前的公网 IP
- `pveversion` 有输出,`pveproxy` 在 8006 监听
- `interfaces.d/` 里**没有** `50-cloud-init`
- `/var/log/netguard.log` 里**没有** WARN/ERROR

### 步骤 6(可选)· 重启验证 PVE 内核

**把这一步单独拿出来做,不要混在装机流程里。**

bash

重启前先确认保护在位

$P scripts/rc.py run "/usr/local/sbin/netguard.sh status; ls -l /etc/netguard/AUTOARM"

→ armed: YES 且 AUTOARM 存在,才重启

$P scripts/rc.py run "systemctl reboot" || true

机器会断开几秒到几十秒,正常

CODE
**重启后**:等 2-3 分钟再连,跑 `05-verify.sh`,并确认:

bash
uname -r # 是否进了 pve 内核
ls -l /etc/network/interfaces.d/ # 应仍无 50-cloud-init
ip -br addr # br0 是否仍持有原 IP

CODE
**万一失联**:netguard 会在开机 **120 秒**后自动回滚(开机窗口缩短)。还不行就上 VNC。

---

## 6. netguard 看门狗详解

### 6.1 它解决什么问题

> "如果桥接时会断网,能否设置一个定时执行脚本,如果 5 分钟网络对外不通,恢复默认 IP 地址?"

—— 这个需求的本质是一个 **dead-man switch(死人开关)**:不需要我盯着,出事它自己处理。

### 6.2 判死规则

- **每 15 秒**探测一组目标,**四选二**才算"通"(避免单点误判导致误回滚):
  

ping 114.114.114.114 ← 国内公共 DNS,稳
ping 223.5.5.5 ← 阿里 DNS
ping 119.29.29.29 ← 腾讯 DNS
curl 169.254.0.23 元数据 ← 腾讯云内网元数据,最可靠

CODE
- 连续失败 ≥ **300 秒** → 触发回滚
- 系统启动 10 分钟内 → 阈值自动缩短为 **120 秒**(因为断网最可能发生在重启那一刻)

### 6.3 三级回滚(逐级加码,且不重启)

| 级别 | 动作 | 特点 |
|---|---|---|
| **L1** | 拆掉 `br0` → 杀 `dhclient` → **物理网卡裸跑 DHCP** | 最快,不依赖 ifupdown |
| **L2** | 仍不通 → 重写极简 `/etc/network/interfaces`(lo + 物理网卡 dhcp)→ 重启 networking | 绕开所有复杂配置 |
| **L2b** | 仍不通 → **静态写回原地址** `10.1.24.4/22` + 网关 + DNS | 连 DHCP 都不信了 |
| **兜底** | 三级全失败 → **不重启**,落盘现场快照,等人工 VNC | 见下方"为什么" |

> **为什么最后一级"不重启"?**
> 因为**重启进不去比不重启更难救**。重启后如果配置还是错的,你连现场快照都拿不到,
> 而且开机自检窗口期更短。保留现场、等人上 VNC,是更安全的终点。

### 6.4 五个关键设计(每个都是踩过的坑)

1. **装成 systemd 服务,不是 `nohup` 挂在 SSH 里**
   否则 SSH 一断,看门狗跟着死——这是最经典的翻车点。
   

ini
Restart=always
RestartSec=5
KillMode=process

CODE
2. **多目标投票,不是 ping 单个 IP**
   单个 IP 挂了会误判,误判会误回滚,误回滚本身就是事故。

3. **三级回滚,且最后一级不重启**(见上)

4. **`@reboot` 自检 + `AUTOARM` 自动重新武装**
   断网最可能发生在**重启那一刻**(网卡改名/配置未生效),而不是桥接那一刻。
   所以重启后看门狗必须能自己"醒来":
   

bash
# main_loop 开头
if [ -f /etc/netguard/AUTOARM ] && [ ! -f "$ARMED" ]; then

CODE
   cmd_arm

fi

CODE
5. **支持精确的"武装/解除"语义**
   - `arm` —— 武装。写标记、清空历史计时。
   - `disarm` —— 解除。仅在"确认长期稳定"后才解除,日志保留。

### 6.5 常用命令

bash
/usr/local/sbin/netguard.sh status # 查看状态(armed/net_ok/phys 等)
/usr/local/sbin/netguard.sh check # 单次探测,输出 OK / FAIL
/usr/local/sbin/netguard.sh arm # 武装
/usr/local/sbin/netguard.sh disarm # 解除(保留日志)
/usr/local/sbin/netguard.sh rollback # 手动立即回滚(不等窗口)
/usr/local/sbin/netguard-bridge.sh # 回滚后,一键重新应用桥接

rm -f /etc/netguard/AUTOARM # 关闭"重启后自动武装"

CODE
### 6.6 日志与现场

| 路径 | 内容 |
|---|---|
| `/var/log/netguard.log` | 看门狗主日志(探测、计时、回滚全过程) |
| `/root/netguard/switch.log` | 桥接切换全过程 |
| `/var/lib/netguard/forensics.log` | 各回滚阶段的 `ip`/`route` 现场快照 |
| `/var/lib/netguard/ESCALATE` | **出现即代表自动回滚全部失败,需人工 VNC 介入** |
| `/etc/netguard/config` | 阈值与目标配置(含原始 IP/网关/DNS) |

---

## 7. 高危操作检查清单

### 7.1 动手前(每一项都要打勾)

- [ ] 已确认**腾讯云控制台 VNC 可用**
- [ ] `netguard.sh status` → `armed: YES`、`net_ok: YES`
- [ ] `/etc/cloud/cloud.cfg.d/99-disable-network-config.cfg` 已存在
- [ ] 备份目录存在且有内容(`cat /root/netguard/BACKUP_PATH`)
- [ ] `/etc/netguard/config` 里的 `ORIG_*` 变量与实际网络一致
- [ ] 本机侧探活已启动(`watch.py` 在后台跑)
- [ ] 目标机磁盘留 ≥ 10GB(PVE 全套约 1.5GB + 内核)

### 7.2 操作中

- [ ] 用 `setsid nohup ... </dev/null &` detached 执行
- [ ] 用 `ifreload -a`,**绝不用** `ifdown/ifup` / `restart networking`
- [ ] 保持一个 SSH 长连接在旁观察
- [ ] 不在同一个脚本里同时改网络和重启

### 7.3 操作后(10 分钟内)

- [ ] `netwatch.log` 无 DOWN 记录
- [ ] 出口公网 IP 未变
- [ ] `br0` MAC == 原物理网卡 MAC
- [ ] `/var/log/netguard.log` 无 WARN/ERROR
- [ ] 再跑一遍 `05-verify.sh` 全绿

---

## 8. 故障处置手册

### 8.1 场景 A:切桥接后 SSH 断了

**别慌,先等。**

bash

时间线(从断网时刻算起)

0-15s : 看门狗在探测

300s : 判定断网,开始 L1 回滚

~320s : L1 通常已恢复,网络回来

CODE
**动作**:

1. 用 `watch.py` 或本地 `ping`/`nc` 等着,**等满 5 分钟**。
2. 5 分钟后仍不通 → 上 **腾讯云控制台 → VNC 登录**。
3. VNC 里执行:
   

bash
cat /var/log/netguard.log # 看它做到哪一步了
/usr/local/sbin/netguard.sh rollback # 手动再来一次

CODE
### 8.2 场景 B:重启后失联

**这是最可能的失联场景**,因为网卡名可能变了、或配置未生效。

1. 先等 **2-3 分钟**——netguard 的开机自检窗口是 120 秒,会自动回滚并重启网络。
2. 仍不通 → **VNC 登录**,然后:
   

bash
cat /proc/uptime # 确认机器在跑
ip -br link # 看网卡真名是什么(eth0?ens3?)
cat /var/log/netguard.log | tail -50
/usr/local/sbin/netguard.sh rollback

CODE
3. 如果发现是**网卡改名**(`eth0` 变 `ens3`),最省事的修法是让名字固定回来:
   

bash
# 在 GRUB 里加 net.ifnames=0(本机已有),然后
update-grub && reboot

CODE
### 8.3 场景 C:netguard 报 ESCALATE

bash
cat /var/lib/netguard/ESCALATE

CODE
出现这个文件 = **三级回滚全部失败**。此时:

1. **不要再重启**(设计上就没让它重启,保住现场)。
2. `cat /var/lib/netguard/forensics.log` 看各阶段快照,定位哪一步断了。
3. 手工对照备份恢复:
   

bash
BK=$(cat /root/netguard/BACKUP_PATH)
cp -a $BK/network/interfaces /etc/network/interfaces
cp -a $BK/hosts /etc/hosts
ip link set eth0 up; dhclient -4 eth0

CODE
4. 实在不行,直接在控制台**重装系统 + 挂载原磁盘**把数据捞出来。

### 8.4 场景 D:想把机器还原成"没装过"

bash

1) 关掉看门狗

/usr/local/sbin/netguard.sh disarm rm -f /etc/netguard/AUTOARM systemctl disable --now netguard.service

2) 还原网络配置(回去 = 拆桥)

BK=$(cat /root/netguard/BACKUP_PATH) cp -a $BK/network/interfaces /etc/network/interfaces mv -f /root/netguard/50-cloud-init.disabled /etc/network/interfaces.d/50-cloud-init 2>/dev/null cp -a $BK/hosts /etc/hosts rm -f /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg ifreload -a # 增量应用,不会断

3) 卸载 Proxmox(可选,激进操作,确认后再做)

apt-get -y purge proxmox-ve postfix open-iscsi chrony

apt-get -y install ifupdown && apt-get -y purge ifupdown2

apt-get -y autoremove

4) 切回 Debian 内核(可选)

编辑 /etc/default/grub 恢复 GRUB_DEFAULT,update-grub

CODE
> ⚠️ 第 3、4 步是**不可逆的破坏性操作**。执行前务必确认备份可用、VNC 可用。

---

## 9. 附录

### 9.1 本次环境快照(2026-09-14)

| 项 | 值 |
|---|---|
| 主机 | `114.132.244.13`(腾讯云 CVM,广州七区) |
| 实例 ID | `ins-3ug3yt4w` |
| 系统 | Debian 12 (bookworm) |
| 规格 | 4 核 4G,根分区 57G 可用 |
| 网卡 | `eth0`,MAC `52:54:00:d7:a0:cc` |
| 内网 IP | `10.1.24.4/22`,网关 `10.1.24.1` |
| 公网 IP | `114.132.244.13`(NAT) |
| 运行内核 | `6.1.0-50-amd64`(Debian 原内核) |
| 已装 PVE 内核 | `proxmox-kernel-6.8.12-43-pve` |
| Proxmox VE | **8.4.21**,`pveproxy` 监听 8006 |
| 嵌套虚拟化 | ❌ 无 `vmx`、无 `/dev/kvm` |

### 9.2 文件清单

**本机(`C:\Users\Administrator\Desktop\pyscan\Linux KVM\`)**

| 路径 | 说明 |
|---|---|
| `装机与不断网操作手册.md` | **本文档** |
| `README.md` | 快速索引 |
| `KVM-Proxmox装机验证报告.md` | 本次实测报告(证据与数据) |
| `netwatch.log` | 本次本机侧探活日志(零 DOWN 的证据) |
| `scripts/` | **可复用的干净脚本集**(见下) |
| `_netguard/` | 本次实际执行的目标机脚本留档 |
| `_probe/` | 本次实际执行的本机脚本留档 |

**`scripts/` 目录**

| 文件 | 运行位置 | 说明 |
|---|---|---|
| `rc.py` | 本机 | SSH 免交互执行/上传/下载(凭据走环境变量) |
| `recon.py` | 本机 | 只读侦察 |
| `watch.py` | 本机 | 独立探活(裁判) |
| `01-backup-harden.sh` | 目标机 | 备份 + 加固 + 部署并武装看门狗 |
| `02-pve-repo.sh` | 目标机 | 镜像测速选优 + 写源 + 预演 |
| `03-install-pve.sh` | 目标机 | 后台安装 PVE |
| `04-switch-bridge.sh` | 目标机 | **切桥接(高危)** |
| `05-verify.sh` | 目标机 | 端到端验证 |
| `netguard.sh` | 目标机 | 看门狗主程序 |
| `netguard.service` | 目标机 | 常驻服务定义 |
| `netguard-bridge.sh` | 目标机 | 回滚后一键重新应用桥接 |

**目标机(已部署)**

| 路径 | 说明 |
|---|---|
| `/usr/local/sbin/netguard.sh` | 看门狗主程序 |
| `/usr/local/sbin/netguard-bridge.sh` | 一键重新应用桥接 |
| `/etc/systemd/system/netguard.service` | 常驻服务 |
| `/etc/netguard/config` | 阈值与原始网络参数 |
| `/etc/netguard/AUTOARM` | 重启后自动武装标记 |
| `/root/netguard/README.md` | 目标机侧运维说明 |
| `/root/netguard/backup-<时间戳>/` | 全量备份 + 现场快照 |
| `/var/log/netguard.log` | 看门狗日志 |
| `/root/netguard/switch.log` | 桥接切换全过程 |

### 9.3 已知限制

- **无嵌套虚拟化**:本机 CPU 无 `vmx`、无 `/dev/kvm`。PVE 可正常安装、管理、配置,但**无法运行硬件加速的虚拟机**。只测装机不受影响;要真跑 VM 需换支持嵌套的机型或裸金属。
- **未卸载 Debian 原内核**:官方建议装完 PVE 后删掉 `linux-image-amd64`,此处刻意保留作退路。等重启验证 PVE 内核正常后再删不迟。
- **未执行 `apt full-upgrade`**:官方文档建议做,此处跳过以避免 500+ 无关包升级引入变量。
- **8006 / 3128 被安全组拦截**:需在控制台放通,或走 SSH 隧道:
  

bash
ssh -L 8006:127.0.0.1:8006 root@114.132.244.13
# 然后本机浏览器开 https://127.0.0.1:8006

CODE
- **本次安装移除了** `ifupdown`、`ntp`、`ntpsec`(被 `ifupdown2`、`chrony` 取代)。顺带消除了官方文档提到的"ntpsec 钩子导致开机网络起不来"这个已知坑。

### 9.4 本次实测时间线

| 时刻 | 阶段 | 结果 |
|---|---|---|
| 18:31 | 只读侦察 | Debian 12 / 4C4G / 57G 可用 / eth0 `10.1.24.4` / 无 `/dev/kvm` |
| 18:34 | 备份 + 加固 | 备份 88KB,`hostname -f` 正常 |
| 18:34 | 部署看门狗 | `armed: YES`,`net_ok: YES` |
| 18:40 | 加 PVE 源 + 预演 | 官方源 935 B/s → 换清华 TUNA(1.2 MB/s) |
| 18:42 | 安装 PVE | `APT_EXIT=0`,563 包,**3 分 54 秒**,零错误 |
| 18:47 | 切 br0 桥接 | `ifreload rc=0`,9 秒自检通过,**零断网** |
| 18:48 | AUTOARM + 最终验证 | 服务 active/enabled,网络与 PVE 全部正常 |

---

## 附:核心命令速记卡

bash

─────────── 目标机侧 ───────────

看门狗

/usr/local/sbin/netguard.sh status|check|arm|disarm|rollback /usr/local/sbin/netguard-bridge.sh

网络现状

ip -br addr; ip route; bridge link curl -s https://ifconfig.me

桥接配置(关键:hwaddress 沿用原 MAC)

cat /etc/network/interfaces grep -r hwaddress /etc/network/

增量应用(唯一安全的改网命令)

ifreload -a

─────────── 本机侧 ───────────

P=C:/Users/Administrator/.workbuddy/binaries/python/envs/default/Scripts/python.exe export PVEHOST=<IP> PVEUSER=root PVEPASS='<密码>' $P scripts/recon.py # 侦察 $P scripts/rc.py run "<cmd>" # 远程执行 $P scripts/rc.py sh <script> # 上传并执行 $P scripts/rc.py get <远> <本> # 取回文件 $P scripts/watch.py 1800 # 探活(裁判)
CODE
---

*文档基于 2026-09-14 实测编写。下次使用前,务必重新跑一遍 `recon.py` 核对环境,不要照搬 IP、MAC、网关等硬编码值。*

💬 评论 (0)

今日还可评论 3 条

还没有评论,来抢沙发吧。