Skip to content

rinnein/tp2dns

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 

Repository files navigation

tp2dns

一个基于 DNS TXT 记录的轻量网关。

它会读取你提供的域名 TXT 记录,从中解析目标 URL,然后:

  • 默认执行 302 跳转到目标 URL
  • redirect=false 时返回目标 URL 字符串(不跳转)

适合做“域名配置驱动”的跳转入口,例如短链入口、灰度入口、多目标随机分流等。

功能概览

  • 只接受 GET 请求
  • 路由:/:domain/:key?
  • 支持两种 TXT 配置格式:
    • 空格分隔 URL 列表
    • Base64(TOML)(支持 key 精确匹配 + 权重随机)
  • 目标 URL 会经过 URL 格式校验
  • 自定义域名约束(FQDN)

目录结构

cloud-functions/
	index.go                  # Fiber 入口
	dns/query.go              # DNS TXT 查询
	tp-parser/tp-parser.go    # TXT 解析与目标选择
	custom-constraints/fqdn.go# 路由 fqdn 约束

运行方式

要求:Go 1.26+

cd cloud-functions
go mod tidy
go run index.go

默认监听:0.0.0.0:9000

健康检查(主页):

curl "http://127.0.0.1:9000/"

请求 API

1) 跳转请求

GET /:domain/:key?
  • domain:要查询 TXT 的域名,例如 example.com
  • key:可选参数
    • 在 Base64(TOML) 配置中,用于匹配 K
    • 在“空格分隔列表”配置中,可作为下标(从 0 开始)

示例:

curl -i "http://127.0.0.1:9000/example.com"
curl -i "http://127.0.0.1:9000/example.com/home"
curl -i "http://127.0.0.1:9000/example.com/1"

2) 返回 URL 而非重定向

redirect 为布尔参数,默认是 true

  • redirect=true:执行跳转
  • redirect=false:返回原始 URL 字符串

示例:

curl "http://127.0.0.1:9000/example.com?redirect=true"
curl "http://127.0.0.1:9000/example.com?redirect=false"

TXT 记录格式

格式 A:空格分隔 URL

TXT 内容示例:

https://a.example.com https://b.example.com https://c.example.com

行为:

  • 不带 key:返回第一个 URL
  • key 为合法下标(如 01):返回对应 URL
  • 其他情况:回退到第一个 URL

格式 B:Base64(TOML)(推荐)

该格式要求:先写 TOML,再把 TOML 文本做 Base64 编码,最终把 Base64 字符串写入 TXT。

TOML 原文示例(注意字段名是大写 U/K/V/W):

[[U]]
K = "home"
V = "https://www.example.com/"
W = 80

[[U]]
K = "docs"
V = "https://docs.example.com/"
W = 20

将以上 TOML 编码成 Base64 后,写入 TXT(示意):

W1tVXQpLID0gImhvbWUiClYgPSAiaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vIgpXID0gODAK...

字段说明:

  • K:key
  • V:目标 URL
  • W:权重(无符号整数)

行为:

  • key 且命中 K:返回对应 V
  • 未命中 key:按所有 W 做加权随机
  • 若权重总和为 0:返回第一条 U[0].V

状态码与错误

  • 成功重定向:302
  • 成功返回 URL 字符串:200
  • 解析或校验失败:400
    • 例如 DNS 查询失败、URL 非法等

注意事项

  • 仅支持 GET,请勿用 POST/PUT。
  • 若目标 URL 不是 http:https:,服务会直接返回字符串,不会重定向。
  • redirect 建议只传 true/false,非法布尔值会按 false 处理。
  • 使用加权随机时,请确保 W 配置合理。

快速示例

如果 example.com 的 TXT 是下面 TOML 的 Base64 结果:

[[U]]
K = "gh"
V = "https://github.com/rinnein"
W = 1

则:

  • GET /example.com/gh -> 跳转到 GitHub
  • GET /example.com/gh?redirect=false -> 返回 https://github.com/rinnein

License

AGPL-3.0(见 LICENSE

About

A gateway to redirect to url specified by a txt record.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages