如何让 IPv6 像 IPv4 一样好用?家庭 IPv6 终极解决方案
省流
- 标题有点标题党了,不过对我来说,确实是终极解决方案,我们来看一下以下可能需要公网的场景
- 大多 P2P:只需要 NAT1 即可
- PT:其实 PT 并非强制需要你有公网 IP,事实上只需要 NAT1 即可。你在 NAT1 下连不上别人是因为 tracker 汇报的端口不对,具体可以看看这篇通过 NAT TCP 打洞使 qBittorrent 获得公网 IPv4 的连接性体验
- 异地访问:这个确实需要公网 IP,之前聊的如何用 xray 实现「回家」访问内网资源是基于 IPv4 公网的,如何利用 IPv6 公网进行异地访问是个问题,本篇文章也主要是讲了这个问题
- MC 这种明确需要主机 IP 和端口的联机游戏:需要主机有公网 IP
- 如果你有呆梨相关的需求的话,建议直接关闭 IPv6,我不在主路上弄,所以不做演示。非要开 IPv6 还要进行呆梨的话,就接着往下看吧,再看看不良林的视频补全我的设置
问题
因 IPv4 公网地址数量不足,自 2020 年至今,全国各地的电信结合自身 IPv4 地址的剩余数量,已经陆陆续续不再向普通家庭用户提供公网 IPv4 地址服务,只提供动态 IPv6 地址,更别提自始至终都是大内网的移动,现在大部分地区也就联通能要到公网 IPv4 地址了
在 2023 年我曾经写过一篇文章详解如何用 xray 实现「回家」访问内网资源,实现在外网像内网一样去访问内网资源,那篇是基于 IPv4 公网的,而现在大多数地区没有 IPv4 公网只有 IPv6 公网了
有分流需求的同志对 IPv6 应该更是抵触了,因为现在网上的规则基本都是基于 IPv4 的,IPv6 的优先级是无脑高于 IPv4 的,就会导致分流错误
解决方案
在 7 月份的时候,我写了一篇有关 sing-box 的文章,文章内提到了 sing-box 的 DNS 分流完美解决了我的 IPv6 需求,也就是上述问题 2 和 3的结合体:由于只有 IPv6 公网地址,所以在外地访问的话必须走 IPv6,那就会影响我其他的分流规则,我需要只访问某个域名的某个端口的时候走 IPv6,其余全部走 IPv4。这个问题的解决方案就是 sing-box 的 DNS 分流功能,完美解决
IPv6 设置
既然是针对 IPv6 的设置,那我们首先得有 IPv6 条件,我们以 OpenWrt 为例,「只让路由获取 IPv6 地址,不下发到内网的其他终端」,这是我们的核心思想
WAN
常规设置
高级设置
防火墙设置
DHCP 服务器
WAN6
常规设置
高级设置
防火墙设置
DHCP 服务器
LAN
常规设置
高级设置
防火墙设置
DHCP 服务器
部署 HomeProxy
sing-box 作为网关,可以在任意 Linux 系统上部署,部署完成后将内网中各设备的网关改成它就行了。这里我们以 OpenWrt 为例吧,直接在路由端部署,简单方便
- 以 immortalwrt 分支为例,下载对应版本的 HomeProxy,即 sing-box 在 OpenWrt 上的第三方 GUI,例如 x86 23.05 版本的本体 luci-app-homeproxy_git-24.238.29320-de2cf6f_all.ipk 和中文包 luci-i18n-homeproxy-zh-cn_git-24.238.29320-de2cf6f_all.ipk
- 通过
系统
->软件包
->上传软件包
安装 - 在
服务
下找到HomeProxy
进入
GUI 配置 HomeProxy
接下来就是具体演示如何利用 IPv6 「回家」了
既然要回家,那我们得先有一个回家节点,之前写过使用 x-ui “回家”访问内网资源,可以同样操作,就是 IPv6 放端口跟 IPv4 不太一样,这次我们演示一个别的,开放端口也会同样演示
系统
->软件包
->更新列表
,然后在过滤器
中键入shadowsocks-libev-ss-server
,再在下方的可用
中点击安装软件包打开 SSH 端口
SSH 连上路由器,创建配置文件
1 vim /etc/shadowsocks-server.json内容如下:
1
2
3
4
5
6
7
8 {
"server":["[::0]","0.0.0.0"],
"server_port":12345,
"password":"12345678",
"timeout":60,
"method":"aes-256-gcm",
"fast_open":true
}创建开机启动脚本
1 vim /etc/init.d/shadowsocks-server内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
# Shadowsocks Server init script
START=99
STOP=10
start() {
ss-server -u -c /etc/shadowsocks-server.json &
}
stop() {
killall ss-server
}赋予执行权限
1 chmod +x /etc/init.d/shadowsocks-server启用并启动服务
1
2 /etc/init.d/shadowsocks-server enable
/etc/init.d/shadowsocks-server start
网络
->防火墙
->通信规则
,添加规则
节点设置
在这里填入自定义的英文名称,然后点添加,把刚才设置的节点信息填入(记得保存)
客户端设置
路由设置
路由节点
依然是左下角添加,然后节点选择刚才添加的节点(记得保存)
路由规则
还是左下角添加
其他字段
出站选择刚才添加的节点
主机字段
IP CIDR 中填入需要访问的目标局域网网段
DNS 设置
保存并应用
CLI 配置 HomeProxy
先确认刚才「保存并应用」,这里应该会显示「HomeProxy 运行中」
SSH 连上路由器
编辑防火墙文件
1
vim /etc/homeproxy/firewall_post.ut
这里面有一段规定了一些网段会直接放掉
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25set homeproxy_local_addr_v4 {
type ipv4_addr
flags interval
auto-merge
elements = {
0.0.0.0/8,
10.0.0.0/8,
100.64.0.0/10,
127.0.0.0/8,
169.254.0.0/16,
172.16.0.0/12,
192.0.0.0/24,
192.0.2.0/24,
192.31.196.0/24,
192.52.193.0/24,
192.88.99.0/24,
192.168.0.0/16,
192.175.48.0/24,
198.18.0.0/15,
198.51.100.0/24,
203.0.113.0/24,
224.0.0.0/4,
240.0.0.0/4
}
}在这里面找到自己异地的网段,删去保存即可,比如我异地的网段为
192.168.31.0/24
,就删去192.168.0.0/16
重启 HomeProxy
1
service homeproxy restart