mirror of
https://github.com/jeessy2/ddns-go.git
synced 2025-10-20 15:33:46 +08:00
fix: set DNS server when err contains loopback server (#748)
* docs: android needs a custom DNS server * fix: set DNS server when is Termux * fix: set DNS server when err contains `[::1]:53` * docs: indicates that a DNS server wii be sets if err contains loopback server
This commit is contained in:
@ -47,7 +47,7 @@
|
||||
- [可选] 服务卸载
|
||||
- Mac/Linux: `sudo ./ddns-go -s uninstall`
|
||||
- Win(以管理员打开cmd): `.\ddns-go.exe -s uninstall`
|
||||
- [可选] 支持安装或启动时带参数 `-l`监听地址 `-f`同步间隔时间(秒) `-cacheTimes`间隔N次与服务商比对 `-c`自定义配置文件路径 `-noweb`不启动web服务 `-skipVerify`跳过证书验证。如:`./ddns-go -s install -l :9877 -f 600 -c /Users/name/ddns-go.yaml`
|
||||
- [可选] 支持安装或启动时带参数 `-l`监听地址 `-f`同步间隔时间(秒) `-cacheTimes`间隔N次与服务商比对 `-c`自定义配置文件路径 `-noweb`不启动web服务 `-skipVerify`跳过证书验证 `-dns` 自定义 DNS 服务器。如:`./ddns-go -s install -l :9877 -f 600 -c /Users/name/ddns-go.yaml`
|
||||
|
||||
> **Note** 通过合理的配置 `-f` 和 `-cacheTimes` 可以实现 IP 变化即时触发更新且不会被 DDNS 服务商限流, 例如 `-f 10 -cacheTimes 360` 效果为每 10 秒检查一次本地 IP 变化, 每小时去公网对比一下 IP 变化
|
||||
|
||||
|
@ -2,6 +2,8 @@ package dns
|
||||
|
||||
import (
|
||||
"log"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/jeessy2/ddns-go/v5/util"
|
||||
@ -25,12 +27,27 @@ func waitForNetworkConnected() {
|
||||
tencentCloudEndPoint,
|
||||
}
|
||||
|
||||
loopbackServer := "[::1]:53"
|
||||
find := false
|
||||
|
||||
for {
|
||||
for _, addr := range addresses {
|
||||
// https://github.com/jeessy2/ddns-go/issues/736
|
||||
client := util.CreateHTTPClient()
|
||||
resp, err := client.Get(addr)
|
||||
if err != nil {
|
||||
|
||||
// 如果 err 包含回环地址([::1]:53)则表示没有 DNS 服务器,设置 DNS 服务器
|
||||
if strings.Contains(err.Error(), loopbackServer) && !find {
|
||||
server := "1.1.1.1:53"
|
||||
log.Printf("解析回环地址 %s 失败!将默认使用 %s,可参考文档通过 -dns 自定义 DNS 服务器",
|
||||
loopbackServer, server)
|
||||
|
||||
os.Setenv(util.DNSServerEnv, server)
|
||||
find = true
|
||||
continue
|
||||
}
|
||||
|
||||
log.Printf("等待网络连接:%s。%s 后重试...", err, timeout)
|
||||
// 等待 5 秒后重试
|
||||
time.Sleep(timeout)
|
||||
|
@ -8,8 +8,8 @@ import (
|
||||
|
||||
const DNSServerEnv = "DDNS_GO_DNS_SERVER"
|
||||
|
||||
// customDNSResolver 当 DNSServerEnv 值不为空时,使用 Go 内置 DNS 解析器来解析其 DNS 服务器。
|
||||
func customDNSResolver() *net.Resolver {
|
||||
// CustomDNSResolver 当 DNSServerEnv 值不为空时,使用 Go 内置 DNS 解析器来解析其 DNS 服务器。
|
||||
func CustomDNSResolver() *net.Resolver {
|
||||
s := os.Getenv(DNSServerEnv)
|
||||
if s != "" {
|
||||
return &net.Resolver{
|
||||
@ -19,5 +19,6 @@ func customDNSResolver() *net.Resolver {
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
return &net.Resolver{}
|
||||
}
|
||||
|
@ -9,7 +9,7 @@ import (
|
||||
// TestCustomDNSResolver 测试能否通过 DNSServerEnv 值的 DNS 服务器解析域名的 IP。
|
||||
func TestCustomDNSResolver(t *testing.T) {
|
||||
os.Setenv(DNSServerEnv, "1.1.1.1:53")
|
||||
_, err := customDNSResolver().LookupIP(context.Background(), "ip", "cloudflare.com")
|
||||
_, err := CustomDNSResolver().LookupIP(context.Background(), "ip", "cloudflare.com")
|
||||
if err != nil {
|
||||
t.Errorf("Failed to lookup IP, err: %v", err)
|
||||
}
|
||||
|
@ -31,7 +31,7 @@ var defaultTransport = &http.Transport{
|
||||
|
||||
// CreateHTTPClient Create Default HTTP Client
|
||||
func CreateHTTPClient() *http.Client {
|
||||
dialer.Resolver = customDNSResolver()
|
||||
dialer.Resolver = CustomDNSResolver()
|
||||
// SkipVerfiry
|
||||
defaultTransport.TLSClientConfig = &tls.Config{InsecureSkipVerify: os.Getenv(SkipVerifyENV) == "true"}
|
||||
return &http.Client{
|
||||
@ -74,7 +74,7 @@ var noProxyTcp6Transport = &http.Transport{
|
||||
|
||||
// CreateNoProxyHTTPClient Create NoProxy HTTP Client
|
||||
func CreateNoProxyHTTPClient(network string) *http.Client {
|
||||
dialer.Resolver = customDNSResolver()
|
||||
dialer.Resolver = CustomDNSResolver()
|
||||
if network == "tcp6" {
|
||||
// SkipVerfiry
|
||||
noProxyTcp6Transport.TLSClientConfig = &tls.Config{InsecureSkipVerify: os.Getenv(SkipVerifyENV) == "true"}
|
||||
|
Reference in New Issue
Block a user