mansour-wade/Linux-Enterprise-Gateway

GitHub: mansour-wade/Linux-Enterprise-Gateway

基于 Ubuntu 构建的 Linux 企业网关与防火墙,为多发行版混合实验室提供 NAT 路由和状态包检测,并附带详尽的故障排查实践记录。

Stars: 0 | Forks: 0

# Linux 企业网关 基于 Ubuntu 的网络网关和防火墙,专为多发行版混合实验室设计。使用 Netplan 和 iptables 为 Rocky Linux 和 Fedora 客户端处理 NAT、路由和状态包检测。 ## 目录 - [我构建了什么](#what-i-built) - [技术栈与环境](#tech-stack-and-environment) - [项目文件](#project-files) - [网络拓扑](#network-topology) - [构建过程](#the-build) - [1. VirtualBox 网络适配器](#1-virtualbox-network-adapters) - [2. Netplan 双接口配置](#2-netplan-dual-interface-configuration) - [3. IP 转发](#3-ip-forwarding) - [4. iptables 防火墙规则](#4-iptables-firewall-rules) - [5. 防火墙持久化](#5-firewall-persistence) - [6. 客户端虚拟机配置](#6-client-vm-configuration) - [故障排除与实际问题](#troubleshooting-and-real-issues) - [问题 1:VirtualBox 与 KVM 冲突](#issue-1-virtualbox-vs-kvm-conflict) - [问题 2:静态 IP 阻止了 DHCP](#issue-2-static-ip-blocking-dhcp) - [问题 3:快照恢复后接口消失](#issue-3-interface-vanished-after-snapshot-restore) - [问题 4:apt 在所有仓库上返回 404](#issue-4-apt-returning-404-on-all-repos) - [问题 5:nmtui 授权错误](#issue-5-nmtui-authorization-error) - [问题 6:Rocky 虚拟机位于错误的网络](#issue-6-rocky-vm-on-the-wrong-network) - [最终验证](#final-verification) - [我的收获](#what-i-learned) ## 我构建了什么 我从零开始将一台纯 Ubuntu Server 虚拟机变成了一台正常运行的路由器和防火墙。它有两个网络接口:一个通过 VirtualBox NAT 面向互联网,另一个面向我的内部实验室网络。我实验室中的所有其他虚拟机都通过它来路由流量,就像你家里的设备通过家庭路由器上网一样。不同之处在于我亲手构建了这个路由器,配置了两个接口、NAT 伪装、内核中的 IP 转发、状态防火墙规则以及重启后的持久化。 这不是一篇跟着教程做的记录。我遇到了真实的问题:一个仓库已失效的停止支持的 Ubuntu,一个导致虚拟机无法启动的 KVM 冲突,一个阻止了 DHCP 的 Netplan 配置,以及一个完全连接到错误虚拟网络上的 Rocky 虚拟机。每一个问题及其原因和解决方法都在下面进行了记录。 ## 技术栈与环境 | 组件 | 规格 | | :--- | :--- | | 宿主机操作系统 | Rocky Linux 9.7 (Blue Onyx) | | Hypervisor | Oracle VirtualBox | | 网关操作系统 | Ubuntu Server 24.10 (Oracular - EOL) | | 网络 | Netplan | | 防火墙/NAT | iptables v1.8.10 (nf_tables) | | 客户端 1 | Rocky Linux 9.5 | | 客户端 2 | Fedora 35 (GUI) | ## 项目文件 `configs/` 文件夹包含我在此项目期间编写的实际配置文件。README 解释了相关决策,configs 文件夹展示了具体操作。 | 文件 | 源路径 | 说明 | | :--- | :--- | :--- | | [50-cloud-init.yaml](configs/50-cloud-init.yaml) | `/etc/netplan/50-cloud-init.yaml` | 双接口配置:WAN 使用 DHCP,LAN 使用静态 IP | | [rules.v4](configs/rules.v4) | `/etc/iptables/rules.v4` | NAT 伪装、出站转发、状态返回规则 | | [sysctl.conf](configs/sysctl.conf) | `/etc/sysctl.conf` | 通过 net.ipv4.ip_forward=1 启用内核 IP 转发 | | [blacklist-kvm.conf](configs/blacklist-kvm.conf) | `/etc/modprobe.d/blacklist-kvm.conf` | KVM 黑名单,防止启动时发生 hypervisor 冲突 | ## 网络拓扑 ![网络拓扑](https://raw.githubusercontent.com/mansour-wade/Linux-Enterprise-Gateway/main/screenshots/project1-linux-gateway-topology.png) ## 构建过程 ### 1. VirtualBox 网络适配器 在接触 Ubuntu 之前,我在 VirtualBox 中配置了两个适配器。适配器 1 设置为 NAT,通过宿主机为 Ubuntu 提供 WAN 连接。适配器 2 设置为名为 `labnet` 的内部网络,创建了一个只有实验室虚拟机才能看到的隔离虚拟交换机。 ![适配器 1 NAT](https://raw.githubusercontent.com/mansour-wade/Linux-Enterprise-Gateway/main/screenshots/adapter1-NAT.png) ![适配器 2 labnet](https://raw.githubusercontent.com/mansour-wade/Linux-Enterprise-Gateway/main/screenshots/adapter2-labnet.png) ### 2. Netplan 双接口配置 我在 `/etc/netplan/50-cloud-init.yaml` 中配置了这两个接口: ``` network: version: 2 ethernets: enp0s3: dhcp4: true enp0s8: addresses: - 10.0.1.1/24 nameservers: addresses: - 8.8.8.8 ``` `enp0s3` 通过 DHCP 自动从 VirtualBox NAT 获取其 IP。`enp0s8` 获取静态 IP `10.0.1.1`,这将成为每个实验室虚拟机指向的网关地址。在这里静态地址是不可妥协的:如果网关地址发生偏移,整个实验室就会瘫痪。 ![ip addr show 输出](https://static.pigsec.cn/wp-content/uploads/repos/cas/1d/1dd1317f0a59dd1e6b39cf0518b0b29b410e8c4e73e7fbacff72da98a66d6bb6.png) ### 3. IP 转发 默认情况下,Linux 会丢弃任何不是发往自身的包。`/etc/sysctl.conf` 中的一行代码改变了这种行为,并指示内核在接口之间转发数据包: ``` net.ipv4.ip_forward=1 ``` 无需重启立即应用: ``` sudo sysctl -p ``` ![sysctl -p 输出](https://static.pigsec.cn/wp-content/uploads/repos/cas/36/369e6617d42166e8166750101507bdbc7e73ce62b91b9e91cf566198ee163b66.png) ### 4. iptables 防火墙规则 三条规则处理所有的路由逻辑: ``` # NAT masquerade: 在所有出站流量上加盖 Ubuntu 的 IP sudo iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE # 出站转发: 允许 LAN 流量到达 WAN sudo iptables -A FORWARD -i enp0s8 -o enp0s3 -j ACCEPT # Stateful return: 仅允许对已建立连接的回复返回 sudo iptables -A FORWARD -i enp0s3 -m state --state RELATED,ESTABLISHED -j ACCEPT ``` 第三条规则使这成为了一个状态防火墙。未经请求的入站流量会被自动丢弃,只有源自实验室内部的连接的合法返回流量才被允许通过。 ![iptables 规则已验证](https://static.pigsec.cn/wp-content/uploads/repos/cas/17/1714220512340e79a402d05d2e734b0277fdf29debb502ec4a0f87eadfca704c.png) ### 5. 防火墙持久化 iptables 规则仅存在于内存中,因此重启会将其完全清除。我安装了 `netfilter-persistent` 将规则保存到磁盘,并在开机时自动重新加载: ``` sudo apt install netfilter-persistent iptables-persistent -y ``` 规则被保存到 `/etc/iptables/rules.v4` 中,并在每次重启后依然保留。 ![iptables 规则已持久化](https://static.pigsec.cn/wp-content/uploads/repos/cas/37/378f96a04fc1f1bcd5ba7ec66550e267616cc0aa0b1e36c95de323983451241f.png) ### 6. 客户端虚拟机配置 我在 VirtualBox 中将 Rocky Linux 和 Fedora 都连接到了 `labnet`,并为它们分配了指向 Ubuntu 作为网关的静态 IP。 **Rocky Linux(通过 nmtui 配置):** ``` IP: 10.0.1.2/24 Gateway: 10.0.1.1 DNS: 8.8.8.8 ``` **Fedora(通过 GUI 网络设置配置):** ``` IP: 10.0.1.3/24 Gateway: 10.0.1.1 DNS: 8.8.8.8 ``` ![Rocky nmtui 静态 IP](https://static.pigsec.cn/wp-content/uploads/repos/cas/e3/e3953421dc2da9ffb939b67ba772bec9ce75f8745578bd1a6adea6d6dd16c551.png) ![Fedora 网络设置](https://raw.githubusercontent.com/mansour-wade/Linux-Enterprise-Gateway/main/screenshots/fedora-network-settings.png) ## 故障排除与实际问题 ### 问题 1:VirtualBox 与 KVM 冲突 **问题:** VirtualBox 拒绝启动任何虚拟机,抛出 `VERR_VMX_IN_VMX_ROOT_MODE` 错误。 **原因:** KVM 内核模块在 Rocky Linux 宿主机上自动加载,并在 VirtualBox 占用之前锁定了 CPU 虚拟化。KVM 是内置于 Linux 内核的 Type 1 hypervisor。VirtualBox 是 Type 2。它们不能同时共享硬件虚拟化。 **解决方法:** 我卸载了 KVM Intel 模块,并将它们永久列入黑名单,这样它们就不会在重启时重新加载: ``` sudo modprobe -r kvm_intel sudo modprobe -r kvm echo "blacklist kvm_intel" | sudo tee /etc/modprobe.d/blacklist-kvm.conf ``` ![KVM 冲突解决](https://static.pigsec.cn/wp-content/uploads/repos/cas/ab/abd780783afdf81960facb2985bbd2f814162e2edd4e8ce2cb3ea80612ae90e6.png) ### 问题 2:静态 IP 阻止了 DHCP **问题:** `enp0s3` 没有互联网连接,并且每次 ping 都返回 "Destination Host Unreachable"。 **原因:** 以前遗留的 Netplan 配置在之前的设置中将 `enp0s3` 硬编码为 `192.168.1.141`,网关为 `192.168.1.254`。VirtualBox NAT 通过 DHCP 分配 `10.0.2.x` 地址,因此静态配置与之发生了冲突,导致数据包无处可去。 **解决方法:** 我重写了 Netplan 配置,在 `enp0s3` 上设置了 `dhcp4: true`,并应用了它: ``` sudo netplan apply ``` 应用后立即确认互联网正常工作。 ### 问题 3:快照恢复后接口消失 **问题:** 恢复旧快照后,`enp0s8` 完全从虚拟机中消失了。 **原因:** 恢复快照连同操作系统状态一起还原了 VirtualBox 适配器 2 的设置,从虚拟机配置中移除了 `labnet` 接口。 **解决方法:** 我在 VirtualBox 设置中重新将适配器 2 启用为名为 `labnet` 的内部网络,然后重新应用了 Netplan。两个接口都正确恢复了。 ### 问题 4:apt 在所有仓库上返回 404 **问题:** `sudo apt update` 在每一个软件仓库上都返回了 404 错误。 **原因:** Ubuntu 24.10 Oracular 已达到停止支持阶段,官方镜像已被下架。除此之外,Ubuntu 24.10 将包源从 `/etc/apt/sources.list` 移动到了 `/etc/apt/sources.list.d/ubuntu.sources`,因此修复必须针对新的文件位置。 **解决方法:** ``` sudo sed -i 's|ca.archive.ubuntu.com|old-releases.ubuntu.com|g' /etc/apt/sources.list.d/ubuntu.sources sudo sed -i 's|security.ubuntu.com|old-releases.ubuntu.com|g' /etc/apt/sources.list.d/ubuntu.sources sudo apt update ``` 重定向后成功获取了 32.5MB 的数据。 ![apt update 成功](https://static.pigsec.cn/wp-content/uploads/repos/cas/c6/c605442c1d034e3fca7486672c2547f9097a6be345602a44444669c3bb053095.png) ### 问题 5:nmtui 授权错误 **问题:** 在 Rocky Linux 上尝试保存网络连接时,nmtui 抛出了 `GDBus.Error: The name is not activatable` 错误。 **原因:** 我在没有使用 sudo 的情况下启动了 nmtui。如果没有提升的权限,它无法访问处理写入网络配置的 DBus 服务。 **解决方法:** ``` sudo nmtui ``` ### 问题 6:Rocky 虚拟机位于错误的网络 **问题:** 尽管 Rocky 的 IP 设置和路由表看起来正确,但它无法 ping 通位于 `10.0.1.1` 的 Ubuntu。 **原因:** Rocky 的 VirtualBox 适配器被设置为 Bridged Adapter 而不是 Internal Network。Rocky 位于我的家庭网络中,而不是在 `labnet` 上。这两个虚拟机位于完全不同的虚拟交换机上,彼此之间没有路径。 **解决方法:** 我将 VirtualBox 适配器从 Bridged 更改为 Internal Network,并将名称设置为 `labnet`。重启后,所有的 ping 立即通过。 IP 设置不是问题。Rocky 配置正确,但它插在了错误的虚拟交换机上。这是一个第二层(Layer 2)错误,而我最初将其误读为第三层(Layer 3)问题。 ![Rocky 适配器设置为 labnet](https://static.pigsec.cn/wp-content/uploads/repos/cas/66/66f23c653349106fc385799e622e3cd1be55f2f89ab83ed9f3524eceb4aeee92.png) ## 最终验证 在网关完全重启后运行了所有八项测试,以确认 iptables 规则和路由配置在重启后得以保留。 | 测试 | 源 | 目标 | 备注 | | :--- | :--- | :--- | :--- | | ping 10.0.1.1 | Rocky | Ubuntu LAN | 网关可达,LAN 路由已确认 | | ping 8.8.8.8 | Rocky | 互联网 | NAT 伪装正常工作 | | ping google.com | Rocky | DNS + 互联网 | 已确认 DNS 解析和出站互联网 | | ping 10.0.1.1 | Fedora | Ubuntu LAN | 从 Fedora 可达网关 | | ping 8.8.8.8 | Fedora | 互联网 | Fedora 路径上的 NAT 正常工作 | | ping google.com | Fedora | DNS + 互联网 | 已确认 Fedora 上的 DNS 解析 | | ping 10.0.1.2 | Fedora | Rocky | Fedora 可以直接访问 Rocky | | ping 10.0.1.3 | Rocky | Fedora | Rocky 可以直接访问 Fedora | ![Rocky 三次 ping 成功](https://raw.githubusercontent.com/mansour-wade/Linux-Enterprise-Gateway/main/screenshots/rocky-three-pings-success.png) ![Fedora 三次 ping 成功](https://static.pigsec.cn/wp-content/uploads/repos/cas/17/17f14c7caf51115314813c6c61c5f37ebd21091f6d6ae75e79bc46e15a01a11f.png) ![Fedora ping Rocky](https://static.pigsec.cn/wp-content/uploads/repos/cas/95/959c367355afdd3599cd0682f58bedcc6488aea2ad39db99b6b46fde3c253976.png) ![Rocky ping Fedora](https://static.pigsec.cn/wp-content/uploads/repos/cas/c8/c88d801023071548499d26d7110676a13e388f3d0307a8bf2d37586c371a6441.png) ## 我的收获 如果不能在重启后保留,一个可用的配置就毫无意义。持久化必须从第一天起就作为计划的一部分,而不是事后才想起来的补救措施。 第二层(Layer 2)问题会伪装成第三层(Layer 3)问题。我花时间质疑 IP 配置,后来才意识到 Rocky 插入了错误的虚拟交换机。在接触第三层之前,务必先确认第二层。 Ubuntu 的停止支持是一个真正的运营难题。了解存档仓库位于何处,以及如何在不破坏包管理器的情况下重定向源,是在生产环境中出现的实用系统管理员知识。 自己动手构建路由器让理论变得豁然开朗,这是单纯阅读所永远无法达到的。我现在理解了 NAT 伪装和状态检测,因为我在它们无法正常工作时对它们进行了调试。
标签:iptables, Netplan, 网络地址转换(NAT), 网络网关, 网络路由, 防火墙