Files
godns/README.md
2026-01-06 02:25:24 +08:00

169 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# GoDNS
基于[NbDNS](https://github.com/naiba/nbdns)的个人修改版,并因为原名太过霸道而被迫改名。
以下内容来自原项目介绍。
:seal: 一个聪明的 DNS 中继器,可提升 DNS 解析准确性,自带管理面板,可替代 AdguardHome。
![截图](./doc/screenshot.png)
## 快速开始
1. 从 [releases](https://github.com/naiba/nbdns/releases) 下载最新版本
2. 下载 [china_ip_list.txt](https://github.com/17mon/china_ip_list/raw/master/china_ip_list.txt) 到 `data` 文件夹
3. 创建配置文件 `data/config.json`(参考下方配置示例)
4. 启动 `./godns`
5. 访问 `http://localhost:8854` 查看监控面板
6. DNS TCP/UDP `127.0.0.1:8853`, DoH `http://localhost:8854/dns-query`
**文件结构:**
```
|- godns
|- data
|- config.json
|- china_ip_list.txt
```
**测试命令:**
```bash
dig @127.0.0.1 -p 8853 www.baidu.com
dig @127.0.0.1 -p 8853 www.google.com
```
Windows 上的 [dig](https://help.dyn.com/how-to-use-binds-dig-tool/) 工具
## 配置示例
```json
{
"serve_addr": "127.0.0.1:8853",
"web_addr": "0.0.0.0:8854",
"strategy": 2,
"timeout": 4,
"built_in_cache": true,
"socks_proxy": "192.168.1.254:3838",
"bootstrap": [
{"address": "tcp://8.8.4.4:53"},
{"address": "tcp://1.0.0.1:53"}
],
"upstreams": [
{"address": "udp://223.5.5.5:53", "is_primary": true},
{"address": "udp://223.6.6.6:53", "is_primary": true},
{"address": "tcp-tls://dns.google:853", "use_socks": true},
{"address": "tcp-tls://one.one.one.one:853", "use_socks": true},
{"address": "https://user:pass@doh.example.com/dns-query", "match": [".onion"]}
],
"doh_server": {
"username": "admin",
"password": "secret"
},
"blacklist": [".bing.com"]
}
```
### 配置说明
| 字段 | 说明 | 默认值 |
| ---------------- | ---------------------------------------------------- | -------------- |
| `serve_addr` | DNS 服务监听地址 | 必填 |
| `web_addr` | Web 面板和 DoH 服务端口 | `0.0.0.0:8854` |
| `strategy` | 查询策略1-最全结果2-最快结果推荐3-任一结果 | `2` |
| `timeout` | 上游超时时间(秒) | `4` |
| `built_in_cache` | 启用内建缓存 | `false` |
| `socks_proxy` | SOCKS5 代理地址 | 可选 |
| `bootstrap` | Bootstrap DNS 服务器(仅支持 IP | 必填 |
| `upstreams` | 上游 DNS 列表 | 必填 |
| `doh_server` | DoH 服务配置 | 可选 |
| `blacklist` | 域名黑名单(强制使用非 primary DNS | 可选 |
**上游 DNS 配置:**
- `is_primary`: 标记国内 DNS
- `use_socks`: 通过 SOCKS5 代理连接
- `match`: 仅匹配特定域名后缀
**域名匹配规则:**
- `.` 匹配所有
- `a.com` 仅匹配 a.com
- `.a.com` 匹配 a.a.com, c.a.com, e.d.a.com 等
## 功能特性
### :chart_with_upwards_trend: Web 监控面板
访问 `http://localhost:8854` 查看:
- 运行时状态运行时长、内存、Goroutines、GC
- DNS 查询统计(总查询数、缓存命中率、失败数)
- 上游服务器状态(查询数、错误率、最后使用时间)
- Top 客户端 IP 和查询域名排行
- 统计数据重置功能
### :lock: DoH (DNS over HTTPS)
DoH 服务与 Web 面板共用端口,访问路径:`/dns-query`
**配置示例:**
```json
{
"doh_server": {
"username": "admin",
"password": "secret"
}
}
```
**测试:**
```bash
curl -v -H "Accept: application/dns-message" \
-u "user:password" \
"http://localhost:8854/dns-query?dns=AAABAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB"
```
**浏览器配置Firefox**
设置 → 网络设置 → 启用基于 HTTPS 的 DNS → 自定义 → `http://your-server:8854/dns-query`
## 部署
### :whale: Docker
```bash
docker run --name godns --restart always -d \
-v /path/to/data:/godns/data \
-p 8853:8853/udp \
-p 8854:8854 \
ghcr.io/xofine/godns
```
### :package: OpenWRT 自启动
首先在 release 下载对应的二进制解压 zip 包后放置到 `/root`,然后 `chmod -R 777 /root/godns` 赋予执行权限,然后创建 `/etc/init.d/godns`
```shell
#!/bin/sh /etc/rc.common
USE_PROCD=1
# After network starts
START=21
# Before network stops
STOP=89
cmd=/root/godns/godns
name=godns
pid_file="/var/run/${name}.pid"
start_service() {
echo "Starting ${name}"
procd_open_instance
procd_set_param command ${cmd}
procd_set_param respawn
# respawn automatically if something died, be careful if you have an alternative process supervisor
# if process exits sooner than respawn_threshold, it is considered crashed and after 5 retries the service is stopped
# if process finishes later than respawn_threshold, it is restarted unconditionally, regardless of error code
# notice that this is literal respawning of the process, no in a respawn-on-failure sense
procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5}
procd_set_param stdout 1 # forward stdout of the command to logd
procd_set_param stderr 1 # same for stderr
procd_set_param pidfile ${pid_file} # write a pid file on instance start and remove it on stop
procd_close_instance
echo "${name} has been started"
}
```
赋予执行权限 `chmod +x /etc/init.d/godns` 然后启动服务 `/etc/init.d/godns enable && /etc/init.d/godns start`