my-dns-server
v1.0.3
Published
一个轻量级的 DNS 服务器,支持域名解析和请求转发功能。
Readme
My DNS Server
一个轻量级的 DNS 服务器,支持域名解析和请求转发功能。
概述
这是一个基于 Node.js 的 DNS 服务器实现,可以:
- 将特定域名解析到指定 IP 地址
- 将其他 DNS 查询转发到上游 DNS 服务器
- 提供完整的 DNS 协议支持和错误处理
- 支持命令行参数配置,无需修改代码
功能特性
- ✅ 域名劫持: 将目标域名解析到指定 IP
- ✅ 请求转发: 自动转发非目标域名的查询
- ✅ 错误处理: 完善的异常处理和超时机制
- ✅ 日志记录: 详细的请求和响应日志
- ✅ 缓冲区安全: 防止缓冲区溢出攻击
- ✅ 协议兼容: 完整的 DNS 协议实现
- ✅ 命令行工具: 支持全局安装和命令行配置
- ✅ 参数验证: 智能的参数验证和错误提示
安装
方式一:全局安装(推荐)
# 全局安装
npm install -g my-dns-server
# 现在可以在任何地方使用
my-dns-server --help方式二:本地运行
# 克隆项目
git clone <repository-url> // 由于网络原因暂未上传到代码库,可以全局安装找到安装目录,拷贝出来再执行下面的操作
cd my-dns-server
# 直接运行
node src/index.js --help使用方法
命令行选项
my-dns-server [选项]
选项:
-h, --help 显示帮助信息
-v, --version 显示版本信息
-p, --port 指定端口号 (默认: 53)
--address 指定上游DNS服务器地址 (默认: 172.23.8.134)
--target-domain 指定目标域名 (默认: lw-info.online)
--target-ip 指定目标IP地址 (默认: 192.168.1.1)使用示例
# 使用默认配置启动
my-dns-server
# 使用非特权端口启动(不需要管理员权限)
my-dns-server -p 5353
# 自定义所有参数
my-dns-server \
--port 5353 \
--address 8.8.8.8 \
--target-domain example.com \
--target-ip 10.0.0.1
# 显示帮助信息
my-dns-server --help
# 显示版本信息
my-dns-server --version启动服务器
# 使用默认配置启动(需要管理员权限)
my-dns-server
# 或者直接运行(如果未全局安装)
node src/index.js测试 DNS 解析
# 测试目标域名解析(默认端口53)
nslookup lw-info.online 127.0.0.1
# 测试其他域名转发
nslookup google.com 127.0.0.1
# 如果使用自定义端口(如5353),需要指定端口
nslookup lw-info.online 127.0.0.1 5353示例输出
🚀 DNS服务器启动成功!
📍 端口: 53
🎯 目标域名: lw-info.online -> 192.168.1.1
🔄 转发DNS: 172.23.8.134
📮 接收DNS查询: lw-info.online 来自 127.0.0.1:54321 (大小: 32字节)
🎯 目标域名命中: lw-info.online
成功响应 lw-info.online -> 192.168.1.1项目结构
my-dns-server/
├── src/
│ └── index.js # 主程序文件
├── package.json # 项目配置
└── README.md # 项目说明技术实现
DNS 协议支持
- 完整的 DNS 头部解析(12 字节)
- 支持 A 记录查询和响应
- 域名压缩指针实现
- 标准 DNS 响应格式
核心功能
- 命令行解析: 智能的参数解析和验证系统
- 域名解析:
parseHost()- 解析 DNS 查询中的域名 - 响应构造:
buildDNSResponse()- 构造标准 DNS 响应 - 请求转发:
forward()- 转发到上游 DNS 服务器 - 参数验证: 内置 IPv4 和域名格式验证
参数处理系统
项目采用了优化的配置驱动参数处理系统:
const PARAM_CONFIG = {
port: {
flags: ["-p", "--port"],
default: 53,
validator: (value) => {
const port = parseInt(value, 10);
return port > 0 && port < 65536 ? port : null;
},
errorMessage: "❗ 无效的端口号(范围: 1-65535)",
},
// 其他参数配置...
};特点:
- 🔧 配置驱动: 所有参数在一个配置对象中管理
- 🛡️ 类型验证: 每个参数都有专门的验证函数
- 📝 错误提示: 清晰的错误信息和使用建议
- 🔄 可扩展: 轻松添加新的命令行参数
DNS 协议常量
const DNS_CONSTANTS = {
HEADER_SIZE: 12, // DNS头部大小
TYPE_A: 1, // A记录类型
CLASS_IN: 1, // Internet类
COMPRESSED_NAME_POINTER: 0xc00c, // 域名压缩指针
RESPONSE_FLAGS: 0x8180, // 响应标志位
DEFAULT_TTL: 300, // 默认TTL值
IPV4_LENGTH: 4, // IPv4地址长度
};安全特性
- 缓冲区溢出保护: 严格的边界检查
- 请求大小验证: 验证 DNS 请求的最小长度
- 超时处理: 5 秒 DNS 转发超时
- 域名长度限制: 符合 RFC 规范的域名长度限制
- 标签数量限制: 防止过多子域名的攻击
- 参数验证: IPv4 地址和域名格式的正则表达式验证
- 错误日志记录: 详细的错误信息记录
开发调试
VS Code 调试配置
在 .vscode/launch.json 中添加:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "启动DNS服务器",
"program": "${workspaceFolder}/src/index.js",
"console": "integratedTerminal"
}
]
}常见问题
端口占用错误
Error: listen EADDRINUSE: address already in use :::53解决方案:
- 停止系统 DNS 服务
- 使用其他端口:
my-dns-server -p 5353
权限不足
Error: listen EACCES: permission denied 0.0.0.0:53解决方案:
- 使用管理员权限运行
- 或使用非特权端口:
my-dns-server -p 5353
Windows PowerShell shebang 错误
无法将"usr/bin/env.exe"项识别为 cmdlet解决方案:
- 确保 shebang 行正确:
#!/usr/bin/env node - 重新运行
npm link
- 确保 shebang 行正确:
参数验证错误
❗ 无效的端口号(范围: 1-65535) ❗ 无效的DNS服务器地址 ❗ 无效的目标域名 ❗ 无效的目标IP地址解决方案:
- 检查参数格式是否正确
- 端口范围:1-65535
- IP 地址格式:xxx.xxx.xxx.xxx
- 域名格式:符合标准域名规范
DNS 解析失败
- 检查上游 DNS 服务器是否可达
- 确认网络连接正常
- 检查防火墙设置
全局命令不可用
'my-dns-server' 不是内部或外部命令解决方案:
- 运行
npm link创建全局链接 - 确保 Node.js 全局模块路径在 PATH 中
- 检查缓冲区是否完整
- 运行
性能特点
- 内存使用: 每个请求约占用 512 字节缓冲区
- 响应时间: 本地解析 < 1ms,转发请求 < 100ms
- 并发支持: UDP 协议天然支持高并发
- 资源消耗: 极低的 CPU 和内存占用
API 参考
主要函数
parseHost(buf)
解析 DNS 查询中的域名
- 参数:
buf- DNS 查询缓冲区 - 返回:
{host, offset}- 域名字符串和偏移量 - 异常: 抛出缓冲区溢出或格式错误异常
buildDNSResponse(transactionId, questionBuf, questionLength, targetIP)
构造 DNS 响应
- 参数:
transactionId- 事务 IDquestionBuf- 查询缓冲区questionLength- 查询长度targetIP- 目标 IP 地址
- 返回: DNS 响应缓冲区
forward(msg, rinfo)
转发 DNS 请求到上游服务器
- 参数:
msg- 原始 DNS 请求rinfo- 客户端信息
- 功能: 异步转发并回传响应
注意事项
⚠️ 重要提醒:
- 需要管理员/root 权限才能绑定 53 端口
- 仅用于开发测试,生产环境请使用专业 DNS 服务器
- 修改系统 DNS 设置可能影响网络连接
- 确保上游 DNS 服务器地址正确且可达
扩展功能
可以考虑添加的功能:
- [ ] 支持多个域名劫持配置
- [ ] 添加配置文件支持
- [ ] 实现 DNS 缓存功能
- [ ] 支持 AAAA(IPv6)记录
- [ ] 添加 Web 管理界面
- [ ] 支持 DNS over HTTPS (DoH)
贡献
欢迎提交 Issue 和 Pull Request!
许可证
ISC License
版本历史
- v1.0.0:
- ✅ 初始版本,支持基本的 DNS 解析和转发功能
- ✅ 添加命令行参数支持
- ✅ 优化参数验证和错误处理
- ✅ 支持全局安装 (
npm link) - ✅ 完善的帮助文档和使用示例
快速开始
# 1. 全局安装
npm link
# 2. 查看帮助
my-dns-server --help
# 3. 使用非特权端口启动(推荐用于测试)
my-dns-server -p 5353
# 4. 测试解析
nslookup lw-info.online 127.0.0.1 5353本项目仅供学习和测试使用,请勿用于非法用途。
