Skip to content

Commit

Permalink
fix: set DNS server when err contains loopback server (#748)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
WaterLemons2k authored Jun 21, 2023
1 parent 37c567b commit 4d33865
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 6 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 变化

Expand Down
17 changes: 17 additions & 0 deletions dns/wait_net.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package dns

import (
"log"
"os"
"strings"
"time"

"github.com/jeessy2/ddns-go/v5/util"
Expand All @@ -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)
Expand Down
5 changes: 3 additions & 2 deletions util/dns.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand All @@ -19,5 +19,6 @@ func customDNSResolver() *net.Resolver {
},
}
}

return &net.Resolver{}
}
2 changes: 1 addition & 1 deletion util/dns_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand Down
4 changes: 2 additions & 2 deletions util/http_client_util.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand Down Expand Up @@ -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"}
Expand Down

0 comments on commit 4d33865

Please sign in to comment.