如何截获 Netflix TV 的(疑似内置)DNS 请求?

2021-12-26 14:30:16 +08:00
 CrazyRundong

部署旁路由 Clash 代理后,家里所有设备都能够通过浏览器或者 iOS/iPad OS app 访问 Netflix 非自制剧,唯独电视(包括 Android TV 和 Apple TV )会提示「检测到使用代理」而拒绝加载。

看了下 Clash 日志,似乎电视上的 Netflix app 会直接通过 IP 加载内容:

23.246.56.138:443 match IPCIDR(23.246.0.0/18) using Netflix[🇸🇬 IEPL-SS 新加坡 1]

而 23.246.56.138 的归属地为香港,可能由此触发了代理检测。怀疑是 Netflix app 使用某种内置的 DNS 服务,直接在国内解析域名到最近的香港节点了。现在的问题是如何截获这个 DNS 请求并把它转发到我的新加坡节点上?旁路由已经配置了 iptables 把所有 UDP 53 转发到 Clash ,但这似乎对 Netflix app 无效。

(作为对照,网页版 Netflix 的所有请求均被截获转发,Clash 日志能直接看到内容域名:)

ipv6-c014-hkg001-ix.1.oca.nflxvideo.net:443 match DomainSuffix(nflxvideo.net) using Netflix[🇸🇬 IEPL-SS 新加坡 1]
8561 次点击
所在节点    Netflix
35 条回复
cloudsigma
2022-05-02 11:12:40 +08:00
在路由器里截取

# fix dns, redirect all other dns server to 192.168.1.1#53, such as 114.. or 8..
iptables -t nat -N DNS
iptables -t nat -A DNS -p udp -j REDIRECT --to-ports 53
iptables -t nat -I PREROUTING -p udp --dport 53 -j DNS
CrazyRundong
2022-05-02 11:26:18 +08:00
@cloudsigma #21 UDP 53 已经截取了的,连 TCP 53 都用 clash tun hijack 了。但现在除了直接在电视上开 clash for android 全局模式,其他方法都好像有概率触发代理检测或者限播非自制剧
me221
2022-05-03 23:48:17 +08:00
@CrazyRundong 我发现在 IOS 的 APP 更容易封 IP... 在隔壁找到 https://host.loc.com/thread-973557-1-1.html 这个帖子
keyfunc
2022-06-21 17:26:27 +08:00
payload:
- "23.246.0.0/18"
- "37.77.184.0/21"
- "45.57.0.0/17"
- "64.120.128.0/17"
- "66.197.128.0/17"
- "108.175.32.0/20"
- "192.173.64.0/18"
- "198.38.96.0/19"
- "198.45.48.0/20"
Holmes96
2022-08-08 21:32:12 +08:00
有大佬解决了么?
Holmes96
2022-08-08 21:32:33 +08:00
有大佬解决 Apple TV 上 DNS 解锁了么?
ysn2233
2022-12-07 09:06:19 +08:00
同样问题有解决的么?
HuLaTown
2023-01-18 17:44:04 +08:00
同样的问题,在 openclash 的规则里添加了 @keyfunc 提供的 IP 列表解决了。感谢!
caiyuyu
335 天前
@HuLaTown 大佬,我也遇到这个问题了,可以问一下是咋加的吗?我加了好像也不行😂
Eastlee
273 天前
我和楼主遇到一样的问题,我是梅林环境,tv 版应该有单独的检测机制,最后关闭了路由器的 ipv6 好了。
HuLaTown
185 天前
@caiyuyu 我是在 `rules` 部分加了以下这些:

```
- IP-CIDR,23.246.0.0/18,netflix
- IP-CIDR,37.77.184.0/21,netflix
- IP-CIDR,45.57.0.0/17,netflix
- IP-CIDR,64.120.128.0/17,netflix
- IP-CIDR,66.197.128.0/17,netflix
- IP-CIDR,108.175.32.0/20,netflix
- IP-CIDR,192.173.64.0/18,netflix
- IP-CIDR,198.38.96.0/19,netflix
- IP-CIDR,198.45.48.0/20,netflix
```

上面的 `netflix` 是我建的 proxy-group
Reficul
82 天前
折腾了半天,终于搞清楚了。

TV App 存在 DNS pin ,回向写死的 DNS 服务器发起 DOH 和 DOT 查询,DNS 服务器我看到的就有
8.8.8.8 / 8.8.4.4 / 1.1.1.1 / 1.0.0.1 ,不排除有别的,屏蔽不过来也没有前途。

目前所谓的 DNS 解锁本质就是一个 SNI proxy ,DNS 返回的结果不是 SNI proxy 的地址的情况下,解锁就失效了。所以解决方案也很简单,用 iptables 把 Netflix 的网段都劫持到 SNI Proxy 的地址上就行了。

脚本大致如下:
https://gist.github.com/xuzhenglun/d35e6534e24291dec0009248924f9c85
CrazyRundong
82 天前
@Reficul #32

>TV App 存在 DNS pin ,回向写死的 DNS 服务器发起 DOH 和 DOT 查询

多谢!这个信息太有用了!我目前在 sing-box 上通过阻断 853 、443/UDP 和 STUN 流量来防止 TV App 的 DNS pin 泄漏,然后把剩余的流量分流到解锁了 Netflix 的节点。这样也能 work ,就是每次加载时间会长一些: https://github.com/lirundong/homelab-infra/blob/93352db/conf-gen/source.yaml#L600-L607
terrancesiu
75 天前
@Reficul 是的,就是你的搞法,我直接把目的地址为 NF 的所属的 cidr 且目的端口为 443 的请求,通过 dnat 到了 sniproxy 的服务器地址,然后一切 ok 。RouterOS 的做法,我贴出来。
把 nf 的地址段都加入这个 list ,但是实际上亚洲解锁都是 23.246 段的,台湾比较特殊,本地 ISP 也有 CDN
/ip firewall address-list
add address=23.246.0.0/18 list=netflix
add address=37.77.184.0/21 list=netflix
add address=45.57.0.0/17 list=netflix
add address=64.120.128.0/17 list=netflix
add address=66.197.128.0/17 list=netflix
add address=108.175.32.0/20 list=netflix
add address=192.173.64.0/18 list=netflix
add address=198.38.96.0/19 list=netflix
add address=198.45.48.0/20 list=netflix
add address=210.201.93.0/24 comment="Asia Pacific Telecom" list=netflix
add address=203.75.0.0/16 comment="HiNet (Chunghwa Telecom)" list=netflix

#创建一个 DNAT
/ip/firewall/nat
add action=dst-nat chain=dstnat comment=netflix dst-address-list=netflix dst-port=443 protocol=tcp to-addresses="你的 DNS 解锁解析出来的 SNI 代理服务器地址" to-ports=443

最后做个定时任务,如果解析地址变化,自动更新
/system/scheduler
add comment=netflix interval=2m name=schedule99 on-event=":local NAME \"www.netflix.com\"\r\
\n:local CURRENT [:resolve \$NAME]\r\
\n:local CONTENT [/ip/firewall/nat/get value-name=to-addresses [find comment=\"netflix\"]]\r\
\n:if (\$CURRENT != \$CONTENT) do={\r\
\n/ip/firewall/nat/set to-addresses=\$CURRENT [find comment=\"netflix\"];\r\
\n:log/info \"DOMAIN: \$NAME ,SNIPROXY: \$CURRENT updated\"\r\
\n};" policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-date=2021-01-01 start-time=08:00:00
meitao19950
35 天前
@Reficul 太专业了看不懂

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/824484

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX