跳转至

便携路由器

背景

很多时候,我们想要出门在外也能方便地连入我们的内网。我最近就遇到了到朋友那玩 VR 结果串流不成功的问题。虽然理论上我可以在那慢慢配置 wireguard 啥的,但是通常一下午并没有这么多时间让我折腾。所以就在想是否可以随身携带一个便携路由器,只需要插上网线,连上 wifi 就能快速接入我的内网呢?这便对路由器提出了一些需求:

  1. 最重要的,需要便携性,能放入书包里
  2. 能刷 openwrt 跑 wireguard
  3. wifi 6
  4. 最好是主线 openwrt
  5. 性能联发科 mt7981 以上

2)和4)主要是我设想的组网方案会用到 wireguard,而一些硬件主线还没有支持(比如 360t7 和 wr30u 都是 23 下半年才支持的,我买的时候还没有)。虽然有一些第三方的 openwrt 魔改版固件,比如 QWRT,XWRT 等等。但这些系统有一些我无法接受的点,比如使用闭源 wifi 驱动,这导致无法和主线的 openwrt 组 mesh 和 fast roaming 等。另外 wireguard 需要内核模块,如果第三方固件没有的话,也没法自己安装。

3)和 5)主要是因为 VR 串流对于带宽要求是比较高的,在一些高端硬件情况下,码率设置成 500 mbps 都是可行的。我的硬件一般 60 - 100 Mbps 就够了。由于 wg 需要加解密是需要吃较多 CPU 资源的,mt7981 能够跑到 350-400 Mbps 左右(见cyyself/wg-bench: WireGuard Benchmark using netns and iperf3 (github.com))。而经典的 mt7261 MIPS SoC 则只能跑到 100 Mbps 左右就明显不够用了。因此为了保障有较好体验,wifi 6 和 mt7981 我觉得是个基准线了。

最终实现的效果

  • 设备通过 wg0 接口连接入我的内网
  • (三层接入)连接 5G wifi SSID1,被分配一个本地局域网地址 192.168.1.x,然后通过 wg0 NAT 后上网
  • (二层接入)连接 5G wifi SSID2,通过 vxlan 二层接入我的 op1 内网,获得 op1 的内网地址

测速

  • 有线 wg:420/430 (up/down,下同)
  • 无线(-60dBm signal/-90dBm noise)
    • L2: 257/320
    • L3:300/340

最后的接口示例:

设备选择

在 tuna tg 群里提问,有人推荐了 GL.iNet 3000 AT 的方案。看了下确实是我的梦中情机,体积只有一个充电宝那么大,硬件参数却非常充足,也是 mt7981 的方案,支持 wifi6,甚至还有 2.5 G 网口和 USB 3.0。最文明的还是它的 typec 供电,充电器也可以省去了,甚至可以用充电宝供电。但是看了看价格,jd 上卖 550 左右的价格。咸鱼二手价格也维持在 380 以上。感觉和 70 块的其它 mt7981 方案性价比还是低了一截。希望以后咸鱼价格能降下来吧,我觉得目前比较合理的价格应该在 200 左右。

最后我购入了 捷稀 JCG Q30 Pro,主要看重了它天线可折叠的设计(类似的设计还有 CMCC rax3000 定制版和小米 3000AT)。刚开始本来想买 cmcc rax3000(110元),但是让卖家比对了下大小后(图中是 A4 纸),发现和我的 AX6S 差不多大(感觉不太容易放进背包),因此就没买。

cmcc rax3000

jcg q30 pro 与 A4 纸对比(发现原来更大)

wg 设置

由于设备只用于临时接入内网,故不打算使用 wg_s2s 接口,而是使用 wg0 接口,就像我的其它手机、笔记本设备一样。

由于 wg 的配置网上很多了,这里就不具体将如何配置了,只提几个重点。

  • 本地监听端口不用设置,随机即可,因为是主动连接到对面。这样防火墙 input 规则也省了(conntrack 会自动允许主动向外流量的 input)
  • wg0 开启 NAT,这样设备上任意地址都可以通过 wg0 接口上网,并且两侧 allowed_ips 仅需设置 wg0 接口地址即可
    • 这里便携路由器 allowed_ips 设置了 0.0.0.0/0,因此所有上网流量会走 wg。当然也可以设置只有内网流量走 wg,其余还是通过原本的 wan 上网。

接口配置

jcg_q30p

config interface 'wg0'
        option proto 'wireguard'
        option private_key 'xxx'
        list addresses '10.0.31.103/32'

config wireguard_wg0
        option description 'op1'
        option public_key 'eVL0uj6T5wEMTs039QF9t+JtXOchHJWROCoq/4kEKlE='
        list allowed_ips '10.0.31.1/32'
        list allowed_ips '0.0.0.0/0'
        option route_allowed_ips '1'
        option endpoint_host 'op1.yfycloud.site'
        option endpoint_port '51820'
        option persistent_keepalive '25'

op1

config wireguard_wg0
        option public_key 'vXU/50/NA4tAG8fou1or1N22sZz3suCoYu/q4MkiBhE='
        option description 'jcg_q30'
        list allowed_ips '10.0.31.103/32'
        option route_allowed_ips '1'
        option persistent_keepalive '25'

防火墙

后面 vxlan 的防火墙也在这一起说明

  • lan 允许 forward 到 wan 和 wg0
    • forward wan:虽然现在默认路由走 wg0,但是说不定之后有走 wan 的分流需求
  • wg0 允许 input,因为后面 vxlan 还需要用到 input udp 4798,这样该规则也省了

关于 lan2

  • lan2 不需要 forward 到任何 zone,因为 lan2 是对端的虚拟延伸,可以看作是对端的一部分。因此最好不要和本地有太多交集,否则需要添加太多特殊路由规则。要想访问 lan2,正常通过 wg0 即可。

vxlan 设置

vxlan 的一篇好文章VXLAN & Linux (bernat.ch)

之所以选择 vxlan 而不是 gre,是因为 vxlan 支持多对多的连接,这样如果以后更换其它便携路由器,不用每次都在 op1 上增加 gre 接口。

安装

安装必要的包

opkg install kmod-vxlan luci-proto-vxlan vxlan tcpdump ip-bridge

安装后需要/etc/init.d/network restart 重启网络,luci 界面中才可以添加 vxlan 协议接口。

pve modprobe 需要的 kernel mod

如果你的 openwrt 是在 pve 里的 lxc 容器。那么可能需要让以下 mod 开机时自动加载

#/etc/module
  vxlan
  ip6_udp_tunnel
  udp_tunnel

配置

配置 vxlan 接口

vxlan 的配置也非常简单。查看 openwrt 关于具体选项的解释 [OpenWrt Wiki] Tunneling interface protocols

  • 最好绑定一个 mac 地址,不然会每次重启会发生变化
  • 设置下 mtu,因为底层 wg0 是 1420,减 50 为 1370

配置 bridge

设置好 vxlan0 接口后,需要将其和 bridge 绑定起来,这样才能和其它正常接口连接起来。

配置 lan2 接口

br-lan2 是物理设备的概念,配置 dhcp server 等还需要创建 interface。这里我们在 br-lan2 设备上创建一个 lan2 接口。

这里创建了一个 br-lan2 的设备,并在此之上创建了一个 lan2 的interface,作为 dhcp client,从 op1 那获得 ip 地址。

这里需要开启option defaultroute '0',否则 lan2 接口就会替换掉原本的默认路由。这样 lan 就无法通过 wg0 上网了。

UPDATE:lan2 接口推荐设置成 Unmanaged,这样 lan2 接口不会获得地址,因此不会生成额外的路由干扰原本的网络。

lan2 接口本质上是一条连接到 op1 的虚拟链路,因此和本系统交互越少越好。虽然这样会导致连接 lan2 会无法访问 lan。但是换来了更简单清晰的网络。

openwrt 配置文件

jcg_q30p

  • peeraddr 添加对端地址
config interface 'vxlan0'
        option proto 'vxlan'
        option peeraddr '10.0.31.1'
        option port '4789'
        option vid '8'
        option mtu '1370'
        option macaddr '12:0A:F7:78:24:B0'
        option force_link '1'

config device
        option type 'bridge'
        option name 'br-lan2'
        list ports 'lan3'
        list ports 'vxlan0'
        option mtu '1370'
        option bridge_empty '1'

config interface 'lan2'
        option proto 'none'
        option device 'br-lan2'

op1。由于要连接多个 peer,因此使用了 vxlan_peer 的格式

config interface 'vxlan0'
        option proto 'vxlan'
        option port '4789'
        option vid '8'
        option tunlink 'wg0'

config vxlan_peer
        option vxlan 'vxlan0'
        option dst '10.0.31.103'

config vxlan_peer
        option vxlan 'vxlan0'
        option dst 'xxx'   # 其它 vxlan 设备

创建多个无线 SSID

如图在 5G 设备上创建两个 SSID: JCG Q30 Pro 5G (L3)JCG Q30 Pro 5G (L2) 分别绑定到 lan 和 lan2。这样就可以通过切换 wifi 的方式切换网络了。

image.png

踩的坑

和 bridge 桥接失败

刚开始在 jcg_q30 上死活无法将 vxlan0 和新创建的 br-vxlan 桥接起来。只要一桥接,vxlan0 设备就会消失,重启 vxlan 后恢复,但是 br-vxlan 又消失。

不确定是哪些原因修复了问题,记录下做的一些改动

  • vxlan 原本绑定了接口 wg0,现在将其设置为 unspecific (op1 上也一样)
  • 删除了原本的 br-vxlan,改名为 br-lan2,勾选了 bring up empty bridge。

和无线桥接后不转发广播

将无线绑定到 lan2 网络后,发现设备没法获得 ip 地址。tcpdump 抓包,发现 phy1-ap0 上收到 dhcp request,但是没有将其从 vxlan0 口发出去。

phy-ap0 为 5G 无线对应接口

34: phy0-ap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-lan state UP group default qlen 1000
    link/ether 50:33:f0:e2:fe:9e brd ff:ff:ff:ff:ff:ff
    inet6 fe80::5233:f0ff:fee2:fe9e/64 scope link
       valid_lft forever preferred_lft forever
35: phy1-ap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-lan2 state UP group default qlen 1000
    link/ether 52:33:f0:e2:fe:9e brd ff:ff:ff:ff:ff:ff
    inet6 fe80::5033:f0ff:fee2:fe9e/64 scope link
       valid_lft forever preferred_lft forever

后面发现不知为何,无线接口 phy1-ap0 的 master 是空的。于是删除了原本的 vxlan 接口,重新创建了 lan2,然后设置无线绑定到 lan2 就好了。

MTU 问题消失?(二层套三层)

之前博客已经探讨过,如果同一个二层存在 MTU 不一致,那么会存在包因为无法分片而丢失的情况。

然后由于使用的 ARM openwrt 系统编译时可能没有开启一些 flag,导致之前让 bridge 变为 route 的 nft 命令无法运行。但是神奇的是,这次 ping 大包时居然没有出现不通的情况。经过研究,发现原因在于二层隧道套三层隧道后,底层的三层隧道会对上层的包再次分片,因而不会存在之前的问题。以下是具体抓包细节。

kvm-win10 连接了 jcg_q30p 的 wifi,获取到了 ip。使用该 ip ping op1

yfy@kvm-win10 UCRT64 ~
$ ping -S 192.168.35.135 192.168.35.1 -l 2000 -t

正在 Ping 192.168.35.1 从 192.168.35.135 具有 2000 字节的数据:
请求超时。
来自 192.168.35.1 的回复: 字节=2000 时间=1ms TTL=64
来自 192.168.35.1 的回复: 字节=2000 时间=1ms TTL=64
来自 192.168.35.1 的回复: 字节=2000 时间=1ms TTL=64
来自 192.168.35.1 的回复: 字节=2000 时间=1ms TTL=64

在 jcg_q30p 上抓包,可以发现包确实是通过 vxlan 传递到了 op1。并且设备是按照 MTU=1500 进行分片的,所以理论上 1500 的包是无法通过 MTU = 1370 的 vxlan0 的。但是结果是正确收到了 icmp reply。

14:45:02.547067 phy1-ap0 P   IP 192.168.35.135 > 192.168.35.1: ICMP echo request, id 1, seq 506, length 1480
14:45:02.547089 vxlan0 Out IP 192.168.35.135 > 192.168.35.1: ICMP echo request, id 1, seq 506, length 1480
14:45:02.547067 phy1-ap0 P   IP 192.168.35.135 > 192.168.35.1: ip-proto-1
14:45:02.547181 vxlan0 Out IP 192.168.35.135 > 192.168.35.1: ip-proto-1
14:45:02.547984 vxlan0 P   IP 192.168.35.1 > 192.168.35.135: ICMP echo reply, id 1, seq 506, length 1344
14:45:02.548031 phy1-ap0 Out IP 192.168.35.1 > 192.168.35.135: ICMP echo reply, id 1, seq 506, length 1344
14:45:02.547984 vxlan0 P   IP 192.168.35.1 > 192.168.35.135: ip-proto-1
14:45:02.548054 phy1-ap0 Out IP 192.168.35.1 > 192.168.35.135: ip-proto-1

通过在 jcg_q30p 对 wg0 接口进行抓包(vxlan 底层基于的接口),可以发现 icmp request 对应 3 个包,reply 对应 2 个包。

仔细研究后,终于理清了它们的对应关系,以下是结果。

层层封装的包的格式如下:

20         8     8       14    20          8    
ip(wg0)  | udp | vxlan | eth | ip(vxlan) | icmp | data=2000

首先在 kvm-win10 的视角,由于假设了 MTU = 1500,因此对于 ip 负载为 2008B 的 icmp 包(2000 data + 8 header),需要按照 1480 + 528 分片成两个包。各添加 20B ip header 后交给 vxlan 接口。

在 vxlan 的视角,有两个 ip 层长度分别为 1500, 548 的包要发送出去。添加了 udp + vxlan + eth 后就是 1530, 578(没有包含 ip 头部),需要交给 wg0 发出去。

在 wg0 视角,1530+20 明显超过了自己 1420 的 MTU,因此又需要分成两个包。按照 1400 分片,分为 1400 + 130 两个包。添加 wg ip header 后就是 1420 和 150。这刚好对应 wireshark 中前两个包的大小。对于另一个 578 的包则不用分片,添加 ip header 后就是 598。

可以看到 wireshark 做了很多处理。由于 vxlan 没有加密,因此 wireshark 直接展示了 vxlan 内的内容。对于第一个包,只显示了是 ip fragment,源地址后目的地址也都是 10.0.31。而收到第二个包后,由于已经可以和第一个重组成一个完整的 ip 包了(应该说是经过 vxlan 包装后的 ip 包),因此显示了 内部的地址 192.168.35。等收到第三个包时,内部的 ip 包也能够重组了,因此显示了最终的 icmp 信息。

以下显示了这种层层嵌套的关系

为什么 reply 只有两个包呢。因此 op1 上 vxlan 对应的接口 MTU 已经被设置成了 1370,因此返回时对于 2008B 的包会按照 1370 进行分片,分成两个包。这两个包加上 vxlan 开销后对于 wg0 都不会超过 MTU 大小,因此不会产生更多分片,因此只有两个包。

可能会发现 reply 包的 ip 层大小并不是 1420,而是 1414。这是因为上层按照 MTU=1370 分片时,ip 负载部分需要是 8 的倍数,因此不是 1350 而是 1344,如图中红框圈起部分。这导致加上 vxlan 开销后就是 1344 + 20 + 50 = 1414 了

额外分片测速

看看 L2 额外分片导致的性能影响,使用 iperf3 进行测速。测试 jcg_q30p 和 op1 间通过 wg 和 vxlan 时的速度。

vxlan wg
up 350 500
down 400 470
可以看到额外的分片确实造成了一定的性能影响。主要在于 jcg_q30p 上传时(jcg_q30p 负责分片)。下载影响较小。

遇到的问题

nft 命令报错

报错,但是同样的命令 x86 上的 openwrt 又没有问题。

root@JCG_Q30P ➜  ~ nft list table bridge fix_mtu
table bridge fix_mtu {
        chain c1 {
                type filter hook prerouting priority dstnat - 1; policy accept;
        }
}
root@JCG_Q30P ➜  ~ nft add rule bridge fix_mtu c1 meta iifname vxlan0 ip daddr 192.168.35.0/24 meta pkttype set host ether daddr set 9e:65:fa:e5:bb:c0 counter
Error: Could not process rule: No such file or directory
add rule bridge fix_mtu c1 meta iifname vxlan0 ip daddr 192.168.35.0/24 meta pkttype set host ether daddr set 9e:65:fa:e5:bb:c0 counter
                           ^^^^^^^^^^^^
root@JCG_Q30P ➜  ~ nft add rule bridge fix_mtu c1 ip daddr 192.168.35.0/24 meta pkttype set host ether daddr set 9e:65:fa:e5:bb:c0 counter
Error: Could not process rule: No such file or directory
add rule bridge fix_mtu c1 ip daddr 192.168.35.0/24 meta pkttype set host ether daddr set 9e:65:fa:e5:bb:c0 counter
                           ^^^^^^^^
root@JCG_Q30P ➜  ~ nft add rule bridge fix_mtu c1 meta pkttype set host ether daddr set 9e:65:fa:e5:bb:c0 counter
Error: Could not process rule: No such file or directory
add rule bridge fix_mtu c1 meta pkttype set host ether daddr set 9e:65:fa:e5:bb:c0 counter

可能是没有开启相关内核选项:linux - nftables rule: No such file or directory error - Unix & Linux Stack Exchange

也不知道如何查看开了哪些内核选项:Obtain kernel config from currently running OpenWrt system - Installing and Using OpenWrt - OpenWrt Forum

待解决

解决 MTU 问题总结

方案对比

MTU 问题:本地路由器通过 vxlan 二层隧道连接到主路由器 op1,并将 vxlan 接口桥接到以太网口和无线,从而让手机、笔记本等设备也连入 op1 的二层网络。然而,由于原本 op1 的二层 MTU 是 1500,而通过隧道的链路只有 1370(wg 1420 - vxlan 50),因此 op1 的二层出现了不同 MTU 的部分。

解决办法有两种

  • bridge 转 routing。本地路由器转发一次,对 ip 报文分片。利用 nftable bridge 命令,修改包的目的 mac 地址为本地路由器,这样本地路由器接收到包后会转发该包,过程和普通的转发包没有区别。该操作和使用 ARP Proxy 来路由不同 VLAN 间的 IP 包设备原理类似。
    • 优点
      • 对速度影响较小。多一跳路由后,MSS clamping 可以正常工作,因此可以避免 TCP 的非必要分片
    • 缺点
      • 需要设置 nft 命令,一点点复杂
      • 拉低了 op1 的 br-lan 的 MTU,需要设置成和 vxlan 一致
    • lan2 设置:设置成 dhcp client 比较好,因为转发需要有路由。lan2 有 ip 地址,会自动设置路由
  • 二层套三层。在 wg 上创建 vxlan,wg 会自动将超过理论 MTU 的包按照 wg 接口 MTU 分片
    • 优点
      • just work,不会遇到 MTU 问题
    • 缺点
      • 没有 MSS 功能,路由器上无法避免分片。分片有额外性能开销
    • lan2 设置:设置成 umanaged 即可

设置 dhcp client 注意

最好仅在 bridge 转 routing 方案中使用。否则路由会很复杂。

  • lan2 记住勾选 no default router,否则默认路由变为走 lan2 而不是 wan。
  • 添加 ip rule 使得 src lan1 到 lan2 的走 wg 接口,否则会走 main 中 lan2 /24 的路由
    # ip ru
    3:      from 192.168.36.0/24 lookup lan
    
    # ip table show lan
    192.168.35.0/24 dev wg_s2s proto static scope link
    
    # ip ro
    192.168.35.0/24 dev br-lan2 proto kernel scope link src 192.168.35.169
    

此时 lan1 访问 lan2 走 wg 接口。lan2 访问 lan2 直接通过 vxlan 接口。

设置 umanaged 注意

  • 无需额外设置
  • bridge 转 routing 方案无法使用(因为转发需要有路由)

路由均是默认的。lan2 不会对路由造成任何影响。

root@JCG_Q30P ➜  ~ ip ru
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default
root@JCG_Q30P ➜  ~ ip ro
default dev wg0 proto static scope link
10.0.31.1 dev wg0 proto static scope link
114.214.236.72 via 210.45.76.254 dev wan proto static
192.168.1.0/24 dev br-lan proto kernel scope link src 192.168.1.1

bridge 转 routing 二层抓包分析

之前《MTU的那些坑(二层隧道组网)》 博客没有从二层进行抓包分析,这里进一步分析 bridge 转 routing 方法的原理。

涉及的接口:

  • vxlan0:vxlan 接口
  • eth2:用于连接实际物理设备,如无线 AP。
  • br-lan2:将前两者桥接在一起

n5105 连接了 op2 eth2,地址为 192.168.35.183,ping 192.158.35.1 (op1) 时的抓包结果如下。

  • 包从 eth2 进入,源 mac 为 n5105(7e10),目的 mac 地址为 op1(6780)(见 tcpdump eth2)。符合局域网直接发送的情况。
  • 到达 br-lan2 时,由于 nft 规则,目的 mac 被修改成了 op2 br-lan2 的 mac 地址(9053)(见 tcpdump br-lan2)
  • op2 接收该包,发现不是给自己的,于是进入 forward 流程。
  • op2 发现 op1 位于自己 br-lan2 接口的网段,不需要路由,于是直接发送,产生一个目的 mac 为 op1 的包。
  • 包最后从 vxlan0 发出去。
  • op1 接收到包,产生 reply。由于是一个网段,因此直接发送,源 mac 为 op1,目的 mac 地址为 n5105。

image.png

分片情况下的上述实验(n5105 ping -s 2000 op1)

  • eth2 到 br-lan2 时,除了改变目的 mac 地址,还对分片进行了合并。
  • 合并后,op2 转发时再次进行分片。

image.png

这是,op2 下 lan35 设备访问 op1 下 lan35 设备时。两边都对 mac 地址进行修改的例子。 image.png

MSS

简单来说就是从哪个接口出去,MSS 就会被设置成该接口的 MTU - 40。

root@op2 ➜  ~ tcpdump -ni any tcp and 'tcp[tcpflags] & tcp-syn != 0'
tcpdump: data link type LINUX_SLL2
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
18:59:28.263559 eth1  In  IP 192.168.36.215.31229 > 192.168.35.2.2202: Flags [S], seq 772932793, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
18:59:28.263617 wg_s2s Out IP 192.168.36.215.31229 > 192.168.35.2.2202: Flags [S], seq 772932793, win 64240, options [mss 1372,nop,wscale 8,nop,nop,sackOK], length 0
18:59:28.266696 wg_s2s In  IP 192.168.35.2.2202 > 192.168.36.215.31229: Flags [S.], seq 1164402249, ack 772932794, win 64240, options [mss 1330,nop,nop,sackOK,nop,wscale 7], length 0
18:59:28.266725 eth1  Out IP 192.168.35.2.2202 > 192.168.36.215.31229: Flags [S.], seq 1164402249, ack 772932794, win 64240, options [mss 1330,nop,nop,sackOK,nop,wscale 7], length 0
root@op1 ➜  ~ tcpdump -ni any tcp and 'tcp[tcpflags] & tcp-syn != 0' and host 192.168.35.2
tcpdump: data link type LINUX_SLL2
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
19:00:17.590135 wg_s2s In  IP 192.168.36.215.31245 > 192.168.35.2.2202: Flags [S], seq 3691553873, win 64240, options [mss 1372,nop,wscale 8,nop,nop,sackOK], length 0
19:00:17.590161 br-lan Out IP 192.168.36.215.31245 > 192.168.35.2.2202: Flags [S], seq 3691553873, win 64240, options [mss 1330,nop,wscale 8,nop,nop,sackOK], length 0
19:00:17.590163 eth1  Out IP 192.168.36.215.31245 > 192.168.35.2.2202: Flags [S], seq 3691553873, win 64240, options [mss 1330,nop,wscale 8,nop,nop,sackOK], length 0

其它问题

使用 dhcp option 缓解 MTU 问题

虽然 wg 能解决 MTU 问题,但是会带来不小的损耗。(wg 层和 vxlan 层都要分片),比较好的情况是避免 wg 层的分片,前提是 vxlan 层所有设备正确设置了 MTU。

不过有些设备不会请求 dhcp mtu 选项,因此该方案对其无效。不过对于支持的设备,确实能起到优化的效果。

测速

wg 组网性能测试

测试 jcg_q30p wg 组网性能

root@JCG_Q30P ➜  ~ iperf3 -c 192.168.35.1
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec   499 MBytes   419 Mbits/sec    0             sender
[  5]   0.00-10.01  sec   497 MBytes   417 Mbits/sec                  receiver

root@JCG_Q30P ➜  ~ iperf3 -c 192.168.35.1 -R
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec   525 MBytes   440 Mbits/sec  2069             sender
[  5]   0.00-10.00  sec   522 MBytes   437 Mbits/sec                  receiver

加上 NAT:仍然是 400。iperf3 -B 192.168.1.1 -c op1.op1

和 wg-bench 测得结果相近

无线下 L2 和 L3 性能

信道影响

  • 信道是否受干扰是最影响结果的
    • 36 信道和其他冲突:平均 230(L2,下同)
    • 149 信道稍微没冲突:平均290
    • 162(AU)完全没冲突:平均 330,但是只有电脑能连,手机扫不出 wifi。
    • 以上值是信号强度大概在 -60dBm,隔了一实验室一个薄的墙
    • 最后发现设置成 CN + auto + 80MHz 即可。160 MHz 在有干扰+信号不强情况下基本上起不到作用。不设置 CN 的话,会 auto 到非法信道(比如 ,电脑可以

image_2024-09-11_17-24-09.png

设置成 160Mhz 干扰太大 image_2024-09-11_17-46-26.png

纯无线性能(直接 iperf jcg_q30p) - send:350 - receive:300 和 677 都测到过。

-60dBm

L2:257/320(up/down) L3:300/340

设置笔记本 WLAN mtu=1370 L2:270/300 L3:300/330

-65dBm

隔了一堵厚墙,信号只有 -65 dBm 的情况下,kvm-win11 测试

L3

$ iperf3.exe -B 192.168.1.135 -c 192.168.1.1
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.01  sec  71.4 MBytes  59.8 Mbits/sec                  sender
[  5]   0.00-10.06  sec  71.2 MBytes  59.4 Mbits/sec                  receiver

$ iperf3.exe -B 192.168.1.135 -c 192.168.1.1 -R
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.03  sec   200 MBytes   167 Mbits/sec    0             sender
[  5]   0.00-10.00  sec   197 MBytes   165 Mbits/sec                  receiver

$ iperf3.exe -B 192.168.1.135 -c 192.168.35.2
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.01  sec  69.0 MBytes  57.8 Mbits/sec                  sender
[  5]   0.00-10.39  sec  67.2 MBytes  54.2 Mbits/sec                  receiver

$ iperf3.exe -B 192.168.1.135 -c 192.168.35.2 -R
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.05  sec   202 MBytes   168 Mbits/sec    0             sender
[  5]   0.00-10.00  sec   198 MBytes   166 Mbits/sec                  receiver

L2

$ iperf3.exe -B 192.168.35.135 -c 192.168.35.2 -R
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.05  sec   194 MBytes   162 Mbits/sec   10             sender
[  5]   0.00-10.00  sec   191 MBytes   160 Mbits/sec                  receiver

$ iperf3.exe -B 192.168.35.135 -c 192.168.35.2
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.00  sec  71.2 MBytes  59.8 Mbits/sec                  sender
[  5]   0.00-10.08  sec  71.1 MBytes  59.2 Mbits/sec                  receiver