summaryrefslogtreecommitdiff
path: root/pkg/server/socket/listen.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/server/socket/listen.go')
-rw-r--r--pkg/server/socket/listen.go22
1 files changed, 22 insertions, 0 deletions
diff --git a/pkg/server/socket/listen.go b/pkg/server/socket/listen.go
index e640e16..94fb85c 100644
--- a/pkg/server/socket/listen.go
+++ b/pkg/server/socket/listen.go
@@ -14,10 +14,12 @@ type listenSocket struct {
proto, addr string
listen net.Listener
redirect bool
+ tproxy bool
}
func newListenSocket(proto, addr string, opts opts.Opts) (S, error) {
redirect := opts.Bool("redirect")
+ tproxy := opts.Bool("tproxy")
if proto == "tcp" {
if !strings.Contains(addr, ":") {
@@ -29,16 +31,32 @@ func newListenSocket(proto, addr string, opts opts.Opts) (S, error) {
return nil, errors.New("redirect not supported")
}
+ if tproxy && proto != "tcp" {
+ return nil, errors.New("tproxy not supported")
+ }
+
+ if redirect && tproxy {
+ return nil, errors.New("redirect and tproxy cannot be used together")
+ }
+
listen, err := net.Listen(proto, addr)
if err != nil {
return nil, err
}
+ if tproxy {
+ if err := setConnTransparent(listen); err != nil {
+ listen.Close()
+ return nil, err
+ }
+ }
+
s := &listenSocket{
proto: proto,
addr: addr,
listen: listen,
redirect: redirect,
+ tproxy: tproxy,
}
return s, nil
@@ -66,6 +84,10 @@ func (s *listenSocket) Open(env env.Env) (Conn, error) {
}
}
+ if s.tproxy {
+ env.Set("original.addr", la.String())
+ }
+
if original == "" {
log.Println("accept", desc)
} else {