家里折腾过一阵软路由的人,迟早会遇到同一个问题:主路由不想换,但想再挂一台设备做点别的事——跑 Docker、做文件服务器、给测试设备一个独立网段。
这篇是我这 3 年踩坑沉淀下来的拓扑:主路由不动,再挂一台 OpenWrt 做二级路由分一个
192.168.10.x实验段,稳定跑了快两年。文中所有 IP、UCI 配置都是实际在用的(脱敏过),改完名字就能抄。
本文适合谁 / 不适合谁
适合:
- 家里有一台主路由(小米/华硕/iKuai),想再挂一台 OpenWrt 跑 Docker / NAS / 实验服务
- 已经会用 LuCI 基本操作,但不太理解"为什么要加静态路由""NAT 到底要不要关"
- 想搞 VLAN 单臂路由但拿不准值不值得
- 只想搞清楚 IP / 路由 / NAT / 防火墙 层面的事,不涉及其他网络转发玩法
不适合:
- 想搞"让某些设备走特定网关的单臂旁路由"的:那是另一类拓扑,本文 §4 简单说一下区别,但不展开
- 想做企业级三层交换 / OSPF 那一套的:家用没必要,不在范围
TL;DR
- 首选方案:主路由 + 二级 OpenWrt 路由,分两个网段(
192.168.1.x主网 /192.168.10.x实验段),关掉二级路由的 NAT,主路由加一条静态路由 - 单网口的迷你主机才考虑单臂路由(VLAN Trunk),能跑但排错成本高
- 同网段"单臂旁路由"(靠改网关把设备流量引到自己的那种)是另一类拓扑,不要和本文混淆
- 记住一句话:二级路由 WAN 配静态 IP + 关 NAT + 主路由加静态路由——这三步缺一个,"主网 ping 不通实验段"的问题就会出现
一、几个必须分清的概念
这几个词中文社区里经常混用,先统一一下:
| 词 | 在本文的意思 |
|---|---|
| 主路由 | 直接接光猫或上级、负责拨号/NAT 的那台,家里多数设备默认网关指向它 |
| 二级路由 | 网线插在主路由 LAN 口上的另一台路由器,自己再管一个独立网段(本文主角) |
| 单臂旁路由 | 和主路由在同一个网段,靠把客户端网关指到自己来接管流量转发(与本文双网段方案不同,不在本文范围) |
| 单臂路由(Router-on-a-Stick) | 一根物理线靠 VLAN 在上面跑多个逻辑子网(§5 讨论) |
| 静态路由 | 路由表里手动加的一条规则,告诉路由器"去某某网段走这条路" |
| NAT / SNAT / MASQUERADE | 源地址转换。OpenWrt 的 WAN zone 默认开着 masquerading=1,对所有从 LAN 出去的包替换源地址为 WAN 口地址 |
特别澄清:中文社区里说"旁挂路由"或"旁路由",绝大多数指的是"单臂旁路由"(同网段,靠改网关接管流量的那种)。本文讲的是二级路由(双网段) ,是完全不同的拓扑。本文里不会再用"旁挂""旁路由"这两个词,避免误导。
二、先说 NAT:本文方案为什么要关掉它
OpenWrt 默认行为:装好系统后,WAN zone 默认 option masq '1',也就是所有从 LAN 出去经过 WAN 的包,源地址都会被改成 WAN 口地址。这是 SOHO 路由器的标准做法。
但二级路由里,这是个坑。具体看下面对比:
2.1 NAT 开着会怎样
实验段设备 192.168.10.50 访问外网:
src=192.168.10.50 → 二级路由 → NAT 改 src 为 192.168.1.100 → 主路由 → PPPoE
回包能正常 NAT 回去。出门方向没问题。
但当主网设备 192.168.1.50 想 ping 实验段 192.168.10.50 时:
src=192.168.1.50, dst=192.168.10.50 → 主路由(要有静态路由)→ 二级路由 WAN
→ 二级路由路由到 LAN → 实验段设备
技术上能通(NAT 只对出方向做转换,进方向不动),但前提是:
- 主路由有
192.168.10.0/24 via 192.168.1.100的静态路由 - 二级路由的 WAN 防火墙 zone 单独开一条规则放行
192.168.1.0/24 → lan - NAT 表里会留下方向奇怪的 conntrack 记录,长期跑可能会有偶发问题
这种"NAT 还开着但又非要让外面进得来"的做法是最别扭的——二级路由身份精神分裂,既假装是个独立小局域网,又假装是个透明路由器。
2.2 NAT 关掉会怎样
二级路由变成纯三层路由器:
src=192.168.10.50, dst=8.8.8.8 → 二级路由(不动 src)→ 主路由
→ 主路由 NAT(src 改成公网 IP)→ 出去
回包:主路由 NAT 还原 dst 为 192.168.10.50,但是主路由要知道 192.168.10.0/24 走哪儿——所以主路由的静态路由是必须的。
反向访问(主网 → 实验段)变得干净:
src=192.168.1.50, dst=192.168.10.50 → 主路由(查静态路由)→ 二级路由 WAN
→ 二级路由(无 NAT)→ LAN → 实验段设备
src/dst 全程不变,conntrack 干净,防火墙只需要一条简单的 wan → lan 放行规则。这就是真正的"二层互通"。
2.3 两种方案对比
| 维度 | NAT 开(OpenWrt 默认) | NAT 关(本文推荐) |
|---|---|---|
| 实验段访问外网 | ✅ 自动 | ✅ 自动(靠主路由 NAT) |
| 主网 → 实验段 | ⚠️ 需静态路由 + 防火墙规则 + 接受奇怪 conntrack | ✅ 加静态路由 + 防火墙规则即可,干净 |
| 实验段 → 主网 | ✅ src 是 192.168.1.100(被 NAT 隐藏) | ✅ src 是 192.168.10.x(保留真实地址) |
| 主路由日志 / 监控 | ❌ 看不到实验段真实 IP | ✅ 能看到实验段每台机器 |
| 双 NAT 影响(P2P/打洞) | ⚠️ 两层 NAT | ✅ 只一层 NAT(在主路由) |
结论:家用 homelab 想要的就是"实验段是我家网络的一部分,只是隔了一层",这就是 NAT 关掉的方案。NAT 开的方案适合**"实验段当沙箱,主网完全不知道里面有什么"**的场景,少见。
下面所有步骤都按 NAT 关闭 + 静态路由 这条路来。
三、方案 A:主路由 + 二级路由分双网段(最推荐)
3.1 拓扑和地址规划
我家实际配置(脱敏):
| 设备 | 角色 | 地址 | 说明 |
|---|---|---|---|
| 光猫 | 接入 | — | 桥接模式,拨号由主路由做 |
| 主路由 LAN | 默认网关 | 192.168.1.1/24 | 普通设备都落在这个段 |
| 二级路由 WAN | 接主路由 LAN | 192.168.1.100(静态) | 在主路由视角是个"设备" |
| 二级路由 LAN | 实验段网关 | 192.168.10.1/24 | 实验/服务设备落这里 |
| 实验段设备 | 由二级路由 DHCP 分配 | 192.168.10.x | NAS、Docker、树莓派等 |
3.2 接线
光猫 ──WAN── 主路由 ──LAN─┬── 家里普通设备(电脑/电视/Wi-Fi)
│
└── LAN ── 二级路由 WAN 口
│
LAN 口 ── 实验段设备(NAS / Docker)
关键:二级路由的 WAN 接主路由的 LAN,不是接光猫。
3.3 主路由要做的两件事
(1) 给二级路由 WAN 保留固定地址
二级路由重启后如果拿到不同 IP,下面的静态路由就废了,必须固定。
以华硕为例:高级设置 → LAN → DHCP 服务器 → 手动分配 DHCP 列表,把二级路由 WAN 口 MAC 绑到 192.168.1.100。
其他常见路由器:
- iKuai:
内网管理 → DHCP 服务端 → 静态地址分配 - OpenWrt / iStoreOS(主路由也是这个的话):
Network → DHCP and DNS → Static Leases - 小米路由器:
常用设置 → DHCP 静态分配(部分型号需刷固件)
(2) 加一条静态路由
没这条,主路由根本不知道 192.168.10.0/24 怎么走,所有去实验段的包都会被丢给 PPPoE 出口,结果就是无穷无尽的"不通"。
高级设置 → LAN → 路由 → 静态路由列表:
| 目标网络 | 子网掩码 | 网关 | 接口 |
|---|---|---|---|
192.168.10.0 | 255.255.255.0 | 192.168.1.100 | LAN |
人话: "所有去 192.168.10.x 的流量,甩给 192.168.1.100 这台二级路由,它知道怎么处理。"
保存 → 应用。
3.4 二级路由要做的四件事
OpenWrt / iStoreOS 界面大同小异,以 OpenWrt 为例。
(1) WAN 口设静态 IP
Network → Interfaces → WAN 编辑:
- Protocol:
Static address - IPv4 address:
192.168.1.100 - Netmask:
255.255.255.0 - Gateway:
192.168.1.1(主路由地址) - DNS:
192.168.1.1或公共 DNS(阿里223.5.5.5/ 腾讯119.29.29.29)
UCI 等效写法:
uci set network.wan.proto='static'
uci set network.wan.ipaddr='192.168.1.100'
uci set network.wan.netmask='255.255.255.0'
uci set network.wan.gateway='192.168.1.1'
uci set network.wan.dns='192.168.1.1 223.5.5.5'
uci commit network
/etc/init.d/network reload
(2) 关闭 WAN 区域的 NAT(关键步骤,原版漏写)
Network → Firewall → General Settings → 找到 WAN zone → Edit:
- Masquerading:取消勾选
- MSS clamping:建议保留勾选(避免某些链路 MTU 问题)
- Input:accept(或 reject,按需)
- Forward:reject(默认)
UCI 等效:
uci set firewall.@zone[1].masq='0' # @zone[1] 通常是 wan zone,建议先 uci show firewall 确认
uci set firewall.@zone[1].mtu_fix='1'
uci commit firewall
/etc/init.d/firewall reload
⚠️
@zone[1]这个索引不是绝对的,先跑uci show firewall | grep zone看清楚 wan 是@zone[0]还是@zone[1],再改对应的那个。
(3) LAN 口改到 192.168.10.1/24
Network → Interfaces → LAN:
- IPv4 address:
192.168.10.1 - Netmask:
255.255.255.0 - DHCP:开,池
192.168.10.100~192.168.10.250
建议:给 DHCP 池留出 .2 ~ .99 做静态分配,NAS、Docker 容器、IPMI 这些要长期固定 IP 的放静态段,避免 DHCP 抢地址。
(4) 防火墙放行主网 → 实验段
OpenWrt 默认 WAN zone 禁止入站,必须主动放一条:
Network → Firewall → Traffic Rules → Add:
- Name:
Allow-Main-to-Lab - Source zone:
wan - Source address:
192.168.1.0/24(只放主网,不放外网) - Destination zone:
lan - Action:
accept
Source address 一定要填 192.168.1.0/24,留空等于把实验段暴露在公网。
3.5 通不通的验证顺序
每次配置完或换硬件后,按这个顺序 ping,定位问题特别快:
# 在实验段机器上(192.168.10.x)
ping 192.168.10.1 # 1. 通二级路由 LAN? 不通 → DHCP 或网线问题
ping 192.168.1.100 # 2. 通二级路由 WAN? 不通 → 二级路由 WAN 接口或路由表
ping 192.168.1.1 # 3. 通主路由? 不通 → 二级路由 WAN 配错或主路由没识别
ping 223.5.5.5 # 4. 通外网? 不通 → 主路由 NAT / DNS / 出口问题
ping www.baidu.com # 5. 解析域名? 不通 → DNS
# 在主网机器上(192.168.1.x)
ping 192.168.10.1 # 6. 主网通二级 LAN? 不通 → 主路由静态路由没加
ping 192.168.10.50 # 7. 主网通实验段? 不通 → 二级路由防火墙 WAN→LAN 没开 或 NAT 没关
1–5 步是出门方向问题,6–7 步是进门方向问题,两类问题分开排查。
四、和"单臂旁路由"的区别(别买错教程)
中文社区说"旁路由",绝大多数指的不是本文这种"二级路由分网段",而是 单臂旁路由:
| 维度 | 二级路由(本文) | 单臂旁路由 |
|---|---|---|
| 网段 | 双网段 192.168.1.x + 192.168.10.x | 单网段,都在 192.168.1.x |
| 物理接线 | WAN 接主路由 LAN,自己 LAN 接下游设备 | 只用一个口接主路由 LAN,无下游 |
| 下游设备怎么接入 | 下游设备物理上挂在二级路由 LAN 下 | 通过把客户端的网关 / DHCP option 指到旁路由 IP |
| NAT | 推荐关闭(本文) | 必须关闭(否则源地址会暴露给上游) |
| 典型用途 | 分网段隔离 / 实验段 / NAS / Docker | 让特定设备走指定网关(另一类玩法) |
| 适合本文吗 | ✅ 是本文主题 | ❌ 不在本文范围 |
如果你要找的是后者,本文方案救不了你,应该去搜"OpenWrt 单臂旁路由"或类似关键词。本文之后所有"二级路由"指的都是前者。
五、单臂路由(VLAN Trunk):偏门选择
跟"单臂旁路由"是两件事,**单臂路由(Router-on-a-Stick)**指的是一台路由器只用一个物理口,靠 VLAN 在一根线上跑多个逻辑子网。
5.1 什么时候才用
场景:迷你主机只有一个物理口(某些 x86 板子只有 1×2.5G),或者为了省一根线,路由器到交换机只走单线。
原理:一根线上多个 VLAN tag,路由器软件里建多个"子接口",每个子接口当作 WAN 或 LAN。
5.2 配置示意
光猫 ──(PPPoE Untagged)── 交换机 Access 口(VLAN 10)
│
└── Trunk 口(VLAN 10 + VLAN 20)
│
单根线
│
软路由物理口 eth0
├── eth0.10 → WAN(拨号)
└── eth0.20 → LAN
│
└── 其他 Access 口(VLAN 20)── 家里设备
5.3 OpenWrt UCI 大致写法
config device
option name 'eth0.10'
option type '8021q'
option vid '10'
option ifname 'eth0'
config device
option name 'eth0.20'
option type '8021q'
option vid '20'
option ifname 'eth0'
config interface 'wan'
option device 'eth0.10'
option proto 'pppoe'
option username 'xxx'
option password 'xxx'
config interface 'lan'
option device 'eth0.20'
option proto 'static'
option ipaddr '192.168.1.1'
option netmask '255.255.255.0'
LuCI 路径:Network → Interfaces → Devices → Add device,类型选 VLAN (802.1q),base device 选 eth0,建 VID 10 和 VID 20 两个。
5.4 三个真实踩过的坑
坑 1:消费级傻瓜交换机不支持 802.1Q。小米某些型号、TP-Link SG105 这种根本不认 VLAN Tag,必须换网管交换机(带 Web 后台能配 VLAN 的)。
坑 2:带宽是共享的。上下行所有流量挤一根线,1G 链路接近 1G 时就是瓶颈。4K 直播 + 全家刷视频的场景,单臂路由会被打满。
坑 3:排错难度比双网口高一个数量级。任何 VLAN Tag 错位整段网络断;OpenWrt 有时 swconfig 和 DSA 两套驱动共存,配出来看着对实际没生效,要盯日志才发现。
我的选择:用四口软路由就别为省一根线绕这种弯。只有单网口设备才考虑这条路。
六、IPv6 一句话原则
主路由 PPPoE 如果拿到电信/联通的 IPv6 委托前缀(PD,/60 或 /56),二级路由场景下 IPv6 比 IPv4 复杂:
- 要让主路由把 PD 再委托一段给二级路由(DHCPv6-PD Relay)
- 防火墙思维从 IPv4 的"NAT 隔离"切到"每个设备都有公网地址,默认禁止入站"
建议:先把 IPv4 彻底调通再单独开 IPv6。两个一起上问题分不清,耽误的时间远超省下来的。
七、常见故障 FAQ
Q1:实验段能上网,但主网 ping 不通实验段
三个可能(按概率排序):
- 主路由缺静态路由(§3.3-2 那条)
- 二级路由 WAN zone 的 NAT 没关(§3.4-2)
- 二级路由防火墙的 WAN→LAN 规则没开(§3.4-4)
按顺序检查一遍,基本能定位。
Q2:DHCP 地址冲突,电脑有时拿主网地址有时拿实验段
电脑先插主路由后插二级路由时会出现,DHCP 租约还没过期。
- Windows:
ipconfig /release && ipconfig /renew - macOS/Linux:重启网卡 /
dhclient -r && dhclient - 最省事:直接重启电脑
Q3:双 NAT 怎么判断
家里有光猫 + 主路由就已经是单 NAT 了(光猫桥接 + 主路由 PPPoE)。如果光猫也在拨号(路由模式),那是双 NAT,P2P 类应用会废。
修法任选一种:
- 光猫桥接,主路由拨号(推荐)
- 主路由桥接,二级路由拨号(少见,仅当主路由不支持桥接时考虑)
本文方案因为关掉了二级路由 NAT,没有引入额外 NAT 层,不会从单 NAT 变双 NAT。这也是关 NAT 的重要好处之一。
Q4:PPPoE 拨号不稳定
logread | grep -i pppoe 看日志:
- 频繁
LCP echo timeout→ 光猫或运营商线路问题 LCP terminated→ 试试改 MTU(标准 1500 → 1492 / 1480)- 完全没日志但就是断 → 主路由硬件 / 散热 / 内存泄漏
光猫本身不稳的话,找运营商开超级管理员密码重做 LOID / 拨号账号。
八、可以直接拿走的 3 件东西
① 地址规划模板
主网:192.168.1.0/24
├── 主路由 192.168.1.1
├── 二级路由 WAN 192.168.1.100(静态,保留)
├── DHCP 池 192.168.1.101 - 192.168.1.200
└── 静态段 192.168.1.201 - 192.168.1.250(NAS / 打印机 / 智能家居网关)
实验段:192.168.10.0/24
├── 二级路由 LAN 192.168.10.1
├── DHCP 池 192.168.10.100 - 192.168.10.250
└── 静态段 192.168.10.2 - 192.168.10.99(Docker / 虚拟机)
② 二级路由 OpenWrt 最小 UCI 脚本(关 NAT 版)
存成 secondary-router-setup.sh,SSH 到二级路由执行:
#!/bin/sh
# 1. WAN 静态 IP
uci set network.wan.proto='static'
uci set network.wan.ipaddr='192.168.1.100'
uci set network.wan.netmask='255.255.255.0'
uci set network.wan.gateway='192.168.1.1'
uci set network.wan.dns='192.168.1.1 223.5.5.5'
# 2. LAN 网段改到 192.168.10.0/24
uci set network.lan.ipaddr='192.168.10.1'
uci set network.lan.netmask='255.255.255.0'
# 3. 关闭 WAN zone 的 NAT(关键!)
# 先看 wan zone 的索引:
WAN_ZONE_INDEX=$(uci show firewall | grep "name='wan'" | sed -E "s/firewall.@zone[([0-9]+)].*/\1/")
echo "WAN zone index = $WAN_ZONE_INDEX"
uci set firewall.@zone[$WAN_ZONE_INDEX].masq='0'
uci set firewall.@zone[$WAN_ZONE_INDEX].mtu_fix='1'
# 4. 放行主网访问实验段
uci add firewall rule
uci set firewall.@rule[-1].name='Allow-Main-to-Lab'
uci set firewall.@rule[-1].src='wan'
uci set firewall.@rule[-1].src_ip='192.168.1.0/24'
uci set firewall.@rule[-1].dest='lan'
uci set firewall.@rule[-1].target='ACCEPT'
# 5. 应用
uci commit
/etc/init.d/network reload
/etc/init.d/firewall reload
echo "Done. 主路由别忘了加静态路由 192.168.10.0/24 → 192.168.1.100"
echo "测试:在主网 ping 192.168.10.1 应通。"
跑完之后别忘了在主路由后台手动加那条静态路由。脚本只配二级路由,主路由的事它管不了。
③ 排障 6 步清单(打印贴路由器旁)
见 §3.5,按顺序 ping,第几步断就知道问题在哪。
写在最后
家里网络这东西,反复折腾几轮之后会有个体感:稳定的拓扑往往不是最"酷"的那种。单臂路由、VLAN 划分、双 NAT 套娃,听起来都很工程师范,家用带来的复杂度往往大于收益。
我现在这套 NAT 关掉的二级路由方案,最大优点就是"无聊"——家里人感知不到,我折腾实验段的时候不影响他们上网;主路由日志里能直接看到每台实验机的真实 IP;P2P 类应用走的还是单 NAT,打洞跟主网设备一样顺。
如果你也在搞家庭网络或 homelab,希望这篇能帮你少踩一点坑。欢迎在评论区贴你家的拓扑图,我帮你看看哪里容易出问题。
作者:mowei-ie · 更多踩坑笔记见 GitHub