/ts-dns

Telescope DNS,简单易用的DNS分组/转发器

Primary LanguageGoMIT LicenseMIT

Telescope DNS

GitHub release (latest by date) Build Status codecov Go Report Card GitHub

简单易用的DNS分组/转发器

基本特性

  • 默认基于CN IP列表 + GFWList进行域名分组;
  • 支持DNS over UDP/TCP/TLS/HTTPS、非标准端口DNS;
  • 支持选择ping值最低的IPv4地址;
  • 支持并发请求/socks5代理请求上游DNS;
  • 支持多Hosts文件 + 自定义Hosts;
  • 支持配置文件自动重载;
  • 支持DNS查询缓存(TTL倒计时、ECS缓存);
  • 支持将查询结果添加至IPSet。

DNS查询请求处理流程

  1. 当域名匹配指定规则(配置文件里各组的rules)时,将请求转发至对应组上游DNS并直接返回;
  2. 如未匹配规则,则假设域名为clean组,向clean组的上游DNS转发查询请求,并做如下判断:
    • 如果查询结果中所有IPv4地址均为CN IP,则直接返回;
    • 如果查询结果中出现非CN IP,进一步判断:
      • 如果该域名匹配GFWList列表,则向dirty组的上游DNS转发查询请求并返回;
      • 否则返回查询结果。

使用说明

  1. Releases页面下载对应系统和平台的压缩包;
  2. 解压后按需求编辑配置文件ts-dns.toml(可选)并运行进程:
# ./ts-dns -c ts-dns.toml  # 指定配置文件名
# ./ts-dns -r  # 自动重载配置文件
./ts-dns

配置示例

完整配置文件参见ts-dns.full.toml

  1. 默认配置(ts-dns.toml),开箱即用
listen = ":53"
gfwlist = "gfwlist.txt"
cnip = "cnip.txt"

[groups]
  [groups.clean]
  dns = ["119.29.29.29", "223.5.5.5", "114.114.114.114"]
  concurrent = true

  [groups.dirty]
  dns = [""]  # 省略
  1. 选择ping值最低的IPv4地址(启用时建议以root权限运行本程序)
# ...
[groups.clean]
  dns = ["119.29.29.29", "223.5.5.5", "114.114.114.114"]
  fastest_v4 = true
# ...
  1. 指定hosts文件和自定义hosts
# ...
hosts_files = ["adaway.txt"]
[hosts]
"www.example.com" = "1.1.1.1"
# ...
  1. 使用socks5代理转发DNS请求
# ...
  [groups.dirty]
  socks5 = "127.0.0.1:1080"
  # ...
  1. 自定义域名分组
# ...
  [groups.work]
  dns = ["10.1.1.1"]
  rules = ["company.com"]
  # ...
  1. 动态添加IPSet记录(使用前请阅读ts-dns.full.toml对应说明)
# ...
  [groups.dirty]
  ipset = "blocked"
  ipset_ttl = 86400
  # ...

TODO

  • 理清ipv4/ipv6支持
  • 完善日志记录
  • 设置fallback DNS
  • 使用ECS转发DNS请求

特别鸣谢