用 nodejs 写了个 DNS 解析, UDP 转 DOT/TCP, 转 DOH - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pagxir
V2EX    DNS

用 nodejs 写了个 DNS 解析, UDP 转 DOT/TCP, 转 DOH

  •  
  •   pagxir 2023-11-29 15:54:08 +08:00 2349 次点击
    这是一个创建于 689 天前的主题,其中的信息可能已经有所发展或是发生改变。
    11 月快要过去了,这个月研究了下 android 的 DOT,手写了个 DOT 实现,方便验证 android 的 DoT 行为

    先说结论:
    1 、DoT 是可以使用自签名证书的,并不是说非的需要一个正式的 HTTPS 证书。
    2 、当选择自动模式的时候,代码实现上自动检测当前 DNS 服务器是否支持 TLS,并且 TLS 查询延迟不是比 UDP 差的多时候会自动选择 DOT,否则是 UDP 。所以自动模式下,如果当前的 DNS 服务器不支持 UDP ,只支持 TLS,手机也是能正常工作的。
    3 、选择第三方 Dot 服务器,必须填域名,并且服务器的证书需要是正式签名的 HTTPS 证书。

    Android 手机上的 Vpn 服务,默认需要 dns 跟地址都存在的才运行使用这个协议栈,所以理论上需要配置一个 ipv4 格式的地址一个 iPv4 格式的 DNS 服务器, 然后配置一个 ipv6 格式的地址加上一个 ipv6 格式的 DNS 服务器,才会双栈同时工作。当然了,也可以通过 VpnService.Builder.allowFamily 来关闭这个默认行为。

    android DNS 解析器需要有缺省的路由才会解释对应协议栈的记录。所以手机连着只有 IPv4 的 Wifi ,然后建立 VpnService 是没有配置全局单播路由 2000::/3 那么,手机不会查询 AAAA 记录,也就是无法访问 IPv6 网络(即使你配置了部分的 ipv6 路由)。

    所以, 如果 Vpn 的承载网络是 IPv4 单栈( wlan 或者蜂窝网络),需要在 VpnService.Builder 中添加 2000::/3 路由。

    64:ff9b::/96 是默认的 NAT64 前缀,dns64.dns.google (2001:4860:4860::64,2001:4860:4860::6464) 支持返回 NAT64 的记录。不过它是没有 ipv6 记录情况下才会返回 NAT64 地址。所以这里实现,可以修改 pref 的配置,选择优先返回 NAT64 的地址。

    这里实现,会有两个个上游 DNS 服务器,223.5.5.5 ,8.8.8.8 ,只返回 pref 高的记录
    默认的 pref 顺序:

    1 从 223.5.5.5 返回的并且是国内 IPv4 地址,最高优先级。
    2 从 8.8.8.8 返回的 NAT64 记录。
    3 从 8.8.8.8 返回的 ipv4 记录, 优先级跟 2 同。
    4 从 8.8.8.8 返回的 IPv6 记录。
    5 从 223.5.5.5 返回的 IPv6 记录。

    所以只需要把 64:ff9b::/96 地址段选择正确的路由即可。不过就是需要本地网络开启双栈(不一定一定要全局 ipv6 地址)。

    实现:
    https://github.com/pagxir/dns-resolver-ng

    测试地址 (因为 ECH facing server 只配置了 v6 网络,使用时需要 IPv6 网络,否则有问题):
    https://test.855899.xyz/dns-query
    1 条回复
    pagxir
        1
    pagxir  
    OP
       2023-11-29 16:10:28 +08:00
    在 linux 下,/etc/gai.conf 配置会影响 getaddrinfo 返回地址列表顺序。 里面 preference 是优先级顺序,数字越大优先级越高,label 是标签的意思,数字大小没有意义。顺序规则是先比较到达目标地址时选择的源的地址,如果源地址跟目标地址不在同一个 label 则优先级很低。
    所以顺序就是,返回 preference 值高的并且源地址跟目标地址在同一个 label 的,然后是原地址跟目标地址在同一个 label 的其他记录,最后是原地址跟目标地址不在同一个 label 下的。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2495 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 11:46 PVG 19:46 LAX 04:46 JFK 07:46
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86