Compare commits

...

24 Commits

Author SHA1 Message Date
Star Brilliant
51b065eed7 Release 1.3.6 2018-05-27 21:03:51 +08:00
Star Brilliant
a58607dc3d Add an option to disable IPv6, this option is available to client only 2018-05-27 21:00:13 +08:00
Star Brilliant
cf94354b08 Revert "Conflict with systemd-resolved.service"
This reverts commit 88b3c95710.
2018-05-15 19:46:04 +08:00
Star Brilliant
f2e3a642e3 Write a logger for macOS systems 2018-05-08 21:11:03 +08:00
Star Brilliant
88b3c95710 Conflict with systemd-resolved.service 2018-04-29 22:30:43 +08:00
Star Brilliant
93b70f3941 Release 1.3.5 2018-04-27 00:39:48 +08:00
Star Brilliant
76c40fb4dc Bump version to 1.3.5 2018-04-26 23:52:59 +08:00
Star Brilliant
174a465ac8 Limit the frequency of creating HTTP client 2018-04-26 23:52:35 +08:00
Star Brilliant
4cbe7c8c98 Release 1.3.4 2018-04-26 10:33:38 +08:00
Star Brilliant
7839d2c7b1 Bump version to 1.3.4 2018-04-26 10:18:36 +08:00
Star Brilliant
c4b2236cf9 Do not respond to network error, silently fail to prevent caching of SERVFAIL
Hopefully we can improve the availability of DoH under unstable network environments.
2018-04-26 10:17:14 +08:00
Star Brilliant
1b90731f20 Add version.go to Makefile 2018-04-25 18:36:06 +08:00
Star Brilliant
20624acf20 Update documents 2018-04-25 14:23:24 +08:00
Star Brilliant
01385b6d29 Update documents 2018-04-25 14:19:40 +08:00
Star Brilliant
5afdee6315 Put EDNS0 at the beginning of the OPT section 2018-04-25 03:05:06 +08:00
Star Brilliant
874a3613e4 Use dns.DefaultMsgSize instead of magic number 4096 2018-04-25 03:04:31 +08:00
Star Brilliant
dc14a70e9d Use dns.DefaultMsgSize instead of magic number 4096 2018-04-24 20:46:34 +08:00
Star Brilliant
58e4018ab2 Rename variables 2018-04-24 20:43:24 +08:00
Star Brilliant
f4516429ee Take User-Agent out of common library, that would be better for packaging 2018-04-24 14:25:33 +08:00
Star Brilliant
12df47f45f Release 1.3.2 2018-04-17 03:28:36 +08:00
Star Brilliant
450c10a594 Fix version number in User-Agent 2018-04-17 03:27:42 +08:00
Star Brilliant
e7c4450787 Fix build system 2018-04-17 03:27:21 +08:00
Star Brilliant
bd5ef5d61e Fix build 2018-04-16 21:36:26 +08:00
Star Brilliant
ff0e9529cb Update User-Agent 2018-04-16 21:35:33 +08:00
17 changed files with 274 additions and 38 deletions

View File

@@ -4,6 +4,30 @@ This Changelog records major changes between versions.
Not all changes are recorded. Please check git log for details. Not all changes are recorded. Please check git log for details.
## Version 1.3.6
- We have a logger for macOS platform now, so logs can be sent to Console.app
- Add an option to disable IPv6, this option is available to client only
## Version 1.3.5
- Limit the frequency of creating HTTP client on bad network condition
## Version 1.3.4
- doh-client now silently fails in case of network error to prevent caching of SERVFAIL
- EDNS0 is now inserted to the beginning of OPT section, to ensure DNSSEC signatures are at the end
- Improve building system
- Update documents
## Version 1.3.3
- Take User-Agent out of common library, that would be better for packaging
## Version 1.3.2
- Fix version string in HTTP User-Agent
## Version 1.3.1 ## Version 1.3.1
- Fix the "address already in use" issue - Fix the "address already in use" issue

View File

@@ -2,6 +2,7 @@
GOBUILD=go build GOBUILD=go build
GOGET=go get -d -v GOGET=go get -d -v
GOGET_UPDATE=go get -d -u -v
PREFIX=/usr/local PREFIX=/usr/local
ifeq ($(shell uname),Darwin) ifeq ($(shell uname),Darwin)
CONFDIR=/usr/local/etc/dns-over-https CONFDIR=/usr/local/etc/dns-over-https
@@ -10,9 +11,15 @@ else
endif endif
all: doh-client/doh-client doh-server/doh-server all: doh-client/doh-client doh-server/doh-server
if [ "`uname`" = "Darwin" ]; then \
$(MAKE) -C darwin-wrapper; \
fi
clean: clean:
rm -f doh-client/doh-client doh-server/doh-server rm -f doh-client/doh-client doh-server/doh-server
if [ "`uname`" = "Darwin" ]; then \
$(MAKE) -C darwin-wrapper clean; \
fi
install: install:
[ -e doh-client/doh-client ] || $(MAKE) doh-client/doh-client [ -e doh-client/doh-client ] || $(MAKE) doh-client/doh-client
@@ -27,6 +34,7 @@ install:
$(MAKE) -C systemd install "DESTDIR=$(DESTDIR)"; \ $(MAKE) -C systemd install "DESTDIR=$(DESTDIR)"; \
$(MAKE) -C NetworkManager install "DESTDIR=$(DESTDIR)"; \ $(MAKE) -C NetworkManager install "DESTDIR=$(DESTDIR)"; \
elif [ "`uname`" = "Darwin" ]; then \ elif [ "`uname`" = "Darwin" ]; then \
$(MAKE) -C darwin-wrapper install "DESTDIR=$(DESTDIR)" "PREFIX=$(PREFIX)"; \
$(MAKE) -C launchd install "DESTDIR=$(DESTDIR)"; \ $(MAKE) -C launchd install "DESTDIR=$(DESTDIR)"; \
fi fi
@@ -40,10 +48,12 @@ uninstall:
fi fi
deps: deps:
@# I am not sure if it is the correct way to keep the common library updated
$(GOGET_UPDATE) github.com/m13253/dns-over-https/json-dns
$(GOGET) ./doh-client ./doh-server $(GOGET) ./doh-client ./doh-server
doh-client/doh-client: deps doh-client/client.go doh-client/config.go doh-client/google.go doh-client/ietf.go doh-client/main.go json-dns/error.go json-dns/globalip.go json-dns/marshal.go json-dns/response.go json-dns/unmarshal.go doh-client/doh-client: deps doh-client/client.go doh-client/config.go doh-client/google.go doh-client/ietf.go doh-client/main.go doh-client/version.go json-dns/error.go json-dns/globalip.go json-dns/marshal.go json-dns/response.go json-dns/unmarshal.go
cd doh-client && $(GOBUILD) cd doh-client && $(GOBUILD)
doh-server/doh-server: deps doh-server/config.go doh-server/google.go doh-server/ietf.go doh-server/main.go doh-server/server.go json-dns/error.go json-dns/globalip.go json-dns/marshal.go json-dns/response.go json-dns/unmarshal.go doh-server/doh-server: deps doh-server/config.go doh-server/google.go doh-server/ietf.go doh-server/main.go doh-server/server.go doh-server/version.go json-dns/error.go json-dns/globalip.go json-dns/marshal.go json-dns/response.go json-dns/unmarshal.go
cd doh-server && $(GOBUILD) cd doh-server && $(GOBUILD)

View File

@@ -70,6 +70,9 @@ The following is a typical DNS-over-HTTPS architecture:
Although DNS-over-HTTPS can work alone, a HTTP service muxer would be useful as Although DNS-over-HTTPS can work alone, a HTTP service muxer would be useful as
you can host DNS-over-HTTPS along with other HTTPS services. you can host DNS-over-HTTPS along with other HTTPS services.
HTTP/2 with at least TLS v1.3 is recommended. OCSP stapling must be enabled,
otherwise DNS recursion may happen.
## DNSSEC ## DNSSEC
DNS-over-HTTPS is compatible with DNSSEC, and requests DNSSEC signatures by DNS-over-HTTPS is compatible with DNSSEC, and requests DNSSEC signatures by
@@ -90,8 +93,10 @@ EDNS0-Client-Subnet is affecting your privacy, you can set `no_ecs = true` in
`/etc/dns-over-https/doh-client.conf`, with the cost of slower video streaming `/etc/dns-over-https/doh-client.conf`, with the cost of slower video streaming
or software downloading speed. or software downloading speed.
If your server is backed by `unbound` or `bind`, you probably want to enable To ultilize ECS, `X-Forwarded-For` or `X-Real-IP` should be enabled on your
the EDNS0-Client-Subnet feature in their configuration files as well. HTTP service muxer. If your server is backed by `unbound` or `bind`, you
probably want to configure it to enable the EDNS0-Client-Subnet feature as
well.
## Protocol compatibility ## Protocol compatibility

19
darwin-wrapper/Makefile Normal file
View File

@@ -0,0 +1,19 @@
.PHONY: all clean install uninstall
SWIFTC = swiftc
PREFIX = /usr/local
all: doh-logger
doh-logger: doh-logger.swift
$(SWIFTC) -o $@ -O $<
clean:
rm -f doh-logger
install: doh-logger
mkdir -p $(DESTDIR)$(PREFIX)/bin
install -m0755 doh-logger $(DESTDIR)$(PREFIX)/bin
uninstall:
rm -f $(DESTDIR)$(PREFIX)/bin/doh-logger

View File

@@ -0,0 +1,94 @@
#!/usr/bin/swift
/*
DNS-over-HTTPS
Copyright (C) 2017-2018 Star Brilliant <m13253@hotmail.com>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
import Foundation
import os.log
if CommandLine.arguments.count < 3 {
let programName = CommandLine.arguments[0]
print("Usage: \(programName) LOG_NAME PROGRAM [ARGUMENTS]\n")
exit(1)
}
let logSubsystem = CommandLine.arguments[1]
let logger = OSLog(subsystem: logSubsystem, category: "default")
let pipe = Pipe()
var buffer = Data()
NotificationCenter.default.addObserver(forName: FileHandle.readCompletionNotification, object: pipe.fileHandleForReading, queue: nil) { notification in
let data = notification.userInfo?["NSFileHandleNotificationDataItem"] as? Data ?? Data()
buffer.append(data)
var lastIndex = 0
for (i, byte) in buffer.enumerated() {
if byte == 0x0a {
let line = String(data: buffer.subdata(in: lastIndex..<i), encoding: .utf8) ?? ""
print(line)
os_log("%{public}@", log: logger, line)
lastIndex = i + 1
}
}
buffer = buffer.subdata(in: lastIndex..<buffer.count)
if data.count == 0 && buffer.count != 0 {
let line = String(data: buffer, encoding: .utf8) ?? ""
print(line, terminator: "")
os_log("%{public}@", log: logger, line)
}
pipe.fileHandleForReading.readInBackgroundAndNotify()
}
pipe.fileHandleForReading.readInBackgroundAndNotify()
let process = Process()
process.arguments = Array(CommandLine.arguments[3...])
process.executableURL = URL(fileURLWithPath: CommandLine.arguments[2])
process.standardError = pipe.fileHandleForWriting
process.standardInput = FileHandle.standardInput
process.standardOutput = pipe.fileHandleForWriting
NotificationCenter.default.addObserver(forName: Process.didTerminateNotification, object: process, queue: nil) { notification in
if buffer.count != 0 {
let line = String(data: buffer, encoding: .utf8) ?? ""
print(line, terminator: "")
os_log("%{public}@", log: logger, line)
}
exit(process.terminationStatus)
}
let SIGINTSource = DispatchSource.makeSignalSource(signal: SIGINT)
let SIGTERMSource = DispatchSource.makeSignalSource(signal: SIGTERM)
SIGINTSource.setEventHandler(handler: process.interrupt)
SIGTERMSource.setEventHandler(handler: process.terminate)
signal(SIGINT, SIG_IGN)
signal(SIGTERM, SIG_IGN)
SIGINTSource.resume()
SIGTERMSource.resume()
do {
try process.run()
} catch {
let errorMessage = error.localizedDescription
print(errorMessage)
os_log("%{public}@", log: logger, type: .fault, errorMessage)
exit(1)
}
RunLoop.current.run()

View File

@@ -40,15 +40,16 @@ import (
) )
type Client struct { type Client struct {
conf *config conf *config
bootstrap []string bootstrap []string
udpServers []*dns.Server udpServers []*dns.Server
tcpServers []*dns.Server tcpServers []*dns.Server
bootstrapResolver *net.Resolver bootstrapResolver *net.Resolver
cookieJar *cookiejar.Jar cookieJar *cookiejar.Jar
httpClientMux *sync.RWMutex httpClientMux *sync.RWMutex
httpTransport *http.Transport httpTransport *http.Transport
httpClient *http.Client httpClient *http.Client
httpClientLastCreate time.Time
} }
type DNSRequest struct { type DNSRequest struct {
@@ -65,19 +66,19 @@ func NewClient(conf *config) (c *Client, err error) {
conf: conf, conf: conf,
} }
udpH := dns.HandlerFunc(c.udpHandlerFunc) udpHandler := dns.HandlerFunc(c.udpHandlerFunc)
tcpH := dns.HandlerFunc(c.tcpHandlerFunc) tcpHandler := dns.HandlerFunc(c.tcpHandlerFunc)
for _, addr := range conf.Listen { for _, addr := range conf.Listen {
c.udpServers = append(c.udpServers, &dns.Server{ c.udpServers = append(c.udpServers, &dns.Server{
Addr: addr, Addr: addr,
Net: "udp", Net: "udp",
Handler: udpH, Handler: udpHandler,
UDPSize: 4096, UDPSize: dns.DefaultMsgSize,
}) })
c.tcpServers = append(c.tcpServers, &dns.Server{ c.tcpServers = append(c.tcpServers, &dns.Server{
Addr: addr, Addr: addr,
Net: "tcp", Net: "tcp",
Handler: tcpH, Handler: tcpHandler,
}) })
} }
c.bootstrapResolver = net.DefaultResolver c.bootstrapResolver = net.DefaultResolver
@@ -124,16 +125,20 @@ func NewClient(conf *config) (c *Client, err error) {
func (c *Client) newHTTPClient() error { func (c *Client) newHTTPClient() error {
c.httpClientMux.Lock() c.httpClientMux.Lock()
defer c.httpClientMux.Unlock() defer c.httpClientMux.Unlock()
if !c.httpClientLastCreate.IsZero() && time.Now().Sub(c.httpClientLastCreate) < time.Duration(c.conf.Timeout)*time.Second {
return nil
}
if c.httpTransport != nil { if c.httpTransport != nil {
c.httpTransport.CloseIdleConnections() c.httpTransport.CloseIdleConnections()
} }
dialer := &net.Dialer{
Timeout: time.Duration(c.conf.Timeout) * time.Second,
KeepAlive: 30 * time.Second,
DualStack: true,
Resolver: c.bootstrapResolver,
}
c.httpTransport = &http.Transport{ c.httpTransport = &http.Transport{
DialContext: (&net.Dialer{ DialContext: dialer.DialContext,
Timeout: time.Duration(c.conf.Timeout) * time.Second,
KeepAlive: 30 * time.Second,
DualStack: true,
Resolver: c.bootstrapResolver,
}).DialContext,
ExpectContinueTimeout: 1 * time.Second, ExpectContinueTimeout: 1 * time.Second,
IdleConnTimeout: 90 * time.Second, IdleConnTimeout: 90 * time.Second,
MaxIdleConns: 100, MaxIdleConns: 100,
@@ -142,6 +147,14 @@ func (c *Client) newHTTPClient() error {
ResponseHeaderTimeout: time.Duration(c.conf.Timeout) * time.Second, ResponseHeaderTimeout: time.Duration(c.conf.Timeout) * time.Second,
TLSHandshakeTimeout: time.Duration(c.conf.Timeout) * time.Second, TLSHandshakeTimeout: time.Duration(c.conf.Timeout) * time.Second,
} }
if c.conf.NoIPv6 {
c.httpTransport.DialContext = func(ctx context.Context, network, address string) (net.Conn, error) {
if strings.HasPrefix(network, "tcp") {
network = "tcp4"
}
return dialer.DialContext(ctx, network, address)
}
}
err := http2.ConfigureTransport(c.httpTransport) err := http2.ConfigureTransport(c.httpTransport)
if err != nil { if err != nil {
return err return err
@@ -150,6 +163,7 @@ func (c *Client) newHTTPClient() error {
Transport: c.httpTransport, Transport: c.httpTransport,
Jar: c.cookieJar, Jar: c.cookieJar,
} }
c.httpClientLastCreate = time.Now()
return nil return nil
} }

View File

@@ -37,6 +37,7 @@ type config struct {
Timeout uint `toml:"timeout"` Timeout uint `toml:"timeout"`
NoCookies bool `toml:"no_cookies"` NoCookies bool `toml:"no_cookies"`
NoECS bool `toml:"no_ecs"` NoECS bool `toml:"no_ecs"`
NoIPv6 bool `toml:"no_ipv6"`
Verbose bool `toml:"verbose"` Verbose bool `toml:"verbose"`
} }

View File

@@ -47,7 +47,7 @@ bootstrap = [
] ]
# Timeout for upstream request # Timeout for upstream request
timeout = 10 timeout = 30
# Disable HTTP Cookies # Disable HTTP Cookies
# #
@@ -65,5 +65,13 @@ no_cookies = false
# the same configuration as most public DNS servers. # the same configuration as most public DNS servers.
no_ecs = false no_ecs = false
# Disable IPv6 when querying upstream
#
# Only enable this if you really have trouble connecting.
# Doh-client uses both IPv4 and IPv6 by default and should not have problems
# with an IPv4-only environment.
# Note that DNS listening and bootstrapping is not controlled by this option.
no_ipv6 = false
# Enable logging # Enable logging
verbose = false verbose = false

View File

@@ -92,7 +92,7 @@ func (c *Client) generateRequestGoogle(w dns.ResponseWriter, r *dns.Msg, isTCP b
} }
} }
req.Header.Set("Accept", "application/json, application/dns-message, application/dns-udpwireformat") req.Header.Set("Accept", "application/json, application/dns-message, application/dns-udpwireformat")
req.Header.Set("User-Agent", "DNS-over-HTTPS/1.1 (+https://github.com/m13253/dns-over-https)") req.Header.Set("User-Agent", USER_AGENT)
c.httpClientMux.RLock() c.httpClientMux.RLock()
resp, err := c.httpClient.Do(req) resp, err := c.httpClient.Do(req)
c.httpClientMux.RUnlock() c.httpClientMux.RUnlock()

View File

@@ -73,9 +73,9 @@ func (c *Client) generateRequestIETF(w dns.ResponseWriter, r *dns.Msg, isTCP boo
opt = new(dns.OPT) opt = new(dns.OPT)
opt.Hdr.Name = "." opt.Hdr.Name = "."
opt.Hdr.Rrtype = dns.TypeOPT opt.Hdr.Rrtype = dns.TypeOPT
opt.SetUDPSize(4096) opt.SetUDPSize(dns.DefaultMsgSize)
opt.SetDo(false) opt.SetDo(false)
r.Extra = append(r.Extra, opt) r.Extra = append([]dns.RR{opt}, r.Extra...)
} else { } else {
udpSize = opt.UDPSize() udpSize = opt.UDPSize()
} }
@@ -134,9 +134,8 @@ func (c *Client) generateRequestIETF(w dns.ResponseWriter, r *dns.Msg, isTCP boo
if len(requestURL) < 2048 { if len(requestURL) < 2048 {
req, err = http.NewRequest("GET", requestURL, nil) req, err = http.NewRequest("GET", requestURL, nil)
if err != nil { if err != nil {
// Do not respond, silently fail to prevent caching of SERVFAIL
log.Println(err) log.Println(err)
reply.Rcode = dns.RcodeServerFailure
w.WriteMsg(reply)
return &DNSRequest{ return &DNSRequest{
err: err, err: err,
} }
@@ -144,9 +143,8 @@ func (c *Client) generateRequestIETF(w dns.ResponseWriter, r *dns.Msg, isTCP boo
} else { } else {
req, err = http.NewRequest("POST", upstream, bytes.NewReader(requestBinary)) req, err = http.NewRequest("POST", upstream, bytes.NewReader(requestBinary))
if err != nil { if err != nil {
// Do not respond, silently fail to prevent caching of SERVFAIL
log.Println(err) log.Println(err)
reply.Rcode = dns.RcodeServerFailure
w.WriteMsg(reply)
return &DNSRequest{ return &DNSRequest{
err: err, err: err,
} }
@@ -154,7 +152,7 @@ func (c *Client) generateRequestIETF(w dns.ResponseWriter, r *dns.Msg, isTCP boo
req.Header.Set("Content-Type", "application/dns-message") req.Header.Set("Content-Type", "application/dns-message")
} }
req.Header.Set("Accept", "application/dns-message, application/dns-udpwireformat, application/json") req.Header.Set("Accept", "application/dns-message, application/dns-udpwireformat, application/json")
req.Header.Set("User-Agent", "DNS-over-HTTPS/1.1 (+https://github.com/m13253/dns-over-https)") req.Header.Set("User-Agent", USER_AGENT)
c.httpClientMux.RLock() c.httpClientMux.RLock()
resp, err := c.httpClient.Do(req) resp, err := c.httpClient.Do(req)
c.httpClientMux.RUnlock() c.httpClientMux.RUnlock()

29
doh-client/version.go Normal file
View File

@@ -0,0 +1,29 @@
/*
DNS-over-HTTPS
Copyright (C) 2017-2018 Star Brilliant <m13253@hotmail.com>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
package main
const (
VERSION = "1.3.6"
USER_AGENT = "DNS-over-HTTPS/" + VERSION + " (+https://github.com/m13253/dns-over-https)"
)

View File

@@ -150,7 +150,7 @@ func (s *Server) parseRequestGoogle(w http.ResponseWriter, r *http.Request) *DNS
opt := new(dns.OPT) opt := new(dns.OPT)
opt.Hdr.Name = "." opt.Hdr.Name = "."
opt.Hdr.Rrtype = dns.TypeOPT opt.Hdr.Rrtype = dns.TypeOPT
opt.SetUDPSize(4096) opt.SetUDPSize(dns.DefaultMsgSize)
opt.SetDo(true) opt.SetDo(true)
if ednsClientAddress != nil { if ednsClientAddress != nil {
edns0Subnet := new(dns.EDNS0_SUBNET) edns0Subnet := new(dns.EDNS0_SUBNET)

View File

@@ -93,9 +93,9 @@ func (s *Server) parseRequestIETF(w http.ResponseWriter, r *http.Request) *DNSRe
opt = new(dns.OPT) opt = new(dns.OPT)
opt.Hdr.Name = "." opt.Hdr.Name = "."
opt.Hdr.Rrtype = dns.TypeOPT opt.Hdr.Rrtype = dns.TypeOPT
opt.SetUDPSize(4096) opt.SetUDPSize(dns.DefaultMsgSize)
opt.SetDo(false) opt.SetDo(false)
msg.Extra = append(msg.Extra, opt) msg.Extra = append([]dns.RR{opt}, msg.Extra...)
} }
var edns0Subnet *dns.EDNS0_SUBNET var edns0Subnet *dns.EDNS0_SUBNET
for _, option := range opt.Option { for _, option := range opt.Option {

View File

@@ -58,6 +58,7 @@ func NewServer(conf *config) (s *Server) {
conf: conf, conf: conf,
udpClient: &dns.Client{ udpClient: &dns.Client{
Net: "udp", Net: "udp",
UDPSize: dns.DefaultMsgSize,
Timeout: time.Duration(conf.Timeout) * time.Second, Timeout: time.Duration(conf.Timeout) * time.Second,
}, },
tcpClient: &dns.Client{ tcpClient: &dns.Client{
@@ -102,8 +103,8 @@ func (s *Server) Start() error {
} }
func (s *Server) handlerFunc(w http.ResponseWriter, r *http.Request) { func (s *Server) handlerFunc(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Server", "DNS-over-HTTPS/1.1 (+https://github.com/m13253/dns-over-https)") w.Header().Set("Server", USER_AGENT)
w.Header().Set("X-Powered-By", "DNS-over-HTTPS/1.1 (+https://github.com/m13253/dns-over-https)") w.Header().Set("X-Powered-By", USER_AGENT)
if r.Form == nil { if r.Form == nil {
const maxMemory = 32 << 20 // 32 MB const maxMemory = 32 << 20 // 32 MB

29
doh-server/version.go Normal file
View File

@@ -0,0 +1,29 @@
/*
DNS-over-HTTPS
Copyright (C) 2017-2018 Star Brilliant <m13253@hotmail.com>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
package main
const (
VERSION = "1.3.6"
USER_AGENT = "DNS-over-HTTPS/" + VERSION + " (+https://github.com/m13253/dns-over-https)"
)

View File

@@ -6,6 +6,8 @@
<string>org.eu.starlab.doh.client</string> <string>org.eu.starlab.doh.client</string>
<key>ProgramArguments</key> <key>ProgramArguments</key>
<array> <array>
<string>/usr/local/bin/doh-logger</string>
<string>doh-client</string>
<string>/usr/local/bin/doh-client</string> <string>/usr/local/bin/doh-client</string>
<string>-conf</string> <string>-conf</string>
<string>/usr/local/etc/dns-over-https/doh-client.conf</string> <string>/usr/local/etc/dns-over-https/doh-client.conf</string>

View File

@@ -6,6 +6,8 @@
<string>org.eu.starlab.doh.server</string> <string>org.eu.starlab.doh.server</string>
<key>ProgramArguments</key> <key>ProgramArguments</key>
<array> <array>
<string>/usr/local/bin/doh-logger</string>
<string>doh-server</string>
<string>/usr/local/bin/doh-server</string> <string>/usr/local/bin/doh-server</string>
<string>-conf</string> <string>-conf</string>
<string>/usr/local/etc/dns-over-https/doh-server.conf</string> <string>/usr/local/etc/dns-over-https/doh-server.conf</string>