ipv6 环境下的家庭网络维护
前言
千呼万唤始出来,ipv6 终于在我这边落地了。正好赶上周末,就折腾了一下家中相关的网络配置,顺便加以记录。
路由器开启 ipv6
关于 IPv6
通常情况下,客户端会同时存在多个 IPv6 地址,一般包括:
- Loopback 地址:
::1
,等价于 IPv4 中的127.0.0.1
。 - 链路本地地址(Link Local Address):
fe80::/10
网段,只在区域中是合法地址,类似于 IPv4 中的169.254.0.0/16
。不可路由,电脑自动生成。 - 唯一区域地址(Unique Local Addresses, ULA):私有地址空间,只能用于本地通信,不可在公网路由,但支持跨子网的内网通信。和 IPv4 的专用网络地址
10.0.0.0/8
、172.16.0.0/12
和192.168.0.0/16
类似,在 RFC 4193 中定义。固定前缀是fc00::/7
,分为fc00::/8
和fd00::/8
两部分,fc00::/8
目前作为保留地址没有定义,fd00::/8
是现在使用的 ULA 地址,其中 40bit 随机生成以避免冲突,可以使用 ULA 生成工具 来生成。 - 全局地址(Global Address Type):通常意义上的公网地址,
2001::/16
。但2002:
开头的是特殊的 6to4 过渡地址,不是原生的纯 IPv6 网路地址。- 电信
240e
开头 - 联通
2408
开头 - 移动
2409
开头
- 电信
本地站点地址(Site Local Address):fec0::/10
网段,私网地址,目前在 RFC 规范中已被废弃。
此外,考虑到安全等因素,客户端会同时存在多个公网 IP 地址,一个是 SLAAC 产生的地址,基于 EUI-64 标准和网卡生成,不作为首选通信地址,即下方的 IPv6 地址;另一个是 SLAAC 产生的临时地址,用于网络通信,暴露于公网,有效期较短,用于保护隐私,即下方的临时 IPv6 地址。
ipv6 的发放模式
ipv6 有三种分配模式:
- SLAAC
- Stateful DHCPv6
- Stateless DHCPv6
因为是租房,光猫不在我控制范围内,分配到我路由器时已经是 /64
的地址了(悲),所以我这里使用 SLAAC 模式让光猫给下游设备分配 ipv6,根据 mac 随机生成后缀也相对更安全。
在我的 Openwrt 固件的图形管理页面有些配置没有,所以使用 ssh 远程到路由器,修改配置文件 /etc/config/dhcp
并重启。
这里要将 lan
和 wan6
的 ra
、dhcpv6
、ndp
三项指定为 'relay'
,即将路由器配置为中继模式。
1 |
|
ADGuard home 配置
我开启 ipv6 主要是为了在 bt/pt 时能获得更好的连接性,以及能在外访问家中的服务。当下 ipv6 建设并不完善,ipv6 优先的话有时会导致网速变慢和部分网页组件无法加载等问题,且 clash 对 ipv6 的支持并不好,所以我还是只使用 ipv4 的 dns 服务。
通过 设置 - DNS 设置 - DNS 服务配置 项,我们可以关闭 ipv6 地址解析。
勾选禁用 IPv6 地址的解析即可。

docker 容器开启 ipv6
相较于 docker 默认的 bridge 网络模式,macvlan 可以控制创建容器时的 ip 地址,方便我们针对 ip 地址进行更精细的操作。我们可以在 docker 中创建 macvlan 网络时添加参数,使之默认支持 ipv6。
注:下文提及的所有 docker 容器均使用 macvlan 网络,且获得了独立的公网 ipv6 地址。
教程
查看宿主机网卡名称
打开安装 docker 的宿主机,先查询网卡/接口名称。
执行以下命令:ifconfig
,结合 ip 地址,可以看到我这里的网卡名为 ens18
。

创建 macvlan 网络
执行以下命令创建 macvlan 网络:
1 |
|
其中,
- 第一组
--subnet
和--gateway
是 IPv4 子网段和网关,根据路由器配置进行设置; - 第二组
--subnet
和--gateway
是为 IPv6 配置的 ULA 网段,根据上面的内容,这部分是私有网段,与宿主机的 IP 设置和路由器设置无关,不会用于公网通信,因此可以自行设置。容器会自动从上级路由获取公网 IPv6 地址。 -o parent
指定了出口网卡,群晖系统一般是ovs_eth0
,需要通过ifconfig
或ip a
命令查看实际的出口网卡,还可能是en0
、eth0
等等,务必修改为正确的网卡。- 最后的
test1br0
是网络名,可以自行命名。
用该命令创建名为 test1br0
的 macvlan 网络,仅后所有用到该网络创建的 docker 容器都会有 ipv6 地址。
内网服务暴露
ipv6 流量转发
因为 ipv6 完全暴露到公网,所以默认情况下路由器会开启 ipv6 防火墙,只允许内部的设备向外访问 ipv6 地址,而不允许外部访问内部。
所以我们要配置网关的 ipv6 防火墙,对相关流量进行放行。
Openwrt 防火墙
进入 网络 - 防火墙 模块,我们可以设置 Openwrt 的防火墙。关于防火墙的详细配置可以参看这篇文章。

三个出入转发规则:当接口没有加入任何一个防火墙区域的时候,就遵循这个默认规则。
这里的出入转发都是针对路由器而言:
- 入站:数据包发送给路由器
- 出站:数据包从路由器发出
- 转发:流量终点站不是路由器,只是经路由器中转转发
配置防火墙放行 ipv6 流量
当前有两种针对 ipv6 流量的放行方式:
- 针对 ip 放行
- 针对端口放行
额外配置放行规则
通过 网络 - 防火墙 - 通信规则,我们可以自定义相关的流量规则。
匹配固定 ipv6 后缀
写法:::【需要暴露的主机的后缀】/::ffff:ffff:ffff:ffff
一般用于 dhcpv6 这种后缀固定且有规律的情况。
如你的主机 ipv6 后缀为 d09
,则目标地址应填写 ::d09/::ffff:ffff:ffff:ffff
。
transmission
公网 ipv6 对用于 bt/pt 的 transmission 十分重要。我们可以通过开放相应端口的形式使之更好地利用 ipv6。
路由器防火墙配置
我这里的 transmission 端口为 51413
,所以开放所有针对 51413
端口的流量转发。这或许太过简单粗暴,也许会有安全隐患,但是胜在方便。

使用 Shadowsocks 访问内网
因为我的 Shadowsocks 容器有独立的 ipv6 地址,所以无法通过常规的 ddns 手段更新 ipv6 地址。如果是 host 模式会简单很多。
ddns
这里使用 Openwrt 自带的 ddns-go 来更新路由器 ipv6 地址。
选择你的 dns 服务商,填好相关信息。

这里之开启 ipv6 的 ddns 服务。如下选择好,等待更新。

端口转发
选择 网络 - 端口转发,添加一条端口转发规则。
将入站的端口为 9000
的 ipv6 流量转发给本地 Shadowsocks 对应的 ip 和端口。

路由器防火墙配置
不知道为什么前面端口转发勾选的打开防火墙端口没有生效,所以这里在防火墙再开启一下相应端口的流量入站。

针对局域网内访问的优化
ADGuard home 配置 DNS 重写
因为关闭了 ipv6 的 dns 解析,我们这里设置 DNS 重写。
在 过滤器 - DNS 重写 页面,可以很方便的添加一条规则,将所有访问对 Shadowsocks 节点域名的请求转发给内网的 Shadowsocks 服务。我使用泛域名统一转发给了 Nginx Proxy Mananger
Nginx Proxy Mananger 转发流量
因为我用泛域名将所有请求转发给了 Nginx Proxy Mananger,所以这里在 Nginx Proxy Mananger 多添加一条 Stream 的转发。
因为我 Shadowsocks 服务的端口为 9000
,所以我将 9000
端口的请求再转发到内网的 Shadowsocks 服务。

结语
ipv6 还是前景可期的。虽然现在国内相关的建设还不完善,但当下也足够个人使用了。还是希望随着时间的推移,ipv6 推广也能顺利进展下去吧。
参考资料
使用 macvlan 为 Docker 配置 IPv6
【原创】 通过openwrt的IPV6中继(也叫ipv6透传),使后端设备获得原生ipv6公网地址
unraid系统下macvlan网络的docker容器使用ipv6
SLAAC 环境下的 IPv6 桥接与中继
什么是CIDR? - CIDR 块和表示法简介 - Amazon AWS
关于家庭 ipv6 网络的“裸奔”问题之我见
openwrt 防火墙解析
超详细,多图,简单,OpenWRT IPV6 端口转发 SOCAT (个人记录)
求助:ipv6端口转发
IPv6 — 动态地址配置