Skip to content

Instantly share code, notes, and snippets.

@JamesHopbourn
Last active August 2, 2025 00:50
Show Gist options
  • Save JamesHopbourn/2e2141d4c1e55b3765ad463617cd309b to your computer and use it in GitHub Desktop.
Save JamesHopbourn/2e2141d4c1e55b3765ad463617cd309b to your computer and use it in GitHub Desktop.
小型互联网拓扑实验 - Multipass网络实验环境

小型互联网拓扑实验环境搭建指南

概述

本文档详细描述如何使用 Multipass 搭建一个三台虚拟机的小型局域网环境,模拟现实互联网中的 NAT、内网穿透、网络分段访问控制等场景。

网络拓扑结构

Client (10.0.0.3) ← → Gateway (10.0.0.1) ← → Server (10.0.0.2:8000)
                           |
                      Internet (NAT)

环境要求

  • 虚拟化工具: Multipass
  • 宿主机系统: Ubuntu 或 macOS
  • VM 操作系统: Ubuntu 24.04 LTS
  • 网络: 10.0.0.0/24 内网段

详细搭建步骤

1. 创建虚拟机

首先创建三台虚拟机:

# 创建网关虚拟机
multipass launch --name gateway --cpus 2 --memory 4G --disk 10G

# 创建服务器虚拟机
multipass launch --name server --cpus 2 --memory 4G --disk 10G

# 创建客户端虚拟机
multipass launch --name client --cpus 2 --memory 4G --disk 10G

验证虚拟机创建成功:

multipass list

应该看到类似输出:

Name                    State             IPv4             Image
client                  Running           192.168.69.18    Ubuntu 24.04 LTS
gateway                 Running           192.168.69.16    Ubuntu 24.04 LTS
server                  Running           192.168.69.17    Ubuntu 24.04 LTS

2. 配置网络接口

2.1 配置 Gateway 虚拟机

Gateway 虚拟机需要配置桥接网络接口:

# 创建桥接接口
multipass exec gateway -- sudo ip link add name br0 type bridge

# 配置桥接接口IP地址
multipass exec gateway -- sudo ip addr add 10.0.0.1/24 dev br0

# 启用桥接接口
multipass exec gateway -- sudo ip link set br0 up

创建持久化网络配置:

# 创建 netplan 配置文件
multipass exec gateway -- bash -c 'echo "network:" | sudo tee /etc/netplan/60-bridge.yaml && echo "  version: 2" | sudo tee -a /etc/netplan/60-bridge.yaml && echo "  bridges:" | sudo tee -a /etc/netplan/60-bridge.yaml && echo "    br0:" | sudo tee -a /etc/netplan/60-bridge.yaml && echo "      addresses:" | sudo tee -a /etc/netplan/60-bridge.yaml && echo "        - 10.0.0.1/24" | sudo tee -a /etc/netplan/60-bridge.yaml && echo "      dhcp4: false" | sudo tee -a /etc/netplan/60-bridge.yaml && echo "      dhcp6: false" | sudo tee -a /etc/netplan/60-bridge.yaml'

# 修正文件权限
multipass exec gateway -- sudo chmod 600 /etc/netplan/60-bridge.yaml

# 应用网络配置
multipass exec gateway -- sudo netplan apply

为主接口添加 Gateway IP:

multipass exec gateway -- sudo ip addr add 10.0.0.1/24 dev enp0s1

2.2 配置 Server 虚拟机

为 Server 虚拟机添加静态 IP:

multipass exec server -- sudo ip addr add 10.0.0.2/24 dev enp0s1

2.3 配置 Client 虚拟机

为 Client 虚拟机添加静态 IP:

multipass exec client -- sudo ip addr add 10.0.0.3/24 dev enp0s1

3. 配置 NAT 转发(Gateway)

在 Gateway 虚拟机上启用 IP 转发和 NAT:

# 启用 IP 转发
multipass exec gateway -- sudo sysctl -w net.ipv4.ip_forward=1

# 使 IP 转发持久化
multipass exec gateway -- echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf

# 配置 NAT masquerading
multipass exec gateway -- sudo iptables -t nat -A POSTROUTING -o enp0s1 -j MASQUERADE

# 允许转发
multipass exec gateway -- sudo iptables -A FORWARD -i enp0s1 -o enp0s1 -j ACCEPT

# 配置端口转发(从 Gateway 到 Server)
multipass exec gateway -- sudo iptables -t nat -A PREROUTING -i enp0s1 -p tcp --dport 8000 -j DNAT --to-destination 10.0.0.2:8000

4. 启动 HTTP 服务(Server)

在 Server 虚拟机上启动 Python HTTP 服务:

# 启动 HTTP 服务,绑定到内网 IP
multipass exec server -- nohup python3 -m http.server 8000 --bind 10.0.0.2 > /dev/null 2>&1 &

验证服务启动:

multipass exec server -- ss -lntp | grep 8000

应该看到:

LISTEN 0      5           10.0.0.2:8000      0.0.0.0:*    users:(("python3",pid=1798,fd=3))

5. 配置访问控制(Client)

在 Client 虚拟机上配置防火墙规则,阻止直接访问 Server:

# 阻止直接访问 Server
multipass exec client -- sudo iptables -A OUTPUT -d 10.0.0.2 -j DROP

# 允许访问 Gateway
multipass exec client -- sudo iptables -I OUTPUT -d 10.0.0.1 -j ACCEPT

验证测试

6.1 测试直接访问(应该失败)

# 从 Client 直接访问 Server(应该超时失败)
multipass exec client -- curl --connect-timeout 5 http://10.0.0.2:8000

预期结果:连接超时

6.2 测试通过 Gateway 访问(应该成功)

# 从 Client 通过 Gateway 访问 Server(应该成功)
multipass exec client -- curl --connect-timeout 5 http://10.0.0.1:8000

预期结果:返回 HTML 页面内容

6.3 测试访问控制

禁用 Gateway 转发功能:

multipass exec gateway -- sudo sysctl -w net.ipv4.ip_forward=0

再次测试访问(应该失败):

multipass exec client -- curl --connect-timeout 5 http://10.0.0.1:8000

恢复转发功能:

multipass exec gateway -- sudo sysctl -w net.ipv4.ip_forward=1

网络配置总结

虚拟机名 主要IP 内网IP 角色 服务
gateway 192.168.69.16 10.0.0.1 网关/路由器 NAT转发, 端口转发
server 192.168.69.17 10.0.0.2 服务器 HTTP服务 (端口8000)
client 192.168.69.18 10.0.0.3 客户端 仅通过网关访问服务器

核心配置说明

  1. 网络隔离: Client 通过 iptables 规则无法直接访问 Server
  2. 强制路由: Client 只能通过 Gateway 访问 Server
  3. 端口转发: Gateway 使用 DNAT 将请求转发到 Server
  4. 访问控制: 可通过禁用 Gateway 的 IP 转发来控制整个网络的连通性

故障排除

常见问题

  1. 无法 ping 通

    • 检查 IP 地址配置:ip addr show
    • 检查路由表:ip route show
  2. HTTP 访问失败

    • 检查 HTTP 服务状态:ss -lntp | grep 8000
    • 检查 iptables 规则:sudo iptables -L -n -v
  3. 转发不工作

    • 检查 IP 转发状态:sysctl net.ipv4.ip_forward
    • 检查 NAT 规则:sudo iptables -t nat -L -n -v

清理环境

如需重新开始,可以删除所有虚拟机:

multipass delete gateway server client
multipass purge

教育价值

这个实验环境可以帮助理解:

  • NAT 网络地址转换原理
  • 网络分段和访问控制
  • Linux 网络配置和路由
  • iptables 防火墙规则
  • 网络故障排除方法

通过这个实验,可以深入理解现代网络架构中常见的安全和路由机制。

小型互联网拓扑实验需求文档

一、背景与目标

本实验旨在使用三台虚拟机模拟小型局域网环境,配置一台网关服务器(Gateway)作为中间跳板,使得 Client 虚拟机只能通过 Gateway 中转访问 Server,从而模拟现实互联网中的 NAT、内网穿透、网络分段访问控制等场景。

二、实验环境

使用平台

  • 虚拟化工具:Multipass(由 Canonical 提供的轻量虚拟机管理工具)
  • 宿主机系统:Ubuntu 或 macOS
  • VM 操作系统镜像:Ubuntu 20.04 LTS(默认)

虚拟机创建命令

每台虚拟机使用如下命令启动:

multipass launch --name <vm-name> --cpus 2 --memory 4G --disk 10G

实际创建如下三台虚拟机:

虚拟机名 角色 IP分配 备注
gateway 网关节点 手动配置两个网卡(NAT + 内网) 配置转发和NAT
server 服务端 内网IP 运行 Python HTTP 服务
client 客户端 内网IP 仅能通过 gateway 访问 server

三、网络拓扑设计

               [ Client ]
                   |
             10.0.0.3/24
                   |
               [ Gateway ]
             eth1: 10.0.0.1/24
             eth0: NAT (默认Multipass)
                   |
             Internet (Host NAT)
                   |
               [ Server ]
             10.0.0.2/24

说明:

  • gateway 有两个网卡:

    • eth0:连接到 NAT 网络(默认 multipass 网络)
    • eth1:连接到自定义私有网络(桥接)
  • serverclient 均仅连接到 gateway 创建的私有网络(模拟内网)

  • Server 提供 HTTP 服务,监听 10.0.0.2:8000

  • Client 不允许直接连 Server,只能通过 Gateway 转发访问


四、系统配置细节

1. 创建虚拟机

multipass launch --name gateway --cpus 2 --memory 4G --disk 10G
multipass launch --name server --cpus 2 --memory 4G --disk 10G
multipass launch --name client --cpus 2 --memory 4G --disk 10G

2. 配置静态私有网络(通过 cloud-init 或 netplan)

  • 给 gateway 增加一个内网桥接接口 eth1
  • 给 server/client 设置静态 IP 地址(如 10.0.0.2, 10.0.0.3

建议使用 multipass exec gateway -- sudo ip link add br0 type bridge 配合 netplan 配置实现

3. Gateway 配置 NAT 转发

# 开启 IP 转发
sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf

# 配置 NAT(假设 eth0 为对外接口)
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

4. Server 上配置 Python 服务

# 安装 Python3(如未安装)
sudo apt update && sudo apt install -y python3

# 运行一个简单的 HTTP 服务(监听内网地址)
python3 -m http.server 8000 --bind 10.0.0.2

5. Client 上配置默认路由指向 Gateway

# 删除默认路由
sudo ip route del default

# 添加 gateway 为默认网关
sudo ip route add default via 10.0.0.1

五、验证目标

正确性验证

  1. 在 client 上使用 curl 访问 server:

    curl http://10.0.0.2:8000

    成功返回内容说明路由通过 gateway 生效

  2. 关闭 gateway 的转发功能后访问失败

    sudo sysctl -w net.ipv4.ip_forward=0

    再次访问 server 应该失败,说明中转控制生效

  3. 直接从 client ping server 应该不通(如无静态路由)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment