最大的收获:

1、理论指导实践,在没有把理论基础打牢固之前,扎进深水区,会卡壳很久。

整理一下最小路由器实现的理论思路;【但实际上,在真实设备上,内容要复杂一些】

最小路由器配置实验:从零构建一个上网系统

写作时间:2026年05月09日 星期六 00时00分
实验目标:通过配置一台最小化的 Linux 路由器,彻底弄清楚数据包从内网主机到外网的完整流转过程。

一、实验拓扑与核心思路

整个网络关系非常简单,只有三跳:

主机 host 网卡  -->  路由器 LAN 口 eth1  -->  路由器 WAN 口 eth0  -->  上级路由器 / 光猫

实验的核心任务,是让接在 eth1 上的内网主机,能够顺利访问上级网络(模拟外网)。中间每一步都有可能出现数据包“卡住”的情况,而我们要做的,就是从物理层到应用层,一层一层地把路打通。

实验分为七个阶段,由底向上解决问题。

二、关键知识储备

在做任何配置之前,先厘清一个非常重要的概念——网口状态

通过 ip link show 可以看到每个网口的两个关键标志位和内核状态:

  • 标志位 <UP>:链路层启用。由 ip link set eth0 up 控制,代表内核在二层的管理意愿。
  • 标志位 <POWER_UP>:物理链路正常。代表网线已插好,物理层连通。只有这个标志出现,物理层才算真正就绪。
  • state 字段:内核视角下的接口操作状态。
    • DOWN:内核希望接口关闭。
    • UP:内核希望接口启用,且驱动确认可以收发数据。
    • UNKNOWN:内核希望启用,但驱动不确定能否收发(常见于虚拟设备或隧道接口)。

注意state UP 独立于上述两个标志位,但正常情况下三者应该一致。

三、分阶段配置与排查

第一阶段:物理层与链路层唤醒

目标:让系统识别网卡,并让物理连接生效。

# 1. 查看所有网络接口,确认物理网卡是否被识别
ip link show

# 2. 将 eth0 和 eth1 从 DOWN 状态启用
ip link set eth0 up
ip link set eth1 up

# 3. 验证物理连接是否正常(重点关注 <POWER_UP> 标志)
ip link show eth0 | grep -E "UP|POWER_UP"
ip link show eth1 | grep -E "UP|POWER_UP"

排查思路:如果看到 <...,UP,...> 但没有 <POWER_UP>,基本就是网线没插对或没插好。这是实验遇到的第一个“卡点”,验证方式就是直接查看这两个标志位。

第二阶段:IP 层配置与内外网划分

目标:为 WAN 口和 LAN 口配置 IP 地址,规划路由角色。

  • WAN 口(eth0):接上级网络,假设上级网段为 192.168.99.0/24,网关为 192.168.99.1
  • LAN 口(eth1):接内网主机,规划内网网段为 192.168.1.0/24
# 为 WAN 口配置 IP,并添加默认路由
ip addr add 192.168.99.100/24 dev eth0
ip route add default via 192.168.99.1 dev eth0   # dev eth0 指定出接口,是必要的

# 为 LAN 口配置 IP
ip addr add 192.168.1.1/24 dev eth1

# 验证配置
ip addr show eth0
ip addr show eth1

关键理解

  1. 默认路由是“兜底”规则。当数据包目标不在任何已知直连网段时,内核会根据最长前缀匹配,最终命中默认路由。
  2. dev eth0必要指定的。如果不指定设备,内核可能无法明确从哪个接口发出,尤其是在存在多网卡的情况下。

第三阶段:连通性基础验证

目标:验证主机到路由器、路由器到外网的点对点连通性。

1. 主机配通路由器 LAN 口
给接在 eth1 上的主机手动配置同网段 IP,例如 192.168.1.100/24。此时无需配置网关,因为二者直连。
排障:如果 ping 不通 192.168.1.1,按以下顺序排查:

  • 网线是否插到了正确的网卡(看 POWER_UP 标志)。
  • 两端 IP 和掩码是否在同一网段。
  • 主机/路由器防火墙是否拦截(实验初期建议先清空 iptables 规则)。

2. 路由器本身访问外网
在路由器上直接 ping 8.8.8.8。若不通,除了检查默认路由,还有一个高级排查手段——在纯二层抓包,不依赖 IP 配置:

ip link set eth0 up
ip link set eth0 promisc on   # 开启混杂模式
tcpdump -i eth0 -nn -e        # -e 显示以太网帧头,能看到对端 MAC

通过抓取 ARP 广播或任何来自对端的帧,就能从帧头中直接读出上级网关的 MAC 地址和 IP 地址。这是一个绕过三层配置盲区的底层排查方法。

第四阶段:开启 IP 转发(路由核心)

目标:让路由器能在 WAN 口和 LAN 口之间转发“过路”的数据包。
这是实验遇到的第二个重大“卡点”,也是最核心的概念点。

问题本质:Linux 默认是主机行为,收到一个目标 IP 不是自己任何接口 IP 的数据包,会直接丢弃。现在,内网主机 192.168.1.100 发出的包,目标 8.8.8.8,经过路由器时,路由器不会转发它。

解决方案:开启内核的 IP 转发功能。

# 查看当前转发状态(0=关闭,1=开启)
cat /proc/sys/net/ipv4/ip_forward

# 临时开启
echo 1 > /proc/sys/net/ipv4/ip_forward
# 或
sysctl -w net.ipv4.ip_forward=1

概念分离

  • 默认路由:解决“该怎么出去”的问题。(路由器本身 ping 外网靠它)
  • IP 转发:解决“别人的包该不该帮它转”的问题。(主机上网靠它)

第五阶段:地址转换(NAT)

目标:让内网私有 IP 的数据包能成功“回家”。
这是实验遇到的第三个“卡点”,也是最容易忽略的地方。

问题本质:开了转发后,192.168.1.100 的 Ping 包确实能到 8.8.8.8 了。但回包的目标是 192.168.1.100,这个地址是私有地址,在公网上(或上级路由器眼里)不可路由。回包找不到路,最终被丢弃。

解决方案:在 WAN 口上做源地址转换(SNAT / MASQUERADE),将内网主机的源 IP 替换为路由器 WAN 口的 IP。当回包到达时,路由器再反向转换回内网 IP。

# 在 POSTROUTING 链上对从 eth0 发出的包做 MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# 验证规则
iptables -t nat -L -n -v

规则解读

  • -t nat:操作 nat 表。
  • -A POSTROUTING:挂载到 POSTROUTING 链(路由决策后、即将发出前的最后一环)。
  • -o eth0:匹配从 eth0 发出的包。
  • -j MASQUERADE:动态地将源 IP 替换为 eth0 上的 IP,并在连接跟踪表中记录映射,以便回包还原。

至此,内网主机应该可以 ping 通外网 IP 了。三个核心“开关”全部打开:默认路由 → IP 转发 → NAT

四、后续服务规划(提纲)

前五阶段已经跑通了最核心的数据包通路。要让这台路由器更实用,还需要两个自动化的服务:

第六阶段:动态主机配置(DHCP)

  • 目的:让内网设备自动获取 IP,无需手动配。
  • 方案:安装 dnsmasqisc-dhcp-server,在 eth1 上配置地址池、子网、网关和 DNS。

第七阶段:DNS 转发

  • 目的:让内网设备能解析域名。
  • 方案:仍可用 dnsmasq,在提供 DHCP 的同时,作为 DNS 转发器监听 LAN 口,将内网的 DNS 请求转发至公网 DNS(如 8.8.8.8)。这样比客户端直连公网 DNS 多了一层缓存,也更易管控。

实验感悟:整个搭建过程,其实就是把“默认路由”、“IP 转发”、“NAT”这三个各自独立的概念,在实践中拼回了一张完整的拼图。每一个看似简单的 ping 命令背后,都穿梭着这几道关口。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐