关于DNSCrypt Proxy的sdns://URL解析及自定义的技术问询
解析sdns://格式URL到IP地址 & 创建自定义sdns://链接
刚好对DNSCrypt Proxy的sdns://格式比较熟悉,我来分两部分帮你解决这两个问题:
一、把sdns:// URL解析为IP地址
sdns://本质是URL安全的Base64编码字符串,里面封装了DNSCrypt服务器的IP、公钥、协议类型等元数据。有两种常用方法解析:
方法1:用DNSCrypt Proxy自带的工具
如果你已经安装了DNSCrypt Proxy,它通常会附带sdns-decode工具(不同平台的二进制包位置可能不同,比如Linux下在/usr/local/bin)。直接运行以下命令:
# 把你的sdns://链接去掉前缀后的Base64字符串传入 echo "AgcAAAAAAAAABzEuMC4wLjGgENk8mGSlIfMGXMOlIlCcKvq7AVgcrZxtjon911-ep0cg63Ul-I8NlFj4GplQGb_TTLiczclX57DvMV8Q-JdjgRgSZG5zLmNsb3VkZmxhcmUuY29tCi9kbnMtcXVlcnk" | base64 -d | sdns-decode
执行后会输出清晰的结构化信息,比如服务器IP、公钥、域名、协议版本等,你能直接找到对应的IP地址。
方法2:手动解码(适合没有工具的场景)
如果没有sdns-decode,可以手动解码:
- 提取Base64部分:去掉
sdns://前缀,得到纯Base64字符串 - 转换为标准Base64:因为是URL安全的,需要把字符串里的
-替换成+,_替换成/,然后补=字符让字符串长度是4的倍数(比如长度除以4余1就补3个=,余2补2个,余3补1个) - Base64解码:用任意Base64解码工具(比如Python的
base64.b64decode())解码成二进制数据 - 提取IP:解码后的二进制数据开头会包含IP地址(IPv4是4字节,IPv6是16字节),你可以用十六进制编辑器或者简单脚本提取,比如用Python打印解码后的IPv4:
import base64 sdns_str = "AgcAAAAAAAAABzEuMC4wLjGgENk8mGSlIfMGXMOlIlCcKvq7AVgcrZxtjon911-ep0cg63Ul-I8NlFj4GplQGb_TTLiczclX57DvMV8Q-JdjgRgSZG5zLmNsb3VkZmxhcmUuY29tCi9kbnMtcXVlcnk" # 转换为标准Base64 standard_b64 = sdns_str.replace('-', '+').replace('_', '/') # 补全= padding = len(standard_b64) % 4 if padding != 0: standard_b64 += '=' * (4 - padding) # 解码 data = base64.b64decode(standard_b64) # 提取IPv4(跳过协议头后的4字节) ipv4 = ".".join(str(b) for b in data[8:12]) print(ipv4) # 输出1.0.0.8,和你例子里的Cloudflare服务器对应
二、创建自定义的sdns:// URL
要生成自己的sdns://链接,你需要先有一个支持DNSCrypt v2的服务器(自己搭建或者使用第三方支持自定义的服务器),然后准备以下信息:
- 服务器的IPv4/IPv6地址
- DNSCrypt服务器的公钥(可以从服务器的
dnscrypt-proxy配置文件里的public-key字段获取) - 可选:服务器名称、DNS查询路径(默认是
/dns-query)
方法1:用官方sdns-encode工具
这是最简单的方法,DNSCrypt Proxy包自带sdns-encode工具,运行类似以下命令:
# 示例:创建指向IPv4 1.2.3.4,公钥为指定值的sdns链接 sdns-encode --ipv4 1.2.3.4 --pubkey "abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890" --name "my-custom-dnscrypt" --path "/dns-query"
命令执行后会直接输出生成的sdns://开头的URL。
方法2:手动编码(适合自定义场景)
如果需要更灵活的控制,可以手动打包数据:
- 按照DNSCrypt的规范,把协议版本、IP地址、公钥、名称、路径等信息打包成二进制格式
- 对二进制数据做URL安全的Base64编码:把标准Base64里的
+换成-,/换成_,去掉末尾的= - 在编码后的字符串前加上
sdns://前缀,就是最终的URL
内容的提问来源于stack exchange,提问作者user7258070
相关产品推荐
相关产品推荐

