前言🔗
上一章我们已经在 Hyper-V 中搭建好了实验环境——Router VM 和 Client VM 各就各位,但网络还处于各自为政的状态。这一章我们要进入 Router VM,手动配置网络,让它真正扮演路由器的角色。
本章的目标很简单:让 Router VM 能够为 Client VM 提供 DHCP 分配地址、转发流量访问外网(NAT)。
登录 Router VM🔗
打开 Hyper-V 管理器,右键 Router 虚拟机 → 连接,用你在安装时设置的 root 密码登录。
首先确认网卡状态:
ip link show
你应该能看到两块网卡,命名类似 enpXsY 的形式(在 Fedora 中,eth0/eth1 这类传统命名已被 enpXsY 取代)。为了表述方便,下文统称为 WAN 口(连接 Default Switch 的那块)和 LAN 口(连接内部交换机的那块)。
如果不确定哪块对应哪个交换机,可以用以下命令查看:
ip addr show
WAN 口此时应该已经通过 DHCP 从 Default Switch 拿到了一个 IP(通常是 172.x.x.x 或 192.168.x.x 网段),而 LAN 口还没有 IP 地址。
为 LAN 口配置静态 IP🔗
Router VM 需要为内网(LAN)提供一个固定的网关地址,同时也作为 DHCP 和 DNS 服务的地址。我们给 LAN 口分配一个静态 IP:
nmcli con show
这条命令会列出 NetworkManager 管理的连接。找到对应 LAN 口的连接名称(通常是 Wired 或 enpXsY),然后执行:
# 假设 LAN 口的连接名称为 enpXsY,请替换为实际名称
nmcli con mod "enpXsY" ipv4.addresses 192.168.10.1/24
nmcli con mod "enpXsY" ipv4.method manual
nmcli con up "enpXsY"
192.168.10.1/24是内网网段,你可以换成自己习惯的网段,比如192.168.1.1/24,只要后续配置保持一致即可。
验证 LAN 口是否已配置成功:
ip addr show enpXsY
输出中应该能看到 192.168.10.1/24 这个地址。
开启 IP 转发🔗
Linux 默认不会转发数据包——也就是说,从 WAN 口进来的包不会自动走到 LAN 口,反之亦然。要让它成为路由器,必须开启 IP 转发:
# 即时生效
sysctl -w net.ipv4.ip_forward=1
# 写入 sysctl 配置,使重启后依然生效
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.d/90-router.conf
如果未来需要支持 IPv6,同样需要开启
net.ipv6.conf.all.forwarding = 1。
配置 NAT 和防火墙(firewalld)🔗
开启 IP 转发后,Router VM 可以在不同网口之间转发包,但 WAN 口的数据包无法直接到达内网的 Client VM(它们是私有 IP)。这就需要 NAT(网络地址转换)——将内网 IP 转换为 WAN 口的 IP 访问外网。
Fedora Server 默认使用 firewalld 管理防火墙。我们通过 firewall-cmd 配置:
配置 firewalld 区域🔗
firewalld 通过「区域」(zone)来管理不同网络的信任级别。我们需要:
- 将 WAN 口 放到
external区域(开启 masquerade) - 将 LAN 口 放到
internal区域(允许内网设备互访)
先查看当前网络接口所属的区域:
firewall-cmd --get-active-zones
下面我们通过 NetworkManager 将接口分配到正确的区域。
先找到两块网卡对应的连接名称:
nmcli con show
记下 WAN 口和 LAN 口对应的连接名称(如 enp1s0、enp2s0),然后设置区域:
# 将 WAN 口的连接设为 external 区域(开启 masquerade)
nmcli con mod "enp1s0" connection.zone external
# 将 LAN 口的连接设为 internal 区域(允许内网互访)
nmcli con mod "enp2s0" connection.zone internal
# 重新加载连接使生效
nmcli con up "enp1s0"
nmcli con up "enp2s0"
用
nmcli设置connection.zone后,NetworkManager 会负责将区域信息同步给 firewalld,两者互不冲突。重启后配置依然保留。 ⚠️ 反过来,此时通过firewall-cmd --add-interface配置区域,NetworkManager 下次重连时会直接覆盖掉。所以区域相关的配置统一走nmcli。
验证 NAT 是否生效🔗
输入指令查看完整的区域规则:
firewall-cmd --zone=external --list-all
💡
external区域默认已开启 masquerade,不需要手动执行--add-masquerade。如果确认一下:firewall-cmd --zone=external --add-masquerade --permanent firewall-cmd --reload
内网区域放行必要服务🔗
internal 区域默认放行 SSH 等服务,但我们还需要确保 DHCP 和 DNS 请求能通过防火墙:
firewall-cmd --zone=internal --add-service=dhcp --add-service=dns --permanent
firewall-cmd --reload允许内网流量转发到外网🔗
配了 zone 和 masquerade 后,firewalld 默认还是不会转发来自 internal 的流量到 external。需要显式添加一条转发策略:
firewall-cmd --permanent --new-policy internal2external
firewall-cmd --permanent --policy internal2external --add-ingress-zone internal
firewall-cmd --permanent --policy internal2external --add-egress-zone external
firewall-cmd --permanent --policy internal2external --set-target ACCEPT
firewall-cmd --reload
internal2external含义很直白:来自 internal 区域、去向 external 区域的流量,一律放行。
验证最终配置:
firewall-cmd --list-all-zones配置 DHCP 服务(dnsmasq)🔗
内网的 Client VM 需要自动获取 IP,我们安装 dnsmasq 作为 NetworkManager 的 DNS 和 DHCP 后端,由 NetworkManager 代为管理 dnsmasq 进程。
# 安装 dnsmasq
dnf install -y dnsmasq启用 dnsmasq 插件🔗
在 /etc/NetworkManager/conf.d/ 下创建一个配置文件,告诉 NetworkManager 使用 dnsmasq 作为 DNS 后端:
cat > /etc/NetworkManager/conf.d/00-use-dnsmasq.conf << 'EOF'
[main]
dns=dnsmasq
EOF
用
conf.d下的独立文件来配置,比直接改NetworkManager.conf更干净,系统更新时不会被覆盖。
配置 dnsmasq🔗
配置文件不放在 /etc/dnsmasq.conf,而是放到 NetworkManager 的 dnsmasq 专用目录:
cat > /etc/NetworkManager/dnsmasq.d/router.conf << 'EOF'
# 监听 LAN 口,不暴露到 WAN 侧
interface=enpXsY
bind-interfaces
# DHCP 地址池:从 192.168.10.100 到 192.168.10.200,租期 24h
dhcp-range=192.168.10.100,192.168.10.200,24h
# 网关(路由器自身)
dhcp-option=3,192.168.10.1
# DNS 服务器(直接用114了)
dhcp-option=6,114.114.114.114
# 域名
local=/lan/
EOF
配置项说明:
dhcp-range定义分配的 IP 范围dhcp-option=3是网关地址dhcp-option=6是 DNS 服务器地址
重启 NetworkManager 使以上配置生效:
systemctl restart NetworkManager验证 Client VM 的网络🔗
回到 Client VM 的 Hyper-V 连接窗口,重启网络或直接重启虚拟机:
# 在 Client VM 中执行
ip addr show
正常情况下,Client VM 应该从 Router VM 的 dnsmasq 获得一个 192.168.10.x 网段的 IP。ping 一下网关和外部地址来验证:
ping -c 3 192.168.10.1 # 网关(Router VM LAN 口)
ping -c 3 8.8.8.8 # 外网(Google DNS)
如果能 ping 通外网,说明 NAT 配置成功。再测试一下 DNS 解析:
ping -c 3 baidu.com
如果域名也能解析,那么 DHCP + DNS + NAT 全套链路就都通了!
总结🔗
到这一步,我们完成了以下工作:
| 项目 | 内容 |
|---|---|
| ✅ LAN 口静态 IP | 192.168.10.1/24 |
| ✅ IP 转发 | net.ipv4.ip_forward=1 |
| ✅ NAT (firewalld) | masquerade 伪装 |
| ✅ DHCP 服务 (dnsmasq) | 地址池 192.168.10.100-200 |
| ✅ Client VM 上网 | DHCP 分配 + NAT 出网 |
Router VM 现在是一台功能完整的家用路由器了!下一章我们将在此基础上引入容器化技术,用 Podman 来运行各种软件,进一步扩展路由器的功能。