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:
WaterLemons2k
2023-06-21 17:52:35 +08:00
committed by GitHub
parent 37c567b957
commit 4d33865890
5 changed files with 24 additions and 6 deletions

View File

@ -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 变化

View File

@ -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)

View File

@ -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{}
}

View File

@ -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)
}

View File

@ -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"}