npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

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 响应格式

核心功能

  1. 命令行解析: 智能的参数解析和验证系统
  2. 域名解析: parseHost() - 解析 DNS 查询中的域名
  3. 响应构造: buildDNSResponse() - 构造标准 DNS 响应
  4. 请求转发: forward() - 转发到上游 DNS 服务器
  5. 参数验证: 内置 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"
    }
  ]
}

常见问题

  1. 端口占用错误

    Error: listen EADDRINUSE: address already in use :::53

    解决方案:

    • 停止系统 DNS 服务
    • 使用其他端口:my-dns-server -p 5353
  2. 权限不足

    Error: listen EACCES: permission denied 0.0.0.0:53

    解决方案:

    • 使用管理员权限运行
    • 或使用非特权端口:my-dns-server -p 5353
  3. Windows PowerShell shebang 错误

    无法将"usr/bin/env.exe"项识别为 cmdlet

    解决方案:

    • 确保 shebang 行正确:#!/usr/bin/env node
    • 重新运行 npm link
  4. 参数验证错误

    ❗ 无效的端口号(范围: 1-65535)
    ❗ 无效的DNS服务器地址
    ❗ 无效的目标域名
    ❗ 无效的目标IP地址

    解决方案:

    • 检查参数格式是否正确
    • 端口范围:1-65535
    • IP 地址格式:xxx.xxx.xxx.xxx
    • 域名格式:符合标准域名规范
  5. DNS 解析失败

    • 检查上游 DNS 服务器是否可达
    • 确认网络连接正常
    • 检查防火墙设置
  6. 全局命令不可用

    '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 - 事务 ID
    • questionBuf - 查询缓冲区
    • 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

本项目仅供学习和测试使用,请勿用于非法用途。