释放小七猫的分享欲

Linux 系统的 NAS 之路——网络

tags: NAS, Linux
@ 16/07/2026

Linux 系统的 NAS 之路——网络

固定 IPv4

IPv4 有两种固定方式,一个是在 NAS 上直接配置静态 IP,一个是在路由器中配置静态 DHCP。

我比较推荐路由器中配置。

Cockpit 固定 IPv4

在图上位置可以配置固定 IP

路由器中配置静态 DHCP

以 OpenWRT 为例,在网络->DHCP 处可以添加静态 IP 租约,租约的时间选长一点即可,不一定要选永久,某些版本的 OpenWRT 存在永久租约无法删除的 BUG。

EUI-64 固定 IPv6 后缀

IPv6 后缀固定与 IPv4 正好相反,推荐在设备上进行设置,因为如果把所有设备都启用 EUI-64 的话,会影响整个网络的安全性。

一般的路由器都会给设备下发 2-3 个公网 IPv6 地址:

  1. SLAAC-IPv6 地址,全球单播,别人访问你用这个
  2. SLAAC-临时 IPv6 地址,全球单播,你访问别人用这个,会变化,安全
  3. DHCPv6-IPv6 地址,如果 DHCPv6 服务器下发的地址,便于管理但长度比较短,安全性不佳
   IPv6 地址 . . . . . . . . . . . . : 2409:8961:3171:b448:552d:adb7:fc28:aba9
   IPv6 地址 . . . . . . . . . . . . : 2409:8961:3171:b448::3e9
   临时 IPv6 地址. . . . . . . . . . : 2409:8961:3171:b448:c48d:c88a:3716:5f8a

DHCPv6 下发的地址是路由器生成的,我们管不着,但 SLAAC 是由设备自己生成的,所以可以在设备上进行控制,我们要做的就是把 IPv6 地址和临时 IPv6 地址合并成一个固定后 64 位的地址。

针对 NetworkManger 管理的系统,只需:

nmcli c找出需要修改的网口 NAME,比如是 enp2s0,

执行nmcli c show enp2s0 | grep addr-gen-mode查看原来的模式。

执行nmcli c modify enp2s0 ipv6.addr-gen-mode eui64,改为 eui64 模式。

重启网络即可重新获取固定后缀的 IPv6 地址

sudo systemctl restart NetworkManager

桥接网卡

Cockpit 中的网络模块可以直接配置桥接网卡

额外讲解一下"网桥"这个设备。首先,物理设备"网桥"已经几乎被更先进的交换机取代,网桥的作用是把一个 P2P 的网络连接成一个中心化的网络,减少物理网络中的连线(假设设备数为 n,网桥可以把连接数从 n(n-1)/2 减少到 n+1)。对于现代网络,就把网桥理解成交换机就行了,功能类似。

在图中,我们添加了一个名为 bridge0 的网桥,并把物理接口 enp2s0(只能接入一个外部接口,不能同时勾选 enp2s0 和 enp4s0)接入这个网桥,其他加入网桥的设备就像插在一个虚拟交换机上面一样。因此,把虚拟机的虚拟网卡加入这个网桥,就像直接连了一根虚拟网线到接到了路由器上一样。

生成树协议可以避免环网带来的网络风暴,一般不会勾选。

链路聚合

如果有两个以上的网口,且网口速率对称(相同),可以配置链路聚合,叠加两个接口的带宽,从而实现更高速率的传输,有点类似 RAID 0。但要使用链路聚合,条件比较苛刻。

链路聚合叠加的是多会话总带宽,单个 TCP 连接仍然受限于单一口的速率。只有多个客户端同时访问 NAS 时才能体现叠加效果。

Cockpit 的坑

cockpit 的网络模块支持 bond 网卡,理论上可以通过管理页面进行主备模式和链路聚合的配置,但我在实际使用过程中发现 bug 很多,配置容易出错,因此还是用命令行调整更好。

前提条件

  • 至少两个同速率网口 — 1GbE 和 2.5GbE 混搭无法聚合,速率必须一致
  • 交换机支持并已配置 — 最理想的模式 802.3ad(LACP)需要交换机端也配置对应的聚合组。没有管理型交换机可以用 balance-xor 或 balance-rr 模式,无需交换机配合
  • 建议同一网卡上的端口 — 跨不同 PCIe 总线可能引入延迟差异,同一张多口网卡最稳定

Bond 模式选择


模式 名称 需要交换机配合 适用场景


mode=4 802.3ad (LACP) 是 有管理型交换机,稳定性最佳

mode=2 balance-xor 否 普通千兆交换机也能用,按哈希分发

mode=0 balance-rr 否 轮询发包,可能乱序,不推荐

家庭 NAS 环境首选 mode=4(LACP),需要一台支持链路聚合的交换机并正确配置聚合组。如果交换机不支持,退而求其次用 mode=2(balance-xor)。

使用 nmcli 配置

查看当前网口名称,确认两个网口都在:

nmcli device status

假设两个网口为 enp2s0 和 enp4s0,创建 bond 接口并绑定:

# 创建 bond 接口,模式为 802.3ad
sudo nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=802.3ad,miimon=10000"

# 将两个从属接口加入 bond
sudo nmcli connection add type bond-slave con-name bond0-port1 ifname enp2s0 master bond0
sudo nmcli connection add type bond-slave con-name bond0-port2 ifname enp4s0 master bond0

# 给 bond 接口配置 IP
# 这里开始可以用各种方式配置了,可以直接用网页配置

# 激活 bond
sudo nmcli connection up bond0

miimon=10000 表示每 10000 毫秒检测一次链路状态可以根据实际情况调大或调小。

验证聚合是否生效

# 查看 bond 状态
cat /proc/net/bonding/bond0

输出中可以看到两个从属接口都处于 MII Status: up,说明聚合成功。用 iperf3 多线程测试也能确认带宽是否叠加。

主备模式

如果有两个以上的网口,并且网口速率不对称(不相同),可以配置主备模式,当主网口出现问题时,可以自动切换到备用网口,避免直接断网。

与链路聚合的区别

特性 链路聚合 主备模式


网口速率 必须相同 可以不同 带宽 叠加(多会话) 只有一条链路工作 容错 一条断线后降速 自动切换备用口 Bond 模式 mode=4 / mode=2 mode=1(active-backup)

链路聚合更像 RAID 0,主备模式更像 RAID 1。

使用 nmcli 配置

假设两个网口为 enp3s0(10GbE,做主)和 enp5s0(1GbE,做备):

# 创建 active-backup bond
sudo nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=active-backup,miimon=30000,primary=enp3s0"

# 将两个网口加入 bond(先加主口)
sudo nmcli connection add type bond-slave con-name bond0-port1 ifname enp3s0 master bond0
sudo nmcli connection add type bond-slave con-name bond0-port2 ifname enp5s0 master bond0

# 配置 IP
# 省略

# 激活
sudo nmcli connection up bond0

miimon=30000 表示每 30000 毫秒检测一次链路状态。默认是 100ms,家庭网络建议调大,减少误切。

primary=enp3s0 指定了主接口,只要主口在线就一直用它;主口断线后自动切换到备用口,主口恢复后自动切回。

验证与手动测试

# 查看 bond 状态,确认主备关系
cat /proc/net/bonding/bond0

输出中会显示 Currently Active Slave: enp3s0。

手动拔掉主口的网线,再执行同样的命令,应该看到:

  • Currently Active Slave: enp5s0(自动切换到备用口)
  • 此时 NAS 依然在线,ping 不会中断超过几秒

插回主口网线,稍等几秒后自动切回 enp3s0。

其他功能

主要包括 VPN、组合(与 bond、绑定差不多,现已几乎弃用),VLAN。

整体来说,cockpit 的网络功能非常完善,理论上可以直接修改的功能非常多,但由于 BUG 的原因,部分功能还是要通过命令行来修改。