Aside0's AI Blog

纯AI生成的折腾日记,保证无手打!
  1. 首页
  2. 网络
  3. 正文

树莓派 Xray DNS 防泄露和游戏下载分流

2026年6月20日 22点热度 0人点赞 0条评论
日期:2026-06-20

公开版说明:本文保留配置结构、排查路径和关键判断,真实内网地址、客户端 IP、Xray 出站 tag、代理节点地址和下载时出现的具体客户端端口均已替换为示例值。

这份文档是前一篇树莓派 Wi-Fi 热点和 Xray 透明代理文章的后续。热点、tproxy、dnsmasq 都已经能跑起来以后,又遇到两个更细的问题:

```text
DNS 看起来都进了树莓派,但树莓派自己仍然可能向上游路由器泄露一部分解析
游戏平台、商店和账号页面需要走代理,但游戏下载 CDN 不想走代理
```

这两个问题不能只靠一句“国内直连,国外代理”解决。DNS、Xray 路由、透明代理 sniff、游戏平台域名和下载 CDN 域名要分开看。

最后采用的方案是:

```text
客户端 DNS 统一交给树莓派上的 dnsmasq
dnsmasq 不直接问公网 DNS,而是转发给 Xray DNS 入站
Xray DNS 对国内域名和游戏下载 CDN 使用本地上游 DNS
Xray DNS 对其他域名使用 Cloudflare DoH,并通过代理出站
Xray 路由中,游戏平台主域名走代理
Xray 路由中,游戏下载 CDN 域名走 direct
Xray routing.domainStrategy 使用 AsIs,避免本机二次解析导致 DNS 泄露
代理节点地址用 IP 固化,避免启动和重连时再向路由器解析节点域名
```

这里的关键不是“Steam 走直连”或“Steam 走代理”,而是拆成两类:

```text
Steam 商店、社区、登录、平台 API:走代理
Steam 游戏内容下载 CDN:走直连
```

PlayStation、Xbox、Nintendo Switch、Epic Games 也是同一个思路。

## 相关折腾记录

- [树莓派 Wi-Fi 热点接入 Xray:DNS 防污染和透明代理排查](https://aside0.me/raspberry-pi-wifi-hotspot-xray-dns-2026-06-19/)
- [树莓派 Tailscale Exit 与 Xray 透明代理配置整理](https://aside0.me/raspberry-pi-tailscale-xray-2026-06-15/)
- [Cloudflare Tunnel 通过 Xray 出口:cloudflared、nftables 和 sniffing 排查](https://aside0.me/cloudflared-tunnel-xray-sniff-nft-2026-06-17/)

## 最终拓扑

DNS 链路是这样:

```mermaid
flowchart LR
  client["客户端<br/>手机 / PC / 游戏主机"]
  dnsmasq["dnsmasq<br/>192.168.10.20:53<br/>10.42.0.1:53"]
  xray_dns["Xray DNS 入站<br/>127.0.0.1:5354"]
  local_dns["本地上游 DNS<br/>192.168.10.1:53"]
  doh["Cloudflare DoH<br/>cloudflare-dns.com"]
  proxy["Xray 默认代理出站"]

  client --> dnsmasq
  dnsmasq --> xray_dns
  xray_dns -->|"geosite:cn / 下载 CDN"| local_dns
  xray_dns -->|"其他域名"| proxy
  proxy --> doh
```

普通连接链路是这样:

```mermaid
flowchart LR
  client["客户端流量"]
  nft["nftables TProxy"]
  xray["Xray routing"]
  direct["direct<br/>本地出口"]
  proxy["default proxy<br/>代理出口"]

  client --> nft
  nft --> xray
  xray -->|"游戏下载 CDN / geoip:cn"| direct
  xray -->|"游戏平台 / Google / YouTube / 默认"| proxy
```

两个判断点要分清:

```text
DNS 走哪里:决定解析结果和 CDN 调度
连接走哪里:决定真实下载或访问流量是否经过代理
```

游戏下载速度慢时,很多时候不是连接层没直连,而是 DNS 用了远端 DoH,拿到了离代理出口更近、离你家宽更远的 CDN。下载 CDN 域名用本地 DNS 解析,往往比只在连接层 direct 更重要。

## DNS 泄露是怎么发现的

一开始看客户端抓包,客户端并没有直接问外部 DNS。客户端 DNS 是发给树莓派的:

```text
客户端 -> 192.168.10.20:53
客户端 -> 10.42.0.1:53
```

这说明客户端侧没有绕开 dnsmasq。

但在树莓派的 `eth0` 上继续抓包时,能看到树莓派自己向路由器发 DNS 查询:

```text
192.168.10.20 -> 192.168.10.1:53 A? cloudflare-dns.com
192.168.10.20 -> 192.168.10.1:53 A? proxy-node.example.com
```

这不是客户端直接泄露,而是树莓派侧泄露。常见来源有两个:

```text
Xray 使用 IPIfNonMatch 时,为了把域名解析成 IP 再匹配 geoip 规则,会调用本机 DNS
Xray 出站节点地址如果写成域名,启动或重连时需要先解析这个节点域名
```

这类泄露很隐蔽,因为普通客户端抓包看起来是干净的,Xray 访问日志也会显示最终访问 `cloudflare-dns.com:443` 走了代理。但在这之前,`cloudflare-dns.com` 这个名字本身可能已经被本地路由器解析过。

检查方法:

```bash
sudo tcpdump -ni eth0 'src host 192.168.10.20 and (udp port 53 or tcp port 53 or port 853)'
```

如果看到树莓派自己向 `192.168.10.1:53` 查询代理节点域名、DoH 域名或国外站点域名,就说明还有本机侧 DNS 泄露。

## 为什么改成 AsIs

Xray 的 `routing.domainStrategy` 有几个常用取值。这里最容易踩坑的是 `IPIfNonMatch`。

`IPIfNonMatch` 的逻辑是:

```text
先用域名规则匹配
如果没有命中,就解析域名成 IP
再用 IP 规则匹配一轮,例如 geoip:cn
```

它的好处是域名请求也能落到 `geoip:cn` 这类 IP 分流规则里。坏处是它可能触发本机 DNS 解析。如果本机 DNS 仍然来自路由器或运营商,就会出现 DNS 泄露。

最终这里改成:

```json
{
  "routing": {
    "domainStrategy": "AsIs"
  }
}
```

`AsIs` 的意思是:Xray 不主动为了 IP 规则去二次解析域名。它只使用目标里已有的域名,或者 sniff 到的 SNI / Host 做域名规则匹配。

这个选择有代价:

```text
本地 SOCKS 里传进来的域名,如果没有命中 geosite,就不会再解析成 IP 去匹配 geoip:cn
```

但对这台树莓派的透明代理场景,这个代价可以接受:

```text
tproxy 进来的大多数连接已经是客户端解析后的 IP
Xray 仍然可以用 geoip:cn 匹配这些 IP
HTTP/TLS/QUIC 能 sniff 到域名时,仍然可以用 geosite 匹配
默认规则仍然是代理,不会因为 AsIs 直接漏出去
```

更重要的是,`AsIs` 让 Xray 不再为了路由判断偷偷问本机 DNS,DNS 泄露面明显变小。

## 节点域名也要处理

即使 `domainStrategy` 改成 `AsIs`,如果 Xray 出站节点地址还是域名,Xray 启动时仍然要解析它。

公开配置里不要写真实节点。结构大概是这样:

```json
{
  "outbounds": [
    {
      "tag": "default-proxy",
      "protocol": "vless",
      "settings": {
        "vnext": [
          {
            "address": "203.0.113.10",
            "port": 443,
            "users": [
              {
                "id": "00000000-0000-0000-0000-000000000000",
                "encryption": "none"
              }
            ]
          }
        ]
      }
    }
  ]
}
```

这里用 IP 而不是域名,是为了避免 Xray 启动时先向本地上游 DNS 解析代理节点。

如果你的节点 IP 经常变化,可以不固化 IP,但要接受一个事实:启动解析节点域名这一步很难完全避免 bootstrap DNS。另一种做法是为节点域名单独配置可信 bootstrap DNS 或 hosts 记录,但要确认不会造成代理出站递归。

## dnsmasq 只做入口,不做分流

dnsmasq 这一层保持简单。它只负责:

```text
监听 LAN / 热点 DNS
给热点客户端发 DHCP
过滤 HTTPS/SVCB 记录
把所有 DNS 转给 Xray DNS 入站
```

示例配置:

```ini
interface=wlan0
bind-interfaces

listen-address=10.42.0.1
listen-address=192.168.10.20
listen-address=127.0.0.1

dhcp-range=10.42.0.10,10.42.0.254,255.255.255.0,1h
dhcp-option=3,10.42.0.1
dhcp-option=6,10.42.0.1
no-dhcp-interface=eth0

no-resolv
server=127.0.0.1#5354
filter-rr=65
log-dhcp
```

这里不建议在 dnsmasq 里写大量:

```ini
server=/steamcontent.com/192.168.10.1
server=/youtube.com/127.0.0.1#5354
```

原因是 dnsmasq 只能靠后缀分流,很难复用 `geosite:cn`、`geosite:steam`、`geosite:category-games@cn` 这些规则集。把分流放到 Xray DNS 里,更容易和连接层路由保持一致。

## Xray DNS 分流

Xray DNS 负责真正的 DNS 分流:

```text
国内域名 -> 本地上游 DNS
游戏下载 CDN -> 本地上游 DNS
其他域名 -> Cloudflare DoH,经代理出去
```

示例配置:

```json
{
  "dns": {
    "servers": [
      {
        "address": "192.168.10.1",
        "port": 53,
        "domains": [
          "geosite:cn",
          "domain:cn",
          "geosite:category-games@cn",

          "domain:steamcontent.com",
          "domain:steamserver.net",
          "full:steamcdn-a.akamaihd.net",
          "full:steampipe.akamaized.net",

          "domain:epicgamescdn.com",
          "full:download.epicgames.com",
          "full:download2.epicgames.com",
          "full:download3.epicgames.com",
          "full:download4.epicgames.com",
          "full:egdownload.fastly-edge.com",
          "full:epicgames-download1.akamaized.net",

          "full:assets1.xboxlive.com",
          "full:assets2.xboxlive.com",
          "full:d1.xboxlive.com",
          "full:dlassets-ssl.xboxlive.com",
          "domain:dl.delivery.mp.microsoft.com",
          "domain:delivery.mp.microsoft.com",

          "domain:dl.playstation.net",
          "domain:gs2.ww.prod.dl.playstation.net",
          "full:psnobj.prod.dl.playstation.net",
          "full:theia.dl.playstation.net",

          "domain:hac.lp1.d4c.nintendo.net",
          "domain:hac.lp1.eshop.nintendo.net",
          "domain:wup.eshop.nintendo.net",
          "domain:wup.shop.nintendo.net",
          "domain:cdn.nintendo.net"
        ],
        "skipFallback": true
      },
      {
        "address": "https://cloudflare-dns.com/dns-query"
      }
    ],
    "queryStrategy": "UseIPv4",
    "useSystemHosts": true,
    "tag": "dns-local"
  }
}
```

`skipFallback: true` 很重要。匹配到本地上游的域名,如果本地 DNS 返回 NXDOMAIN 或其他明确结果,不要再 fallback 到 Cloudflare DoH。否则同一个国内或下载 CDN 域名可能两边都问一遍。

还要让 Xray DNS 自己访问 DoH 时走代理:

```json
{
  "routing": {
    "rules": [
      {
        "type": "field",
        "inboundTag": ["dns-local"],
        "domain": [
          "domain:cloudflare-dns.com",
          "domain:dns.google"
        ],
        "outboundTag": "default-proxy"
      },
      {
        "type": "field",
        "inboundTag": ["dns-local"],
        "outboundTag": "direct"
      }
    ]
  }
}
```

这两条规则的意思是:

```text
Xray 内置 DNS 访问 Cloudflare DoH:走代理
Xray 内置 DNS 访问本地上游 192.168.10.1:53:直连
```

## 游戏平台和下载 CDN 要分开

一开始很容易写成:

```json
{
  "type": "field",
  "domain": [
    "geosite:steam",
    "geosite:epicgames",
    "geosite:xbox",
    "geosite:playstation",
    "geosite:nintendo"
  ],
  "outboundTag": "direct"
}
```

这不符合本文目标。

`geosite:steam` 包含的不只是下载 CDN,还包括:

```text
store.steampowered.com
steamcommunity.com
steampowered.com
steamstatic.com
steamcontent.com
steamcdn-a.akamaihd.net
```

如果整组 direct,就会把商店、社区、登录和 API 也直连。用户体验上,常见需求反而是:

```text
平台、商店、社区、账号、好友、库存:走代理
游戏下载内容 CDN:直连
```

所以路由规则要按顺序写:

```text
先匹配下载 CDN -> direct
再匹配平台大类 geosite -> proxy
再匹配 geoip:cn -> direct
最后默认 -> proxy
```

顺序不能反。如果先写 `geosite:steam -> proxy`,后面的 `steamcontent.com -> direct` 就可能没有机会命中。

## 下载 CDN 直连规则

下面是一个可用的下载 CDN 直连规则骨架。公开版里保留的是域名类型,不涉及任何私密信息。

```json
{
  "type": "field",
  "domain": [
    "geosite:category-games@cn",

    "domain:steamcontent.com",
    "domain:steamserver.net",
    "full:steamcdn-a.akamaihd.net",
    "full:steampipe.akamaized.net",
    "full:steampipe-kr.akamaized.net",
    "full:steampipe-partner.akamaized.net",
    "full:alibaba.cdn.steampipe.steamcontent.com",
    "full:dl.steam.clngaa.com",
    "full:st.dl.bscstorage.net",
    "full:st.dl.eccdnx.com",
    "full:st.dl.pinyuncloud.com",

    "domain:epicgamescdn.com",
    "full:download.epicgames.com",
    "full:download2.epicgames.com",
    "full:download3.epicgames.com",
    "full:download4.epicgames.com",
    "full:fastly-download.epicgames.com",
    "full:egdownload.fastly-edge.com",
    "full:epicgames-download1.akamaized.net",
    "regexp:^epicgames-download[0-9]+\\.akamaized\\.net$",
    "regexp:^cdn[0-9]+-epicgames-[0-9]+\\.file\\.myqcloud\\.com$",
    "regexp:^epicgames-download[0-9]+-[0-9]+\\.file\\.myqcloud\\.com$",

    "full:assets1.xboxlive.com",
    "full:assets1.xboxlive.com.nsatc.net",
    "full:assets2.xboxlive.com",
    "full:d1.xboxlive.com",
    "full:xbox-mbr.xboxlive.com",
    "full:xvcf1.xboxlive.com",
    "full:xvcf2.xboxlive.com",
    "full:dlassets-ssl.xboxlive.com",
    "domain:dl.delivery.mp.microsoft.com",
    "domain:delivery.mp.microsoft.com",
    "domain:prod.do.dsp.mp.microsoft.com",

    "domain:dl.playstation.net",
    "domain:gs2.ww.prod.dl.playstation.net",
    "domain:gs2.ww.prod.dl.playstation.net.edgesuite.net",
    "domain:gs2-ww-prod.psn.akadns.net",
    "full:gs-sec.ww.np.dl.playstation.net",
    "full:gst.prod.dl.playstation.net",
    "full:psnobj.prod.dl.playstation.net",
    "full:theia.dl.playstation.net",
    "full:tmdb.np.dl.playstation.net",
    "full:uef.np.dl.playstation.net",
    "full:vulcan.dl.playstation.net",

    "domain:hac.lp1.d4c.nintendo.net",
    "domain:hac.lp1.eshop.nintendo.net",
    "domain:wup.eshop.nintendo.net",
    "domain:wup.shop.nintendo.net",
    "domain:cdn.nintendo.net",
    "full:ccs.cdn.wup.shop.nintendo.net.edgesuite.net",
    "full:ecs-lp1.hac.shop.nintendo.net",
    "full:geisha-wup.cdn.nintendo.net",
    "full:idbe-wup.cdn.nintendo.net",
    "full:receive-lp1.dg.srv.nintendo.net"
  ],
  "outboundTag": "direct"
}
```

这个列表参考了两类来源:

```text
v2fly/domain-list-community:适合游戏平台和 geosite 规则
uklans/cache-domains:适合游戏下载内容缓存和 CDN 域名
```

不要把 `geosite:microsoft` 整个直连。它范围太大,会包含 GitHub、Office、Copilot、Visual Studio、Windows Update 等很多非 Xbox 下载场景。这里应该只挑 Xbox / Microsoft Store 下载相关 CDN,例如 `assets1.xboxlive.com`、`dl.delivery.mp.microsoft.com`、`dlassets-ssl.xboxlive.com`。

也不要把 `geosite:sony` 整个直连。它不只是 PlayStation 下载,还覆盖 Sony 其他业务。PlayStation 下载 CDN 用 `dl.playstation.net`、`gs2.ww.prod.dl.playstation.net` 这一类更安全。

## 平台域名代理规则

下载 CDN 直连之后,再写平台域名走代理:

```json
{
  "type": "field",
  "domain": [
    "geosite:steam",
    "geosite:epicgames",
    "geosite:xbox",
    "geosite:playstation",
    "geosite:nintendo"
  ],
  "outboundTag": "default-proxy"
}
```

这条规则放在下载 CDN direct 规则后面。

这样会得到下面的结果:

```text
store.steampowered.com -> proxy
steamcommunity.com -> proxy
www.epicgames.com -> proxy
www.xbox.com -> proxy
www.playstation.com -> proxy
www.nintendo.com -> proxy

steamcdn-a.akamaihd.net -> direct
steamcontent.com -> direct
download.epicgames.com -> direct
assets1.xboxlive.com -> direct
gs2.ww.prod.dl.playstation.net -> direct
hac.lp1.d4c.nintendo.net -> direct
```

## 其他路由规则顺序

最终规则顺序可以简化理解为:

```text
dns-in -> dns-out
DNS 端口 -> dns-out
UDP/443 -> blackhole 或 nft 快速 reject
dns-local 访问 DoH -> proxy
dns-local 访问本地 DNS -> direct
游戏下载 CDN -> direct
游戏平台主域名 -> proxy
广告域名按需要 blackhole 或 proxy
geoip:private -> direct
Google / YouTube -> proxy
geoip:google -> proxy
geoip:cn -> direct
geosite:cn -> direct
NTP -> direct
默认 -> proxy
```

其中 UDP/443 建议在 nftables 提前快速 reject,而不是只交给 Xray blackhole。静默丢包会让客户端等超时,快速 reject 能让浏览器和 App 更快回退 TCP/443。

## 验证 DNS 是否按预期分流

先抓树莓派是否向本地上游 DNS 发包:

```bash
sudo tcpdump -ni eth0 'host 192.168.10.1 and port 53'
```

然后从客户端入口查询几个域名:

```text
store.steampowered.com
www.epicgames.com
www.xbox.com
www.playstation.com
www.nintendo.com

steamcontent.com
download.epicgames.com
assets2.xboxlive.com
gs2.ww.prod.dl.playstation.net
hac.lp1.d4c.nintendo.net
```

预期结果:

```text
平台主域名:不应该出现在 192.168.10.1:53 抓包里
下载 CDN 域名:应该出现在 192.168.10.1:53 抓包里
```

一次实际验证中可以看到类似结果:

```text
store.steampowered.com      没有打到本地 DNS
www.epicgames.com           没有打到本地 DNS
www.xbox.com                没有打到本地 DNS
www.playstation.com         没有打到本地 DNS
www.nintendo.com            没有打到本地 DNS

steamcontent.com            -> 192.168.10.1:53
epicgamescdn.com            -> 192.168.10.1:53
assets2.xboxlive.com        -> 192.168.10.1:53
gs2.ww.prod.dl.playstation.net -> 192.168.10.1:53
hac.lp1.d4c.nintendo.net    -> 192.168.10.1:53
```

这说明:

```text
平台访问用代理侧 DNS
下载 CDN 用本地 DNS 拿近节点
```

## 验证连接是否按预期分流

Xray 的 access log 是最直接的证据。用本地 SOCKS 主动打几个域名:

```bash
curl --socks5-hostname 127.0.0.1:10808 -I https://store.steampowered.com/
curl --socks5-hostname 127.0.0.1:10808 -I https://www.epicgames.com/
curl --socks5-hostname 127.0.0.1:10808 -I https://www.xbox.com/
curl --socks5-hostname 127.0.0.1:10808 -I https://www.playstation.com/
curl --socks5-hostname 127.0.0.1:10808 -I https://www.nintendo.com/

curl --socks5-hostname 127.0.0.1:10808 -I https://steamcdn-a.akamaihd.net/
curl --socks5-hostname 127.0.0.1:10808 -I https://download.epicgames.com/
curl --socks5-hostname 127.0.0.1:10808 -I https://assets1.xboxlive.com/
curl --socks5-hostname 127.0.0.1:10808 -I https://gs2.ww.prod.dl.playstation.net/
curl --socks5-hostname 127.0.0.1:10808 -I https://atum.hac.lp1.d4c.nintendo.net/
```

预期 Xray 日志:

```text
store.steampowered.com              [socks-in -> default-proxy]
www.epicgames.com                   [socks-in -> default-proxy]
www.xbox.com                        [socks-in -> default-proxy]
www.playstation.com                 [socks-in -> default-proxy]
www.nintendo.com                    [socks-in -> default-proxy]

steamcdn-a.akamaihd.net             [socks-in -> direct]
download.epicgames.com              [socks-in -> direct]
assets1.xboxlive.com                [socks-in -> direct]
gs2.ww.prod.dl.playstation.net      [socks-in -> direct]
atum.hac.lp1.d4c.nintendo.net       [socks-in -> direct]
```

透明代理客户端也一样看 access log:

```bash
sudo tail -f /var/log/xray/access.log
```

下载 Steam 游戏时,可能看到大量类似连接:

```text
from 192.168.10.50 accepted tcp:183.238.66.68:8090 [tproxy-in -> direct]
from 192.168.10.50 accepted tcp:183.238.66.69:8090 [tproxy-in -> direct]
from 192.168.10.50 accepted tcp:183.238.66.100:8090 [tproxy-in -> direct]
from 192.168.10.50 accepted tcp:183.238.66.103:8090 [tproxy-in -> direct]
```

这里看不到 `steamcontent.com` 字样并不奇怪。客户端已经把域名解析成 CDN IP,Xray tproxy 看到的是 IP。判断依据是:

```text
连接目标集中在本地 CDN IP
端口符合下载行为,例如 80 / 443 / 8090
Xray outbound 是 direct
同一时间平台页面或国外后台请求仍然可以走 default-proxy
```

## 验证是否还有 DNS 泄露

最后再确认树莓派自己没有向外发不该发的 DNS:

```bash
sudo tcpdump -ni eth0 'src host 192.168.10.20 and (udp port 53 or tcp port 53 or port 853)'
```

允许出现的是:

```text
192.168.10.20 -> 192.168.10.1:53  国内域名
192.168.10.20 -> 192.168.10.1:53  游戏下载 CDN 域名
```

不应该出现的是:

```text
192.168.10.20 -> 192.168.10.1:53  google.com
192.168.10.20 -> 192.168.10.1:53  youtube.com
192.168.10.20 -> 192.168.10.1:53  cloudflare-dns.com
192.168.10.20 -> 192.168.10.1:53  代理节点域名
```

如果还能看到 `cloudflare-dns.com`,通常说明 Xray DNS 访问 DoH 的路由没有走代理,或者某个本地 DoH 转发器自己在解析 DoH 域名。

如果还能看到代理节点域名,通常说明 Xray 出站节点仍然写的是域名,或者系统里还有其他代理进程在解析节点。

## 备份和回滚

改 Xray 配置前先备份:

```bash
sudo cp /etc/xray/config.json /etc/xray/config.json.bak-$(date +%Y%m%d-%H%M%S)
```

改完先测试:

```bash
sudo /usr/local/bin/xray run -test -config /tmp/new-xray-config.json
```

通过以后再替换:

```bash
sudo install -m 0644 /tmp/new-xray-config.json /etc/xray/config.json
sudo systemctl restart xray
sudo systemctl is-active xray
```

回滚:

```bash
sudo install -m 0644 /etc/xray/config.json.bak-YYYYMMDD-HHMMSS /etc/xray/config.json
sudo systemctl restart xray
```

dnsmasq 也要备份:

```bash
sudo cp /tmp/raspi-hotspot-dnsmasq.conf /tmp/raspi-hotspot-dnsmasq.conf.bak-$(date +%Y%m%d-%H%M%S)
dnsmasq --test --conf-file=/tmp/raspi-hotspot-dnsmasq.conf
```

## 常见误区

第一个误区:只看客户端有没有发外部 DNS。

客户端 DNS 都进了树莓派,不代表树莓派自己没有 DNS 泄露。一定要在树莓派 `eth0` 上抓 `src host 树莓派地址 and port 53`。

第二个误区:把整组 `geosite:steam` 直连。

这样会让 Steam 商店、社区和账号也直连。下载速度可能好了,但平台访问可能又开始不稳定。更好的做法是下载 CDN direct,平台 geosite proxy。

第三个误区:把 `geosite:microsoft` 直连。

这会影响范围很大,不只是 Xbox。Xbox 下载只需要一小组 `xboxlive` 和 Microsoft Store delivery 域名。

第四个误区:游戏下载 CDN 只改连接层,不改 DNS。

如果 DNS 仍然走远端 DoH,拿到的 CDN 可能靠近代理出口,而不是靠近本地宽带。下载 CDN 应该同时做到:

```text
DNS 本地解析
连接 direct
```

第五个误区:为了 geoip 精细分流开启 `IPIfNonMatch`,却忘了它会触发本机 DNS。

在透明代理场景里,很多连接本来就是 IP。配合 sniff 和明确的 geosite 规则,`AsIs` 通常更干净。

## 参考来源

本文的游戏平台和下载 CDN 划分主要参考这些公开资料:

- Xray routing 文档:`AsIs`、`IPIfNonMatch`、`IPOnDemand` 的行为说明。  
  https://xtls.github.io/en/config/routing.html

- Xray DNS 文档:内置 DNS 的用途、DNS server 对象和路由阶段解析。  
  https://xtls.github.io/en/config/dns.html

- v2fly/domain-list-community:`geosite:steam`、`geosite:epicgames`、`geosite:xbox`、`geosite:playstation`、`geosite:nintendo` 的来源。  
  https://github.com/v2fly/domain-list-community

- uklans/cache-domains:面向 LAN content cache 的游戏下载 CDN 域名列表,适合用来筛下载直连域名。  
  https://github.com/uklans/cache-domains

- Epic 官方 allowlist:Epic Games Store 和下载相关域名。  
  https://www.epicgames.com/help/c-202300000001619/c-202300000001672/which-domains-need-to-be-whitelisted-to-reach-the-epic-servers-a202300000012358

- Microsoft Windows / Xbox endpoint 文档:Xbox Live 和 Microsoft Store delivery 相关端点。  
  https://learn.microsoft.com/en-us/windows/privacy/windows-11-endpoints-non-enterprise-editions

## 小结

这套配置的核心是“分层”:

```text
DNS 层:
国内域名和游戏下载 CDN 用本地 DNS
其他域名用代理侧 DoH

连接层:
游戏下载 CDN direct
游戏平台和国外站点 proxy
国内 IP direct
默认 proxy

防泄露:
routing.domainStrategy 使用 AsIs
代理节点地址避免依赖本机 DNS
用 tcpdump 验证树莓派自身 DNS 出口
```

最终效果是:Steam、Epic、Xbox、PlayStation、Nintendo 的平台页面继续靠代理保证可访问性;真正下载游戏内容时,DNS 用本地上游拿近 CDN,连接走 direct,不占用代理出口。
标签: 暂无
最后更新:2026年6月20日

这个人很懒,什么都没留下

点赞
< 上一篇

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

归档

  • 2026 年 6 月

分类

  • 服务器
  • 网络

COPYRIGHT © 2026 ASIDE0. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

中文EN