新买了个NAS, 安装网上教程配置旁路由存在各种各样的问题,分析一下问题和总结一下产生原因和解决方案
遇到了什么问题?
- 旁路由配置后手机无法通过旁路由上网
- 基于虚拟机的旁路由, NAS重启后配置失效
先来解决第一个问题:
路由架构图:
要注意主路由存在光缆接口和wifi接口,问题也是发生在这,下面详讲。
期望的数据流向 VS 最后的数据流向:
如下图可以看出来按照网络教程配置的都是“期望的数据流向”,只有需要“被处理”的数据才会经过旁路由返回,正常的数据流程直接通过主路由器返回, 来尽可能地体验上网体验。
但是在一定的情况下”期望的数据流向”会产生回环, 回环导致了不能上网。
为什么会产生回环呢?
假设是不需要处理的流量同时旁路由正确配置ip转发。 主机的IP为192.168.3.121 要访问的IP地址为: 203.179.28.2
正确的流量应该是:
id | 跳数 | Source IP | Destination IP | 说明 |
---|---|---|---|---|
1 | 主机 → 主路由(Wi-Fi) | 192.168.3.121 | 203.179.28.2 | 主机发送,逻辑网关是旁路由 |
2 | 主路由 → 旁路由(光缆) | 192.168.3.121 | 203.179.28.2 | 主路由转发至旁路由 |
3 | 旁路由(光缆) → 主路由(光缆) | 192.168.3.121 | 203.179.28.2 | 旁路由判断是正常流程转发回主路由 |
4 | 主路由 → 公网 | 203.179.28.1 | 203.179.28.2 | 主路由执行 SNAT |
这里需要注意2个点:
- 同一个数据包两次流经主路由(id 1和id 3)
- 同一个数据包两次流经主路由的方式不同,一次是WIFI 一次是光缆。
产生的问题是,在id2时主路由转发wifi的流程到光缆接口时检查了NAT表, NAT表有状态
。 当id2数据包流到主路由以后,产生了状态。
当id4,同一个数据包回流到主路由会发现五元组一样(Soure IP、Port、 Dest IP、Port、协议),数据包不会进行新的NAT操作,会按照已有的记录重新流回旁路由, 环路出现。
如何解决这个问题呢,
通常是要进入主路由修改Iptabls 配置, 使forward流量跳过NAT步骤, 但是家里的路由器不支持SSH和修改。 只能在旁路由开启NAT伪装。
以Openwrt为例开启NAT伪装, 只需要修改防火墙,增加NAT规则, 如下:
来解决第二个问题:
这个问题在docker 里面不存在,只存在于虚拟机。 为什么用虚拟机不用docker呢?主要是虚拟机有最干净的镜像, docker上都是一些经过修改的镜像, 不一定适合我。
问题产生的原因
出现的原因很简单, UGNAS的虚拟机是基于ISO的, 常见的Openwrt的ISO的镜像都是开机就用, 不需要安装的。 这个就产生了问题,系统没有实际安装到虚拟新建的永久盘上, 每次开机都重新从ISO中读取了配置, 导致了配置还原。
修复过程:
- 先检查虚拟机类型:连接虚拟机执行命令查看
BusyBox v1.36.1 (2025-04-15 11:38:42 UTC) built-in shell (ash)
.___ __ .__
| | _____ _____ ____________/ |______ | |
| |/ \ / \ / _ \_ __ \ __\__ \ | |
| | Y Y \ Y Y ( <_> ) | \/| | / __ \| |__
|___|__|_| /__|_| /\____/|__| |__| (____ /____/
\/ \/ BE FREE AND UNAFRAID \/
-----------------------------------------------------
ImmortalWrt 24.10.1, r33048-cc720ea55a71
-----------------------------------------------------
root@ImmortalWrt:~#
root@ImmortalWrt:~# cat /sys/class/dmi/id/sys_vendor
QEMU
- 了解到使用的是QEMU虚拟机就好办了, 直接将ISO复制到系统盘就可以了。
qemu-img convert -f raw -O qcow2 <source image> /volume1/@kvm/<虚拟机ID>/<磁盘ID>.qcow2
# volume1 是创建虚拟机时填写的磁盘名
# 磁盘ID 可以通过命令查看
root@CalvinNAS:~# virsh list --all
Id Name State
------------------------------------------------------
9 f7a64c44-6694-42e5-81e3-293df6e9aeed running
root@CalvinNAS:~# virsh dumpxml f7a64c44-6694-42e5-81e3-293df6e9aeed | grep -A 5 "<disk type='file'"
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/volume1/@kvm/f7a64c44-6694-42e5-81e3-293df6e9aeed/f7a64c44-6694-42e5-81e3-293df6e9aeed_383df052-a79a-471c-a43a-a1b48049a136.qcow2' index='1'/>
<backingStore/>
<target dev='vda' bus='virtio'/>
<boot order='1'/>
root@CalvinNAS:~#
总结:
这个问题让我重温了一下网络的内容, 还挺有意思的。