DNS反射服务器

// 在域名中编码IP地址,在DNS响应中获取它们

2DNS是一个多功能的DNS反射服务器,允许您在域名中编码IP地址,并在DNS响应中将其反射回来。适用于各种网络应用、诊断和基于DNS的服务发现。

2DNS Global Network
// scroll to explore

// 功能特点

const features = [
"强大的DNS反射功能"
];

[01]

IPv4和IPv6支持

/*
完全支持IPv4和IPv6地址,提供多种编码格式。
*/
[02]

多种编码格式

/*
直接反射、Base32编码,以及IPv6的特殊格式,包括零组压缩。
*/
[03]

双栈支持

/*
在单个域名中同时编码IPv4和IPv6地址,适用于双栈环境。
*/
[04]

高兼容性

/*
在多个端口和网络类型上运行,确保在不同环境中的最大兼容性。
*/

function 工作原理() {

return "简单的DNS反射过程";

step.在域名中编码IP()

/**
* 根据支持的编码格式之一格式化您的IP地址,并将其附加到2dns.dev域名。
*/

step.发送DNS查询()

/**
* 使用标准DNS工具(如dig或nslookup)向我们的DNS服务器查询编码的域名。
*/

step.服务器处理查询()

/**
* 我们的服务器解析域名,提取编码的IP地址,并准备适当的DNS响应。
*/

step.在响应中接收IP()

/**
* 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'。

IPv4
IPv4的Base32编码

IPv4地址由4个字节(32位)组成。使用Base32编码后,会生成一个8字符的字符串。这种紧凑的表示形式非常适合嵌入到域名中。

📦

转换示例:1.2.3.4 → AEBAGBA8

🔄编码流程

1.IP地址转字节:[1, 2, 3, 4]
2.Base32编码:"AEBAGBAA"
3.替换填充符:"AEBAGBA8"

IPv6
IPv6的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记录