新买了个NAS, 安装网上教程配置旁路由存在各种各样的问题,分析一下问题和总结一下产生原因和解决方案

遇到了什么问题?

  1. 旁路由配置后手机无法通过旁路由上网
  2. 基于虚拟机的旁路由, 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个点:

  1. 同一个数据包两次流经主路由(id 1和id 3)
  2. 同一个数据包两次流经主路由的方式不同,一次是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中读取了配置, 导致了配置还原。

修复过程:

  1. 先检查虚拟机类型:连接虚拟机执行命令查看
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
  1. 了解到使用的是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:~#

总结:

这个问题让我重温了一下网络的内容, 还挺有意思的。