diff options
| author | Mikhail Osipov <mike.osipov@gmail.com> | 2020-05-26 03:22:32 +0300 |
|---|---|---|
| committer | Mikhail Osipov <mike.osipov@gmail.com> | 2020-05-26 03:22:32 +0300 |
| commit | e43c60b56401be7515d7fbfdfe3e4e56d1886a23 (patch) | |
| tree | 58711f3bbbe2b34e91836087c274773564e29029 /pkg/server/socket/listen.go | |
| parent | 97802849e3a21952e6c5896622d52153b2d96ee7 (diff) | |
add tproxy listen option
Diffstat (limited to 'pkg/server/socket/listen.go')
| -rw-r--r-- | pkg/server/socket/listen.go | 22 |
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 { |
