增加自定义DNS解析器

This commit is contained in:
2025-03-13 17:40:01 +08:00
parent a08ea9c999
commit d3b7020065
20 changed files with 1774 additions and 10 deletions

View File

@@ -0,0 +1,151 @@
package main
import (
"flag"
"log"
"net/http"
"time"
"github.com/goproxy/internal/config"
"github.com/goproxy/internal/dns"
"github.com/goproxy/internal/proxy"
)
// CustomDNSDelegate HTTPS代理委托
type CustomDNSDelegate struct {
proxy.DefaultDelegate
targetHost string
targetPort string
resolver dns.Resolver
}
// ModifyRequest 修改请求头
func (d *CustomDNSDelegate) ModifyRequest(req *http.Request) {
log.Printf("收到请求: %s %s", req.Method, req.URL.String())
// 设置标准浏览器请求头
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/122.0.0.0 Safari/537.36")
req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8")
req.Header.Set("Connection", "keep-alive")
// 设置Host头
req.Host = d.targetHost
// 设置请求的URL方案为HTTPS
req.URL.Scheme = "https"
log.Printf("修改后的请求: %s %s", req.Method, req.URL.String())
}
// ModifyResponse 修改响应头
func (d *CustomDNSDelegate) ModifyResponse(resp *http.Response) error {
log.Printf("收到响应: %d %s", resp.StatusCode, resp.Status)
// 添加CORS头和代理标识
resp.Header.Set("Access-Control-Allow-Origin", "*")
resp.Header.Set("X-Proxied-By", "GoProxy-CustomDNS-HTTPS")
return nil
}
// ResolveBackend 解析后端服务器
func (d *CustomDNSDelegate) ResolveBackend(req *http.Request) (string, error) {
// 直接返回目标地址和端口
address := d.targetHost + ":" + d.targetPort
log.Printf("连接到目标服务器: %s", address)
return address, nil
}
func main() {
// 命令行参数
listenAddr := flag.String("listen", ":8443", "监听地址")
targetHost := flag.String("target", "www.github.com", "目标站点主机名")
targetPort := flag.String("port", "443", "目标站点端口")
certFile := flag.String("cert", "server.crt", "证书文件路径")
keyFile := flag.String("key", "server.key", "密钥文件路径")
dnsFile := flag.String("dns", "", "DNS配置文件路径 (JSON格式)")
hostsFile := flag.String("hosts", "", "Hosts文件路径")
flag.Parse()
// 创建DNS解析器
var resolver dns.Resolver
var err error
if *dnsFile != "" {
// 从JSON文件加载DNS配置
dnsConfig, err := dns.LoadFromJSON(*dnsFile)
if err != nil {
log.Printf("加载DNS配置文件失败: %v将使用默认DNS解析器", err)
resolver = dns.NewResolver()
} else {
resolver = dns.NewResolverFromConfig(dnsConfig)
log.Printf("已加载DNS配置包含 %d 条记录", len(dnsConfig.Records))
}
} else if *hostsFile != "" {
// 从hosts文件加载DNS配置
dnsConfig, err := dns.LoadFromHostsFile(*hostsFile)
if err != nil {
log.Printf("加载hosts文件失败: %v将使用默认DNS解析器", err)
resolver = dns.NewResolver()
} else {
resolver = dns.NewResolverFromConfig(dnsConfig)
log.Printf("已加载hosts文件包含 %d 条记录", len(dnsConfig.Records))
}
} else {
// 创建默认解析器
resolver = dns.NewResolver()
// 添加一些示例记录
resolver.Add("www.github.com", "140.82.121.3")
resolver.Add("github.com", "140.82.121.4")
resolver.Add("api.github.com", "140.82.121.5")
}
// 创建自定义DNS拨号器
dnsDialer := dns.NewDialer(resolver)
// 创建配置
cfg := config.DefaultConfig()
cfg.ReverseProxy = true // 启用反向代理模式
cfg.DecryptHTTPS = false // 不解密HTTPS流量避免TLS问题
cfg.IdleTimeout = 30 * time.Second // 连接空闲超时
cfg.AddXForwardedFor = true // 添加X-Forwarded-For头
cfg.AddXRealIP = true // 添加X-Real-IP头
cfg.SupportWebSocketUpgrade = true // 支持WebSocket升级
cfg.EnableCompression = false // 不启用压缩
cfg.EnableCORS = true // 启用CORS
cfg.EnableRetry = false // 关闭重试功能
cfg.EnableConnectionPool = false // 禁用连接池
// 创建自定义委托
delegate := &CustomDNSDelegate{
targetHost: *targetHost,
targetPort: *targetPort,
resolver: resolver,
}
// 创建代理实例
p := proxy.New(&proxy.Options{
Config: cfg,
Delegate: delegate,
})
// 设置自定义拨号器
p.SetDialContext(dnsDialer.DialContext)
// 创建HTTPS服务器
server := &http.Server{
Addr: *listenAddr,
Handler: p,
}
// 启动HTTPS服务器
log.Printf("自定义DNS HTTPS代理启动监听地址: %s目标: https://%s:%s",
*listenAddr, *targetHost, *targetPort)
err = server.ListenAndServeTLS(*certFile, *keyFile)
if err != nil {
log.Fatalf("服务器启动失败: %v", err)
}
}