外观
IPv6
读完这一篇,你能决定自己的 NAS 要不要开 IPv6,在 网络 → 接口(Network → Interfaces)里把它配好,并且知道开了之后哪些服务会跟着在 IPv6 上可达、怎么检查和收紧。
先问:真的要开吗
大多数家庭 NAS 只用局域网里的 IPv4 就够了,OMV 的接口也是这样默认的:新建接口时 IPv6 的方式是禁用。下面几种情况才值得开:
- 运营商给了 IPv6,你想用它从外面访问 NAS,尤其是 IPv4 在运营商级 NAT(CG-NAT)后面时。
- 网络是 IPv6 为主,或客户端优先走 IPv6,你想让 NAS 也在 IPv6 上可达。
- 在学习和测试。
不需要就保持禁用,少一个暴露面。
IPv6 没有 NAT:全局地址可能被互联网直接访问
- 影响范围:IPv4 家庭网络里,NAT 天然挡住了大部分入站连接。IPv6 里,设备拿到的全局单播地址(以 2 或 3 开头)本身就能被路由,能不能被外面连到,只取决于路由器的 IPv6 防火墙。启用后,NAS 上所有监听在所有地址上的服务(Web 界面、SSH、SMB 等)在 IPv6 上同样可达。OMV 防火墙的 IPv4 和 IPv6 规则是分开的,没有任何 IPv6 规则时,OMV 不会改动 IPv6 的过滤链。
- 前置条件:先在路由器里确认它有 IPv6 防火墙,并且默认阻止入站;知道哪些服务在监听(见下文);管理界面和 SMB 本来就不该暴露,见 远程访问:别把 NAS 直接暴露到公网;手边有本机控制台,网络变更可能让连接中断。
- 怎么回退:回到
网络 → 接口,把 IPv6 的方式改回 禁用,保存并应用;失联时到控制台,用omv-firstaid恢复,见 改坏网络后怎么救。
OMV 里的四种方式
网络 → 接口(Network → Interfaces)→ 选中接口 → 编辑(Edit),页面里有 IPv4 和 IPv6 两部分。IPv6 的 方式(Method)有四个选项,下表的「netplan 里的效果」来自 OMV 生成配置的模板:
| 方式 | netplan 里的效果 | 适合 |
|---|---|---|
| 禁用(Disabled,默认) | dhcp6: false,不设置路由通告;link-local 里不含 IPv6,接口不会获得 IPv6 链路本地地址 | 不用 IPv6 |
| DHCP | dhcp6: true,同时 accept-ra: true | 网络提供 DHCPv6。DHCPv6 不下发默认路由,所以还要接受路由通告 |
| 自动(Automatic) | accept-ra: true,dhcp6: false | 靠路由器的路由通告(RA)做无状态地址自动配置(SLAAC),家庭网络最常用 |
| 静态(Static) | 写入你填的地址和前缀,accept-ra: false,并添加一条默认路由 ::/0 指向你填的网关 | 要固定地址 |
静态方式要填的字段:地址(Address)、前缀长度(Prefix length,默认 64)、网关(Gateway),以及路由的 指标(Metric,IPv6 默认 1)。网关常用路由器的链路本地地址(fe80:: 开头),可以在路由器上查,或在已经有 IPv6 的设备上看 ip -6 route。DNS 服务器 在下面的高级设置里,可以填 IPv6 的地址。
OMV 7.3.1 起不再启用 IPv6 隐私扩展,所以自动方式得到的地址是稳定的,不会像桌面系统那样定期换临时地址。这对要固定对外身份的服务器是好事,但也意味着这个地址可以被长期追踪。
启用之后,哪些服务会监听 IPv6
OMV 的 Salt 状态把「至少有一个非 lo 的接口带 IPv6 地址(包括链路本地地址)」当作 IPv6 已启用,据此调整一部分服务的配置:
| 服务 | 随 IPv6 状态的变化 |
|---|---|
| Web 界面(nginx) | 启用后同时监听 [::]。监听地址由环境变量 OMV_NGINX_SITE_WEBGUI_LISTEN_IPV4_ADDRESS(默认 *)和 OMV_NGINX_SITE_WEBGUI_LISTEN_IPV6_ADDRESS(默认 ::)决定 |
| Postfix(邮件通知) | IPv6 关闭时设成只用 IPv4 发信(inet_protocols = ipv4) |
| TFTP | IPv6 关闭时给服务加 --ipv4 参数 |
| UPS(NUT)、OwnTone | 配置里也有按 IPv6 状态切换的部分,OwnTone 对应 ipv6 = yes 或 no |
| 局域网发现(Avahi) | 只要有接口的 IPv6 方式不是禁用,就发布 IPv6 |
这个判断看的是系统里所有非 lo 的接口,不只是 OMV 里配置过的。按源码推断,装了 Docker 的机器上,容器的虚拟网卡带着链路本地地址时,即使你在 OMV 里把所有接口的 IPv6 都禁用了,这个判断也可能为真,Web 界面照样监听 [::],这一点没有在实机上验证过,待核实。没有全局地址时,这些监听是无害的。
还有一批服务不依赖这个判断,默认就监听所有地址,IPv6 一出现就跟着可达:
- SSH:
AddressFamily默认是any,环境变量OMV_SSHD_ADDRESSFAMILY可以改。 - SMB:OMV 生成的 Samba 配置没有限制监听的接口。
- 其他服务按各自的默认值。
环境变量的用法见 环境变量。结论很简单:开了 IPv6 以后,要把它当作一个新的网络来检查,而不是 IPv4 的附属品。
配置步骤(以自动方式为例)
- 先确认路由器已启用 IPv6,并且在发路由通告。别的设备能拿到全局 IPv6 地址,说明网络是通的。
网络 → 接口→ 选中接口 → 编辑,IPv6 的 方式 选 自动。IPv4 部分不要动。- 保存,点黄色提示条上的应用。应用会重新执行
netplan apply,当前的 Web 和 SSH 连接可能中断几秒,回来后重新登录。
检查结果
在 OMV 的 shell(root)里,只读确认:
sh
# 在 OMV 的 shell 里执行(root)
ip -6 addr show scope global # 应有以 2 或 3 开头的全局地址
ip -6 route # 应有一条 default via fe80::... 的默认路由
ping -6 -c 3 <一个有 IPv6 的主机名> # 能通说明 IPv6 出口可用
ss -6 -tlnp # 列出在 IPv6 上监听的服务,逐个确认你知道它是谁再检查从外面能不能连进来。这一步最容易被忽略:
- 找一台不在你家网络里、有 IPv6 的机器(例如用手机的移动数据开热点给电脑)。
- 在它上面运行:
sh
# 在家以外的客户端电脑上执行。把 <NAS 的 IPv6 地址> 换成 NAS 的全局地址
curl -6 -m 5 -I http://[<NAS 的 IPv6 地址>]/连不上或超时,说明路由器的 IPv6 防火墙在挡着,这是你想要的结果。能连上,Web 界面就暴露在互联网上了,先去路由器里收紧,再回来继续。
防火墙怎么做
- 路由器是第一道门。绝大多数路由器的 IPv6 防火墙默认拒绝入站,但名称、位置各不相同,有的还有「允许所有入站」「DMZ」之类的开关,逐项核对。
- OMV 的防火墙在
网络 → 防火墙 → 规则(Network → Firewall → Rules),有 IPv4 和 IPv6 两个标签,规则分开写,做法和注意事项见 防火墙规则。OMV 在应用时,只有存在对应系列的规则,才会清空并重建那一族的输入和输出链;IPv6 标签里一条规则都没有,Debian 默认就是全部放行。 要限制 IPv6 入站,必须在 IPv6 标签里写规则,并且先放行自己的管理入口,避免把自己锁在外面。 - 内网用的 IPv6(链路本地、
fd开头的唯一本地地址)不会被互联网路由,风险小得多。要小心的是以 2 或 3 开头的全局地址。
域名和地址会变
- 多数家庭宽带的 IPv6 前缀会变。静态地址在前缀变了之后就不通了,自动方式会自己拿到新地址,但你记下来的地址、写进域名的 AAAA 记录要跟着更新。
- 给域名加 AAAA 记录,就是在告诉全世界走 IPv6 来找你,加之前先把防火墙做好。
常见问题
应用后接口没有 IPv6 地址。 路由器没有发路由通告,或没启用 IPv6;方式选成了禁用;或者网线、交换机上有设备过滤了 RA。先在别的设备上确认网络本身有 IPv6。
有地址,但 ping -6 不通。 看有没有默认路由 ip -6 route;自动方式依赖路由通告,静态方式要自己填网关。
想完全关闭 IPv6。 把所有接口的 IPv6 方式都设成 禁用。OMV 的「禁用」是不给接口配置 IPv6,包括不分配链路本地地址,不是内核级的关闭开关。
开了 IPv6 之后,容器端口是否也对 IPv6 开放? 取决于 Docker 的版本和设置,不要猜,开启 IPv6 之后用 ss -6 -tlnp 检查,再决定是否要在 OMV 防火墙里补规则。
SMB 或 Web 界面在 IPv6 上能访问,但不想让它能。 不用 IPv6 的接口保持禁用;Web 界面可以用上面的环境变量只监听 IPv4。
参考资料
- OMV 源码:
omv_utils.is_ipv6_enabled、netplan 模板ethernet.j2 - netplan 文档中
dhcp6、accept-ra、link-local一节 - 本章:网络接口:DHCP、静态 IP 与 DNS、自定义网络配置