使用Linux的软路由实战02:基础网络配置

前言🔗

上一章我们已经在 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.x192.168.x.x 网段),而 LAN 口还没有 IP 地址。

为 LAN 口配置静态 IP🔗

Router VM 需要为内网(LAN)提供一个固定的网关地址,同时也作为 DHCP 和 DNS 服务的地址。我们给 LAN 口分配一个静态 IP:

nmcli con show

这条命令会列出 NetworkManager 管理的连接。找到对应 LAN 口的连接名称(通常是 WiredenpXsY),然后执行:

# 假设 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 口对应的连接名称(如 enp1s0enp2s0),然后设置区域:

# 将 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 口静态 IP192.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 来运行各种软件,进一步扩展路由器的功能。