ipv6 环境下的家庭网络维护
前言
千呼万唤始出来,ipv6 终于在我这边落地了。正好赶上周末,就折腾了一下家中相关的网络配置,顺便加以记录。本人确实不大熟悉网络相关知识,如有错误请不吝指正。
路由器开启 ipv6
ipv6 的常见地址段有:
- 全球单播地址(也就是公网地址):
2001::/16
,电信的是240e
开头,联通2408
开头,移动2409
开头。 - 局域网地址:
fc
、fd
开头,可路由。 - 链路本地地址:
fe80
开头,不可路由,电脑自动生成。
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 地址。
基本原理
在创建 macvlan 时,只指定 ipv6 的局域网网段,但不配置 ipv6 网关。此时本 macvlan 网络创建的容器,其 ipv6 的公网地址和网关将通过 SLAAC 从路由器获得。
教程
查看宿主机网卡名称
打开安装 docker 的宿主机,先查询网卡/接口名称。
执行以下命令:ifconfig
,结合 ip 地址,可以看到我这里的网卡名为 ens18
。
创建 macvlan 网络
执行以下命令创建 macvlan 网络:
1 |
|
- 【内网 v4 网段(CIDR)】以 CIDR 格式。
如内网为从192.168.1.1
到192.168.1.255
,则写成这样的形式:192.168.0.0/24
。 - 【内网 v4 网关】即你的内网网关,一般为路由器地址。
假定网关为 192.168.1.1
,那么应写成:
1 |
|
用该命令创建名为 test1br0
的 macvlan 网络,仅后所有用到该网络创建的 docker 容器都会有 ipv6 地址。
内网服务暴露
ipv6 流量转发
因为 ipv6 完全暴露到公网,所以默认情况下路由器会开启 ipv6 防火墙,只允许内部的设备向外访问 ipv6 地址,而不允许外部访问内部。像这样如果在 bt 时,两端都开启 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 推广也能顺利进展下去吧。
参考资料
【原创】 通过openwrt的IPV6中继(也叫ipv6透传),使后端设备获得原生ipv6公网地址
unraid系统下macvlan网络的docker容器使用ipv6
什么是CIDR? - CIDR 块和表示法简介 - Amazon AWS
关于家庭 ipv6 网络的“裸奔”问题之我见
openwrt 防火墙解析
超详细,多图,简单,OpenWRT IPV6 端口转发 SOCAT (个人记录)
求助:ipv6端口转发
IPv6 — 动态地址配置