HE ipv6 tunnel + sing-box 去除 YouTube 广告。

背景 #

YouTube 主要根据源 IP 的位置决定是否显示广告,根据 Google 的允许投放广告的区域列表,只要不在其中的区域,基本上 YouTube 就没广告,例如中国大陆。

Hurricane Electric 提供免费的 ipv6 隧道代理,可以在只有 ipv4 的主机上配置 ipv6 地址并访问网络。这里的关键是 HE 提供的 ipv6 地理位置似乎是根据注册时选择的区域确定的,也就是说注册 HE 账号时选择什么区域,YouTube 就认为是什么区域。在 HE 论坛有相关讨论

明白了其中的原理就可以使用 sing-box 进行分流,将 YouTube 相关连接分流到 HE 隧道出站,从而实现 YouTube 去广告。

HE 隧道注册 #

进入官网注册账号,注意其中的区域:

注册后,点击左侧的Create Regular Tunnel,输入你 VPS 的 ipv4 地址检测,然后下方的Available Tunnel Servers选择离你 VPS 最近的地区接入。注意此时 VPS 需要放行ICMP入站。

创建完成后,进入详情页面,查看隧道关键信息:

  • Client/Server ipv4 Address:这是6in4隧道的 ipv4 地址对,用于承载和封装 ipv6 连接
  • Client/Server ipv6 Address:隧道的两端 ipv6 地址对,用于建立 ipv6 连接
  • Routed ipv6 Prefixes:HE 额外分配的子网前缀,用于给内网其他设备分配 ipv6 地址。上面的 ipv6 网段只能用于你和 HE 的隧道端点通信,无法给内网其他设备用。

Example Configurations中有各种系统的配置示例。

VPS 配置 #

首先确保你系统 ipv6 没有被禁用,检查以下配置:

sysctl net.ipv6.conf.all.disable_ipv6
sysctl net.ipv6.conf.default.disable_ipv6

如果你使用networking.service

## /etc/network/interfaces 
auto he-ipv6
iface he-ipv6 inet6 v4tunnel
    address 2001:470:xx:xx::2
    netmask 64
    endpoint 216.218.x.x
    local 172.24.xx.xx
    ttl 255
    gateway 2001:470:xx:xx::1

如果你使用systemd-networkd.service

## /etc/systemd/network/20-he-ipv6.netdev
[NetDev]
Name=he-ipv6
Kind=sit
MTUBytes=1480

[Tunnel]
Independent=true
Local=172.24.xx.xx
Remote=216.218.x.x
## /etc/systemd/network/20-he-ipv6.network
[Match]
Name=he-ipv6
Type=sit

[Link]
RequiredForOnline=no-carrier

[Network]
Address=2001:470:xx:xx::2/64
Gateway=2001:470:xx:xx::1

Local是指你 VPS 原本的 ipv4 地址,例如阿里云不会直接给你接口分配公网 ipv4 地址,而是私有IP地址,这里Local也需要填私有ip地址。

重启网络,然后检查 HE 的 ipv6 是否正常工作:

## 检查接口
root@debian:~# ip -6 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000
    inet6 ::1/128 scope host proto kernel_lo
       valid_lft forever preferred_lft forever
5: he-ipv6@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1480 state UNKNOWN qlen 1000
    inet6 2001:470:xx:xx::2/64 scope global
       valid_lft forever preferred_lft forever

## 检查路由
root@debian:~# ip -6 route
2001:470:xx:xx::/64 dev he-ipv6 proto kernel metric 256 pref medium
default via 2001:470:xx:xx::1 dev he-ipv6 proto static metric 1024 pref medium


## 检查ping6
root@debian:~# ping6 ipv6.google.com
PING ipv6.google.com (2404:6800:4005:817::200e) 56 data bytes
64 bytes from nchkgb-ab-in-x0e.1e100.net (2404:6800:4005:817::200e): icmp_seq=1 ttl=119 time=3.22 ms
64 bytes from nchkgb-ab-in-x0e.1e100.net (2404:6800:4005:817::200e): icmp_seq=2 ttl=119 time=3.23 ms
64 bytes from nchkgb-ab-in-x0e.1e100.net (2404:6800:4005:817::200e): icmp_seq=3 ttl=119 time=3.24 ms

## 测试本机ipv6地址
root@debian:~# curl -6 ip.sb
2001:470:xx:xx::2

sing-box 配置 #

sing-box 客户端配置,建议 YouTube 相关域名在 DNS 查询时返回fakeip,以便出站时传域名到 VPS。

sing-box 服务端配置示例:

{
    "log": {
        "disabled": false,
        "level": "warn",
        "output": "box.log",
        "timestamp": true
    },
    "dns": {
        "servers": [
            {
                "tag": "OUTDNS",
                "type": "https",
                "server": "8.8.4.4"
            }
        ]
    },
    "inbounds": [
        {
            "type": "shadowsocks",
            "tag": "ss-in",
            "listen": "0.0.0.0",
            "listen_port": 666,
            "method": "2022-blake3-chacha20-poly1305",
            "password": "xxx"
        }
    ],
    "outbounds": [
        {
            "tag": "ipv6-HE",
            "type": "direct",
            "inet6_bind_address": "2001:470:xx:xx::2",
            "domain_resolver": {
                "server": "OUTDNS",
                "strategy": "ipv6_only"
            }
        },
        {
            "tag": "DIRECT",
            "type": "direct",
            "inet4_bind_address": "172.24.xx.xx",
            "domain_resolver": {
                "server": "OUTDNS",
                "strategy": "ipv4_only"
            }
        }
    ],
    "route": {
        "rules": [
            {
                "action": "sniff"
            },
            {
                "rule_set": "geosite-youtube",
                "domain": "googleads.g.doubleclick.net",
                "outbound": "ipv6-HE"
            }
        ],
        "rule_set": [
            {
                "tag": "geosite-youtube",
                "type": "remote",
                "format": "source",
                "url": "https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/refs/heads/sing/geo/geosite/youtube.json",
                "download_detour": "DIRECT",
                "update_interval": "5d"
            }
        ],
        "final": "DIRECT"
    }
}