发表于

软路由远程访问提速:SMB压缩与50M上行优化实战

Authors

流畅的远程办公和文件访问是许多玩家折腾软路由的终极目标。但当家庭宽带只有50Mbps上行时,直接通过SMB/NFS进行远程挂载的体验往往不尽人意。本文是我在这一限制下,通过对网络协议、存储端和传输层进行立体式优化,最终实现NAS提速的实战记录。

一个展示网络架构优化的拓扑图,中心是软路由

核心优化:榨干50M上行带宽

我们的核心目标是在有限的带宽下,最大化远程挂载的吞吐量和响应速度。我采用了“协议调优 + 存储提速 + 传输压缩”的三位一体方案。

1. 网络协议栈调优 (BBR 算法)

Google BBR 是一种现代化的TCP拥塞控制算法,在高延迟、有一定丢包的互联网环境下,它通常能比传统算法获得更高的有效吞吐量。对于我们的软路由来说,这是最基础的优化。

  • 在基于 OpenWrt 的软路由中启用 BBR:

    # 登录 SSH
    
    # 1. 检查内核是否支持 BBR
    sysctl net.ipv4.tcp_available_congestion_control
    # 如果输出中包含 bbr,则支持
    
    # 2. 编辑 sysctl 配置文件
    vi /etc/sysctl.conf
    
    # 3. 在文件末尾添加以下行
    net.core.default_qdisc=fq
    net.ipv4.tcp_congestion_control=bbr
    
    # 4. 保存退出后,应用配置
    sysctl -p
    

我的建议: 启用BBR后,务必使用 iperf3 在远程和本地之间进行实际测速,对比启用前后的带宽、延迟和丢包率。只有数据才能证明BBR对你的网络环境是正优化。详情可参考 BBR的官方文档

2. 存储设备性能优化 (NAS 提速)

我使用的NAS是群晖 DS920+,针对它的优化是实现NAS提速的关键一环。

  • RAID 策略: 对于需要高读写性能的目录(如视频剪辑素材),我采用 RAID 0;对于需要数据冗余安全的文档,则采用 RAID 5
  • 文件系统与缓存: 我将文件系统格式化为 Btrfs,并加装了两条 NVMe SSD 作为元数据缓存。这将频繁访问的小文件索引和元数据放在了高速SSD上,极大地降低了机械硬盘的寻道时间,对大量零散文件的远程挂载场景,效果尤其明显。

3. 传输层数据压缩 (SMB 压缩)

这是本次优化中最具性价比的一步。通过启用 SMB压缩,可以在数据离开软路由前进行实时压缩,有效减少网络传输的数据量,尤其对文本、代码等可压缩比高的文件效果显著。

  • 启用 Samba 协议压缩:

    如果你的 Samba 版本支持(Samba 4.1.0+),可以在软路由的 /etc/samba/smb.conf 文件中为共享目录添加 smb compression = lz4。LZ4是一种极快的压缩算法,对CPU的额外开销很小。

    [global]
    ...
    smb encrypt = required
    
    [YourShare]
    path = /mnt/data
    ...
    smb compression = lz4
    

注意: SMB压缩 需要客户端和服务端同时支持。目前 Windows 11 已原生支持,是绝佳的搭配。

附加优化:智能电源与资源管理

在解决了核心的性能问题后,我还通过软路由对内网设备进行了电源和资源管理,以降低能耗和硬件损耗。

技术实现:

  1. 网络唤醒 (Wake-on-LAN, WOL): 通过在软路由上安装 etherwake,可以按需唤醒处于关机或休眠状态的PC或NAS。

  2. 定时任务 (Cron Job): 设置工作日PC自动开关机,或深夜NAS自动休眠。

    # 每天早上 8:55 唤醒办公电脑 (MAC: 00:1A:2B:3C:4D:5E)
    55 8 * * 1-5 /usr/bin/etherwake 00:1A:2B:3C:4D:5E
    
  3. 闲置资源自动回收: 通过在软路由上部署一个Python脚本,监控特定设备的网络流量,当设备持续闲置超过阈值(如30分钟)后,自动执行关机命令。

    # 这是一个简化版的概念脚本
    import time, os
    from scapy.all import sniff
    
    IDLE_THRESHOLD_MINUTES = 30
    TARGET_IP = "192.168.1.100"
    last_activity_time = time.time()
    
    def packet_callback(packet):
        global last_activity_time
        if packet.haslayer('IP') and (packet['IP'].src == TARGET_IP or packet['IP'].dst == TARGET_IP):
            last_activity_time = time.time()
    
    def monitor():
        sniff(filter=f"host {TARGET_IP}", prn=packet_callback, store=0, stop_filter=lambda p: False)
        while True:
            if (time.time() - last_activity_time) / 60 > IDLE_THRESHOLD_MINUTES:
                # os.system("ssh user@192.168.1.100 'sudo poweroff'")
                break
            time.sleep(60)
    

总结与注意事项

  • 实测为王: 任何优化(BBR, SMB压缩)都必须基于 iperf3 等工具的实际测试结果来决策,切勿盲从。
  • 安全第一: 远程访问务必配合强密码、二次验证和访问控制策略。
  • 分步实施: 任何变更都应逐项进行,并观察系统资源变化,以便在出现问题时快速定位和回退。