Skip to content

Commit dddbc09

Browse files
authored
Merge pull request #27 from Snawoot/socket_activation
Socket activation
2 parents 93f12af + 02eff46 commit dddbc09

5 files changed

Lines changed: 49 additions & 14 deletions

File tree

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ Dumbest HTTP proxy ever.
1818
* Supports HTTP/2
1919
* Resilient to DPI (including active probing, see `hidden_domain` option for authentication providers)
2020
* Connecting via upstream HTTP(S)/SOCKS5 proxies (proxy chaining)
21+
* systemd socket activation
2122

2223
## Installation
2324

@@ -184,7 +185,7 @@ Usage of /home/user/go/bin/dumbproxy:
184185
-autocert-whitelist value
185186
restrict autocert domains to this comma-separated list
186187
-bind-address string
187-
HTTP proxy listen address (default ":8080")
188+
HTTP proxy listen address. Set empty value to use systemd socket activation. (default ":8080")
188189
-cafile string
189190
CA file to authenticate clients with certificates
190191
-cert string

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ go 1.13
44

55
require (
66
github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5 // indirect
7+
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
78
github.com/kr/pretty v0.3.1 // indirect
89
github.com/tg123/go-htpasswd v1.2.1
910
golang.org/x/crypto v0.7.0

go.sum

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
github.com/GehirnInc/crypt v0.0.0-20200316065508-bb7000b8a962/go.mod h1:kC29dT1vFpj7py2OvG1khBdQpo3kInWP+6QipLbdngo=
22
github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5 h1:IEjq88XO4PuBDcvmjQJcQGg+w+UaafSy8G5Kcb5tBhI=
33
github.com/GehirnInc/crypt v0.0.0-20230320061759-8cc1b52080c5/go.mod h1:exZ0C/1emQJAw5tHOaUDyY1ycttqBAPcxuzf7QbY6ec=
4+
github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
5+
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
46
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
57
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
68
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
79
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
10+
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
811
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
912
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
1013
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=

main.go

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"strings"
1313
"time"
1414

15+
"github.com/coreos/go-systemd/v22/activation"
1516
"golang.org/x/crypto/acme"
1617
"golang.org/x/crypto/acme/autocert"
1718
"golang.org/x/crypto/bcrypt"
@@ -75,7 +76,7 @@ type CLIArgs struct {
7576

7677
func parse_args() CLIArgs {
7778
var args CLIArgs
78-
flag.StringVar(&args.bind_address, "bind-address", ":8080", "HTTP proxy listen address")
79+
flag.StringVar(&args.bind_address, "bind-address", ":8080", "HTTP proxy listen address. Set empty value to use systemd socket activation.")
7980
flag.StringVar(&args.auth, "auth", "none://", "auth parameters")
8081
flag.IntVar(&args.verbosity, "verbosity", 20, "logging verbosity "+
8182
"(10 - debug, 20 - info, 30 - warning, 40 - error, 50 - critical)")
@@ -170,14 +171,40 @@ func run() int {
170171
}
171172

172173
mainLogger.Info("Starting proxy server...")
174+
var listener net.Listener
175+
if args.bind_address == "" {
176+
// socket activation
177+
listeners, err := activation.Listeners()
178+
if err != nil {
179+
mainLogger.Critical("socket activation failed: %v", err)
180+
return 3
181+
}
182+
if len(listeners) != 1 {
183+
mainLogger.Critical("socket activation failed: unexpected number of listeners: %d",
184+
len(listeners))
185+
return 3
186+
}
187+
if listeners[0] == nil {
188+
mainLogger.Critical("socket activation failed: nil listener returned")
189+
return 3
190+
}
191+
listener = listeners[0]
192+
} else {
193+
newListener, err := net.Listen("tcp", args.bind_address)
194+
if err != nil {
195+
mainLogger.Critical("listen failed: %v", err)
196+
return 3
197+
}
198+
listener = newListener
199+
}
200+
173201
if args.cert != "" {
174-
cfg, err1 := makeServerTLSConfig(args.cert, args.key, args.cafile, args.ciphers)
202+
cfg, err1 := makeServerTLSConfig(args.cert, args.key, args.cafile, args.ciphers, !args.disableHTTP2)
175203
if err1 != nil {
176204
mainLogger.Critical("TLS config construction failed: %v", err1)
177205
return 3
178206
}
179-
server.TLSConfig = cfg
180-
err = server.ListenAndServeTLS("", "")
207+
listener = tls.NewListener(listener, cfg)
181208
} else if args.autocert {
182209
m := &autocert.Manager{
183210
Cache: autocert.DirCache(args.autocertDir),
@@ -195,18 +222,15 @@ func run() int {
195222
}()
196223
}
197224
cfg := m.TLSConfig()
198-
cfg, err = updateServerTLSConfig(cfg, args.cafile, args.ciphers)
225+
cfg, err = updateServerTLSConfig(cfg, args.cafile, args.ciphers, !args.disableHTTP2)
199226
if err != nil {
200227
mainLogger.Critical("TLS config construction failed: %v", err)
201228
return 3
202229
}
203-
server.TLSConfig = cfg
204-
err = server.ListenAndServeTLS("", "")
205-
mainLogger.Info("Proxy server started.")
206-
} else {
207-
mainLogger.Info("Proxy server started.")
208-
err = server.ListenAndServe()
230+
listener = tls.NewListener(listener, cfg)
209231
}
232+
mainLogger.Info("Proxy server started.")
233+
err = server.Serve(listener)
210234
mainLogger.Critical("Server terminated with a reason: %v", err)
211235
mainLogger.Info("Shutting down...")
212236
return 0

utils.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ func copyBody(wr io.Writer, body io.Reader) {
151151
}
152152
}
153153

154-
func makeServerTLSConfig(certfile, keyfile, cafile, ciphers string) (*tls.Config, error) {
154+
func makeServerTLSConfig(certfile, keyfile, cafile, ciphers string, h2 bool) (*tls.Config, error) {
155155
var cfg tls.Config
156156
cert, err := tls.LoadX509KeyPair(certfile, keyfile)
157157
if err != nil {
@@ -171,10 +171,13 @@ func makeServerTLSConfig(certfile, keyfile, cafile, ciphers string) (*tls.Config
171171
cfg.ClientAuth = tls.VerifyClientCertIfGiven
172172
}
173173
cfg.CipherSuites = makeCipherList(ciphers)
174+
if h2 {
175+
cfg.NextProtos = []string{"h2", "http/1.1"}
176+
}
174177
return &cfg, nil
175178
}
176179

177-
func updateServerTLSConfig(cfg *tls.Config, cafile, ciphers string) (*tls.Config, error) {
180+
func updateServerTLSConfig(cfg *tls.Config, cafile, ciphers string, h2 bool) (*tls.Config, error) {
178181
if cafile != "" {
179182
roots := x509.NewCertPool()
180183
certs, err := ioutil.ReadFile(cafile)
@@ -188,6 +191,9 @@ func updateServerTLSConfig(cfg *tls.Config, cafile, ciphers string) (*tls.Config
188191
cfg.ClientAuth = tls.VerifyClientCertIfGiven
189192
}
190193
cfg.CipherSuites = makeCipherList(ciphers)
194+
if h2 {
195+
cfg.NextProtos = []string{"h2", "http/1.1"}
196+
}
191197
return cfg, nil
192198
}
193199

0 commit comments

Comments
 (0)