// 功能特点
const features = [
"强大的DNS反射功能"
];
[01]
IPv4和IPv6支持
/*
完全支持IPv4和IPv6地址,提供多种编码格式。
*/
完全支持IPv4和IPv6地址,提供多种编码格式。
*/
[02]
多种编码格式
/*
直接反射、Base32编码,以及IPv6的特殊格式,包括零组压缩。
*/
直接反射、Base32编码,以及IPv6的特殊格式,包括零组压缩。
*/
[03]
双栈支持
/*
在单个域名中同时编码IPv4和IPv6地址,适用于双栈环境。
*/
在单个域名中同时编码IPv4和IPv6地址,适用于双栈环境。
*/
[04]
高兼容性
/*
在多个端口和网络类型上运行,确保在不同环境中的最大兼容性。
*/
在多个端口和网络类型上运行,确保在不同环境中的最大兼容性。
*/
function 工作原理() {
return "简单的DNS反射过程";
01
step.在域名中编码IP()
/**
* 根据支持的编码格式之一格式化您的IP地址,并将其附加到2dns.dev域名。
*/
* 根据支持的编码格式之一格式化您的IP地址,并将其附加到2dns.dev域名。
*/
02
step.发送DNS查询()
/**
* 使用标准DNS工具(如dig或nslookup)向我们的DNS服务器查询编码的域名。
*/
* 使用标准DNS工具(如dig或nslookup)向我们的DNS服务器查询编码的域名。
*/
03
step.服务器处理查询()
/**
* 我们的服务器解析域名,提取编码的IP地址,并准备适当的DNS响应。
*/
* 我们的服务器解析域名,提取编码的IP地址,并准备适当的DNS响应。
*/
04
step.在响应中接收IP()
/**
* DNS响应包含提取的IP地址,作为A记录(IPv4)或AAAA记录(IPv6)。
*/
* DNS响应包含提取的IP地址,作为A记录(IPv4)或AAAA记录(IPv6)。
*/
process.exit(0);
}
编码详解
Base32编码详解
2DNS如何使用Base32编码IP地址
理解Base32编码
Base32编码是一种使用32个ASCII字符(A-Z和2-7)表示二进制数据的方法。在2DNS中,我们使用Base32编码IP地址,使其适合DNS域名格式,并将标准填充字符'='替换为'8'。
IPv4IPv4的Base32编码
IPv4地址由4个字节(32位)组成。使用Base32编码后,会生成一个8字符的字符串。这种紧凑的表示形式非常适合嵌入到域名中。
📦
转换示例:1.2.3.4 → AEBAGBA8
🔄编码流程
1.IP地址转字节:
[1, 2, 3, 4]
2.Base32编码:
"AEBAGBAA"
3.替换填充符:
"AEBAGBA8"
IPv6IPv6的Base32编码
IPv6地址由16个字节(128位)组成。使用Base32编码后,会生成一个32字符的字符串,虽然较长但在域名中仍然可以管理。
🌐
转换示例
2001:0db8:85a3::8a2e:0370:7334
↓
EAAQ3OEFUMAAAAAARIXAG4DTGQ888888
🔄编码流程
1.
IPv6地址转字节:
[32, 1, 13, 184, 133, 163, 0, 0, 0, 0, 138, 46, 3, 112, 115, 52]
2.
Base32编码:
"EAAQ3OEFUMAAAAAARIXAG4DTGQ======"
3.
替换填充符:
"EAAQ3OEFUMAAAAAARIXAG4DTGQ888888"
双栈编码
对于同时支持IPv4和IPv6的环境,2DNS允许在单个域名中编码两种地址。前8个字符表示IPv4地址,剩余32个字符表示IPv6地址。
🔗
双栈编码示例
IPv4: 1.2.3.4 + IPv6: 2001:0db8:85a3::8a2e:0370:7334
🔄编码流程
1.IPv4转字节:
[1, 2, 3, 4]
2.IPv4编码:
"AEBAGBA8"
3.
IPv6转字节:
[32, 1, 13, 184, 133, 163, 0, 0, 0, 0, 138, 46, 3, 112, 115, 52]
4.
IPv6编码:
"EAAQ3OEFUMAAAAAARIXAG4DTGQ888888"
5.
🎯 组合结果:
"AEBAGBA8EAAQ3OEFUMAAAAAARIXAG4DTGQ888888"
📊查询结果
A 记录返回:
1.2.3.4
AAAA 记录返回:
2001:0db8:85a3::8a2e:0370:7334
实现示例
Python
import base64
import ipaddress
def ipv4_to_base32(ip_str):
"""将IPv4地址转换为Base32编码。"""
# 解析IP地址
ip = ipaddress.IPv4Address(ip_str)
# 转换为字节
ip_bytes = ip.packed
# 编码为Base32
encoded = base64.b32encode(ip_bytes).decode('ascii')
# 将填充替换为'8'
return encoded.rstrip('=').ljust(len(encoded), '8')
def ipv6_to_base32(ip_str):
"""将IPv6地址转换为Base32编码。"""
# 解析IP地址
ip = ipaddress.IPv6Address(ip_str)
# 转换为字节
ip_bytes = ip.packed
# 编码为Base32
encoded = base64.b32encode(ip_bytes).decode('ascii')
# 将填充替换为'8'
return encoded.rstrip('=').ljust(len(encoded), '8')
def dual_stack_to_base32(ipv4_str, ipv6_str):
"""创建双栈Base32编码。"""
return ipv4_to_base32(ipv4_str) + ipv6_to_base32(ipv6_str)
# 示例
ipv4 = "1.2.3.4"
ipv6 = "2001:0db8:85a3::8a2e:370:7334"
print(f"IPv4 Base32: {ipv4_to_base32(ipv4)}")
print(f"IPv6 Base32: {ipv6_to_base32(ipv6)}")
print(f"双栈 Base32: {dual_stack_to_base32(ipv4, ipv6)}")
实时演示
尝试DNS反射
了解2DNS如何处理您的IP地址
输入IP地址并选择格式以生成DNS查询命令。
DNS 查询生成器
输入IP地址并选择格式来生成DNS查询命令
示例
查看不同格式的DNS查询示例
1
直接IPv4
dig
dig 1.2.3.4.2dns.dev A
host
host -t A 1.2.3.4.2dns.dev
DNS over HTTPS
使用Cloudflare DOH查询1.2.3.4.2dns.dev
返回1.2.3.4作为A记录