infra-lab-de/Azure-TwoTier-Network
GitHub: infra-lab-de/Azure-TwoTier-Network
在 Azure 中构建基于 NSG 网段隔离、Jump Host 管理接入和 NAT Gateway 受控出站的两层网络架构实践项目。
Stars: 0 | Forks: 0
# Azure 中的两层网络
在 Azure 中构建一个包含前端层和后端层以及用于管理访问的专用 Jump Host 的两层网络——这是一个关于 Azure 网络、网络安全和层隔离的实践实验项目。

## 构建内容
一个包含三个独立子网的 Virtual Network,每个子网都由各自的 Network Security Group 进行安全保护:前端、后端以及一个带有 Jump Host 的独立管理子网。前端子网中运行着一台可公开访问的 VM,后端子网中运行着一台无 Public IP、仅限内部访问的 VM。第三个子网中的 Jump Host 是唯一允许通过 SSH 对前端和后端进行管理访问的入口。
**资源:**
- Resource Group:`rg-twotier-lab-weu-001`
- Virtual Network:`vnet-twotier-lab-weu-001` (10.0.0.0/16)
- 前端子网:`snet-frontend-001` (10.0.0.0/24)
- 后端子网:`snet-backend-001` (10.0.1.0/24)
- Jumper 子网:`snet-jumper-001` (10.0.2.0/24)
- 前端 Network Security Group:`nsg-frontend-001`
- 后端 Network Security Group:`nsg-backend-001`
- Jumper Network Security Group:`nsg-jumper-001`
- 前端 Virtual Machine:`vm-frontend-001` – Ubuntu 24.04 LTS,Private IP `10.0.0.5`,包含 Public IP
- 后端 Virtual Machine:`vm-backend-001` – Ubuntu 24.04 LTS,Private IP `10.0.1.5`,无 Public IP
- Jumper Virtual Machine:`vm-jumper-001` – Ubuntu 24.04 LTS,Private IP `10.0.2.5`,包含 Public IP
- Public IP:`pip-vm-frontend-001`、`pip-vm-jumper-001`
- NAT Gateway:`nat-backend-001`
- Network Interface:`nic-vm-frontend-001`、`nic-vm-backend-001`、`nic-vm-jumper-001`
- SSH 密钥:每台 VM 独立配置
所有资源都进行了统一的标签标记(`Project: TwoTier-Network`、`Environment: Lab`、`Purpose: Portfolio`、`Owner: Nico Miehle`、`CreatedBy: Manual`)。
## 网络安全
每个子网都由各自的 NSG 进行保护,遵循“仅允许必要流量”的原则。其他所有流量均被丢弃。
**Jumper NSG (`nsg-jumper-001`):**
仅允许来自我本人 IP 的 SSH 连接,屏蔽其他所有流量。

**前端 NSG (`nsg-frontend-001`):**
SSH 仅限来自 Jumper,允许来自任意位置的 HTTP,屏蔽其他所有流量。

**后端 NSG (`nsg-backend-001`):**
SSH 仅限来自 Jumper,MySQL 仅限来自前端,屏蔽其他所有流量。

对前端和后端的 SSH 访问权限仅保留给 Jumper VM。前端被限制为只能与后端进行 MySQL 通信,不允许 SSH 访问。这样,Web 攻击面(前端)和管理访问面(Jumper)就成为了完全分离、独立的系统。
这三个子网都被额外配置为“私有子网”——因此 Azure 的隐式默认出站访问已被禁用。尽管如此,前端和 Jumper 依然可以通过各自的 Public IP 显式地访问互联网;而后端则仅通过受控的 NAT Gateway `nat-backend-001` 获取互联网访问权限——在后端 VM 上成功执行 `apt update` 即证明了这一点,尽管该 VM 没有自己的 Public IP。

## SSH 访问
这三台 VM 均只能通过 Public-Key 身份验证进行访问,密码登录已被完全禁用。禁止通过 SSH 进行 Root 登录(`PermitRootLogin no`)。在建立连接时,个性化的登录 Banner 会在三台 VM 上统一显示有关授权访问和日志记录的提示。
管理访问完全通过 Jump Host 进行:从 Jump Host 通过 SSH 连接到前端或后端。



## 自动安全更新
为了定期安装与安全相关的更新,我们在三台 VM 上都配置了 `unattended-upgrades`——这与我的 [Pi-SSH-Fortress 项目](https://github.com/infra-lab-de/Raspberry-Pi-SSH-Server)中的配置完全相同,在该项目的页面中也可以看到已配置自动更新的截图。
## 数据库访问 – 层级隔离验证
后端运行着一个 MySQL 实例。一个专用的数据库用户(`frontend_user`)被明确限制为只能从 `10.0.0.%` 建立连接。此外,MySQL 仅绑定到后端私有 IP `10.0.1.5`,而不是绑定到所有网络接口。
从前端发起了与后端数据库的连接,写入了一条记录并将其读取出来——这证明了层级隔离允许真实的数据库流量通行,同时后端对外部依然保持完全不可访问的状态。

## 计划扩展
- Infrastructure as Code (Terraform),以实现可重现、版本化的配置
- 在所有 VM 上部署基于主机的防火墙(nftables),作为对 NSG 的补充
- 采用最小权限原则分配权限(Azure RBAC),取代拥有完整权限的单一账户
- IDS/IPS,例如通过 NSG Flow Logs + Log Analytics,或在主机端使用 Suricata
- 使用 Azure Bastion 替代自行管理的 Jumper VM
- Just-in-Time VM Access (Microsoft Defender for Cloud)
- 通过 Azure Key Vault 进行 Secrets Management,取代配置文件中的密码
## 截图
**资源概览**

**前端 VM – 概览**

**后端 VM – 概览**

**Jumper VM – 概览**

标签:Azure, 内存分配, 堡垒机, 网络安全, 网络架构, 虚拟网络, 隐私保护