引言

在日常开发和测试工作中,我们经常需要在隔离环境中运行代码、安全审计沙箱、或者需要严格网络管控的实验室服务器。这些虚拟机通常处于完全断网状态:没有互联网访问能力、yum 仓库被禁用、无法直接安装任何外部依赖。

但作为开发者,我们又希望能在宿主机上通过 AI Agent 远程控制这台"孤岛"虚拟机——执行命令、调试代码、查看日志。本文将完整记录一套零成本方案的实现过程:从 Windows 主机通过 SSH 控制一台 Host-only 模式下完全断网的 Linux 虚拟机。


一、问题定义

1.1 环境约束举例

项目配置
宿主机操作系统Windows 10/11
虚拟化平台VMware Workstation
虚拟机系统RHEL(Red Hat Enterprise Linux)
网络模式Host-only(仅主机模式)
yum 仓库全部禁用
互联网访问❌ 完全不可达

1.2 核心需求

  • ✅ 宿主机能远程执行命令
  • ✅ 虚拟机保持完全断网隔离
  • ✅ 无需额外购买任何硬件或软件授权
  • ✅ 支持 AI Agent 自动化控制

二、网络架构设计

2.1 为什么选择 Host-only 模式

VMware 提供三种主要网络模式:

网络模式能否从主机 SSH是否有外网出口适用场景
NAT需端口转发✅ 有一般开发
Host-only✅ 直接可达❌ 无安全隔离
Bridged✅ 直接可达✅ 有局域网共享

Host-only 是唯一同时满足"主机可控"和"完全断网"的模式。

2.2 网络拓扑

┌─────────────────────────────────────────────┐
│              Windows 宿主机                  │
│                                             │
│   ┌──────────────────┐                      │
│   │ VMware VMnet1    │← 虚拟网卡             │
│   │ [主机IP]         │                      │
│   └────────┬─────────┘                      │
│            │                                │
│    ┌───────┴───────────┐                    │
│    │  VMware 虚拟交换机 │                    │
│    └───────┬───────────┘                    │
│            │                                │
└────────────┼────────────────────────────────┘
             │ (仅内部通信)
             ▼
┌─────────────────────────────────────────────┐
│              RHEL 虚拟机                     │
│                                              │
│   ┌──────────────────┐                       │
│   │ ens33 (网卡)      │                       │
│   │ [虚拟机IP]        │                       │
│   └──────────────────┘                       │
│                                              │
│   ┌──────────────────┐                       │
│   │ sshd (端口 22)    │ ← 监听中              │
│   │ firewall-cmd      │ ← 已放行 SSH          │
│   └──────────────────┘                       │
│                                             │
│   外网访问:❌ Network is unreachable        │
└─────────────────────────────────────────────┘

关键点:Host-only 网段的数据包不会经过物理网卡,因此即使宿主机关闭所有代理软件,SSH 连接也不受影响。


三、逐步配置

3.1 第一步:确认虚拟机网络模式

在 VMware 中:

虚拟机设置 → 网络适配器 → 选择「仅主机模式 (Host-only)」
→ 对应网卡:VMware Network Adapter VMnet1

⚠️ 注意:不要选择 NAT 或桥接,否则虚拟机会获得外网出口。

3.2 第二步:获取虚拟机 IP 地址

在 Windows 宿主机上执行:

# 方法一:查看 VMnet1 的网段
ipconfig | findstr "VMnet1"

# 输出示例:
# 以太网适配器 VMware Network Adapter VMnet1:
#   IPv4 地址 . . . . . . . : 【主机端IP】/24

# 方法二:通过 ARP 表发现虚拟机的实际 IP
arp -a | findstr "【网段前缀】"

# 输出结果示例:
# 【网段前缀】.【虚拟机IP后缀】  00-0c-29-xx-xx-xx  动态

踩坑提醒:很多人误以为 ipconfig 显示的 IP 就是虚拟机地址——实际上那是宿主机自身 VMnet1 网卡的 IP!虚拟机的真实 IP 需要通过 ARP 缓存表或进入虚拟机内用 ip addr 查看。

3.3 第三步:配置虚拟机 SSH 服务

RHEL 默认已预装 OpenSSH Server,无需联网安装。在虚拟机控制台执行:

# 1. 确保 sshd 运行并设为开机自启
sudo systemctl status sshd
sudo systemctl enable --now sshd

# 2. 放行防火墙 22 端口(永久生效)
sudo firewall-cmd --add-service=ssh --permanent
sudo firewall-cmd --reload

# 3. 验证规则是否持久化
firewall-cmd --list-services --permanent
# 应包含: ssh

💡 关键点:--permanent 参数让规则重启后依然生效,无需每次开机重复执行。

3.4 第四步:验证连通性

# 在 Windows 上 ping 虚拟机
ping 【虚拟机IP】

# 测试 TCP 22 端口
Test-NetConnection -ComputerName 【虚拟机IP】 -Port 22
# 期望输出:TcpTestSucceeded : True

3.5 第五步:配置 SSH 密钥认证(免密码登录)

5.1 生成密钥对

Windows 10/11 已内置 OpenSSH 客户端。在 cmd 中执行(注意是 cmd 不是 PowerShell,避免转义问题):

C:\Windows\System32\OpenSSH\ssh-keygen.exe -t rsa -b 4096 -C "your-comment" -f %USERPROFILE%\.ssh\id_rsa -N ""

生成位置:

  • 私钥:C:\Users\【用户名】\.ssh\id_rsa
  • 公钥:C:\Users\【用户名】\.ssh\id_rsa.pub
5.2 将公钥写入虚拟机
type C:\Users\【用户名】\.ssh\id_rsa.pub | ssh root@【虚拟机IP】 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

首次连接会提示输入密码(也是唯一一次),之后即可免密登录。


四、AI Agent 接入方案

4.1 技术选型

方案可行性说明
ssh.exe 命令行❌ 受限沙箱环境下 stdout/stderr 会被拦截
paramiko (Python 库)✅ 推荐绕过沙盒限制,功能完整
subprocess + plink⚠️ 备选需要额外依赖 PuTTY

4.2 paramiko 连接实现

import paramiko

host = "【虚拟机IP】"
username = "root"
key_path = r"C:\Users\【用户名】\.ssh\id_rsa"

# 加载私钥(RSA 格式)
private_key = paramiko.RSAKey.from_private_key_file(key_path)

# 建立 SSH 连接
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(
    hostname=host,
    port=22,
    username=username,
    pkey=private_key,
    timeout=10
)

# 执行命令
stdin, stdout, stderr = client.exec_command("hostname && whoami && uptime")
print(stdout.read().decode())

client.close()

4.3 Agent 工作流

用户指令
    ↓
AI Agent 解析意图
    ↓
构建 Shell / Python / GDB 命令
    ↓
通过 paramiko 发送到虚拟机
    ↓
收集执行结果(stdout / stderr / exit code)
    ↓
分析结果,返回给用户
    ↓
(可选)写入长期记忆,跨会话保留

五、实战验证

5.1 连接测试

执行 SSH 测试脚本后的典型输出:

SSH connected successfully!
Hostname: localhost.localdomain
User: root
Uptime:  11:28:48 up 3:46,  2 users,  load average: 0.00, 0.01, 0.05
IP: inet 【虚拟机IP】/24 brd 【广播地址】 scope global noprefixroute dynamic ens33
All commands executed successfully!

5.2 网络隔离验证

在虚拟机内测试外网访问:

# 测试 ping 公网 IP
ping -c 2 223.5.5.5
# → connect: Network is unreachable  ✅ 无法访问

# 测试 DNS 解析
ping -c 2 baidu.com
# → Name or service not known       ✅ DNS 不可用

# 测试 HTTP 访问
curl -s --connect-timeout 5 -I https://www.baidu.com
# → Exit 6 (could not resolve host)   ✅ 完全隔离

三项全部失败 → 网络隔离生效


六、进阶场景

6.1 如果临时需要联网怎么办?

方案操作代价
切换为 NAT 模式VMware 设置里改一下需要关机/重启网卡
添加第二块网卡NAT + Host-only 双网卡更灵活,但需配置路由策略
通过宿主机代理转发虚拟机设置 http_proxy 指向宿主机宿主机需要有网

推荐:日常使用 Host-only 保持隔离,偶尔联网时手动切 NAT。

6.2 多虚拟机管理

如果有多台虚拟机需要管理:

vms = {
    "test-env-1": {"ip": "【IP1】", "user": "root"},
    "test-env-2": {"ip": "【IP2】", "user": "root"},
}

for name, config in vms.items():
    client = connect_vm(config["ip"], config["user"])
    # 执行批量操作...

6.3 文件传输

paramiko 内置 SFTP 支持:

sftp = client.open_sftp()

# 从虚拟机下载文件到本地
sftp.get("/remote/path/file.txt", "C:/local/file.txt")

# 从本地上传文件到虚拟机
sftp.put("C:/local/script.py", "/home/root/script.py")

sftp.close()

七、常见问题排查

Q1:ping 不通虚拟机

检查清单:

  1. VMware 网络适配器是否选择了 Host-only?
  2. VMnet1 服务是否启动?(services.msc 里找 VMware DHCP Service)
  3. Windows 防火墙是否放行了 ICMP?

Q2:端口通但 SSH 拒绝连接

检查清单:

  1. systemctl status sshd — sshd 是否运行?
  2. firewall-cmd --list-services — 防火墙是否放行?
  3. /etc/ssh/sshd_config — 是否允许 root 登录?(PermitRootLogin yes

Q3:密钥认证失败

检查清单:

  1. ~/.ssh/authorized_keys 权限是否正确?(chmod 600)
  2. ~/.ssh 目录权限是否正确?(chmod 700)
  3. selinux 是否阻止了认证?(getenforce)

八、总结

维度方案评价
成本✅ 零额外费用(VMware + OpenSSH 全免费)
安全性✅ 虚拟机完全断网,符合隔离要求
可靠性✅ Host-only 网段独立于物理网络
扩展性✅ 支持多虚拟机并行管理
AI 兼容性✅ 通过 paramiko 实现 Agent 自动控制

这套方案的核心价值在于:在不破坏安全隔离的前提下,实现了 AI Agent 对断网环境的完全控制。无论是安全审计沙箱、还是合规要求的离线系统,都可以用相同的方法打通 Agent 与目标系统的交互通道。

📌 适用场景:开发验证环境、安全渗透测试沙箱、合规要求离线的生产系统。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐