省流

  • 标题有点标题党了,不过对我来说,确实是终极解决方案,我们来看一下以下可能需要公网的场景
  • 如果你有呆梨相关的需求的话,建议直接关闭 IPv6,我不在主路上弄,所以不做演示。非要开 IPv6 还要进行呆梨的话,就接着往下看吧,再看看不良林的视频补全我的设置

问题

  1. 因 IPv4 公网地址数量不足,自 2020 年至今,全国各地的电信结合自身 IPv4 地址的剩余数量,已经陆陆续续不再向普通家庭用户提供公网 IPv4 地址服务,只提供动态 IPv6 地址,更别提自始至终都是大内网的移动,现在大部分地区也就联通能要到公网 IPv4 地址了

  2. 在 2023 年我曾经写过一篇文章详解如何用 xray 实现「回家」访问内网资源,实现在外网像内网一样去访问内网资源,那篇是基于 IPv4 公网的,而现在大多数地区没有 IPv4 公网只有 IPv6 公网了

  3. 有分流需求的同志对 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

常规设置

image-20241122161816117

高级设置

image-20241122161850926image-20241122161904791

防火墙设置

image-20241122162155783

DHCP 服务器

image-20241122162219446image-20241122162246486

WAN6

常规设置

image-20241122162331706

高级设置

image-20241122162356864image-20241122162406162

防火墙设置

image-20241122162430478

DHCP 服务器

image-20241122162437159

LAN

常规设置

image-20241122162531162

高级设置

image-20241122162549235image-20241122162554737

防火墙设置

image-20241122162606866

DHCP 服务器

image-20241122162617383image-20241122162627894image-20241122162633764

部署 HomeProxy

sing-box 作为网关,可以在任意 Linux 系统上部署,部署完成后将内网中各设备的网关改成它就行了。这里我们以 OpenWrt 为例吧,直接在路由端部署,简单方便

  1. 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
  2. 通过 系统 -> 软件包 -> 上传软件包 安装
  3. 服务 下找到 HomeProxy 进入

GUI 配置 HomeProxy

接下来就是具体演示如何利用 IPv6 「回家」

既然要回家,那我们得先有一个回家节点,之前写过使用 x-ui “回家”访问内网资源,可以同样操作,就是 IPv6 放端口跟 IPv4 不太一样,这次我们演示一个别的,开放端口也会同样演示

  1. 系统 -> 软件包 -> 更新列表,然后在 过滤器 中键入 shadowsocks-libev-ss-server,再在下方的 可用 中点击安装软件包image-20241202185636359image-20241202185650460

  2. 打开 SSH 端口image-20241202190224402

  3. 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
    }
  4. 创建开机启动脚本

    1
    vim /etc/init.d/shadowsocks-server

    内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/sh /etc/rc.common
    # Shadowsocks Server init script

    START=99
    STOP=10

    start() {
    ss-server -u -c /etc/shadowsocks-server.json &
    }

    stop() {
    killall ss-server
    }
  5. 赋予执行权限

    1
    chmod +x /etc/init.d/shadowsocks-server
  6. 启用并启动服务

    1
    2
    /etc/init.d/shadowsocks-server enable
    /etc/init.d/shadowsocks-server start
  7. 网络 -> 防火墙 -> 通信规则,添加规则image-20241202191754647image-20241202191811239

节点设置

在这里填入自定义的英文名称,然后点添加,把刚才设置的节点信息填入(记得保存)image-20241202192025915

客户端设置

路由设置image-20241128191623051

路由节点

依然是左下角添加,然后节点选择刚才添加的节点(记得保存)image-20241202192448519

路由规则

还是左下角添加

其他字段

出站选择刚才添加的节点image-20241202200105972

主机字段

IP CIDR 中填入需要访问的目标局域网网段image-20241202192832411

DNS 设置image-20241128191809669

保存并应用

CLI 配置 HomeProxy

先确认刚才「保存并应用」,这里应该会显示「HomeProxy 运行中」image-20241202193244790

  1. SSH 连上路由器

  2. 编辑防火墙文件

    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
    25
    set 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

  3. 重启 HomeProxy

    1
    service homeproxy restart