From 144f66574706c9e251c964b694e80406206cb10b Mon Sep 17 00:00:00 2001 From: Mikhail Osipov Date: Mon, 6 Jul 2020 00:53:18 +0300 Subject: single socket option --- USAGE | 8 ++++++-- pkg/server/socket/socket.go | 4 ++++ pkg/server/socket/tun.go | 2 ++ pkg/server/tunnel.go | 29 +++++++++++++++++++---------- 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/USAGE b/USAGE index bd9a8a4..889c477 100644 --- a/USAGE +++ b/USAGE @@ -1,4 +1,8 @@ -1. Transparent proxy using redirect +# Simple tcp tunnel + +tunnel add srcport,listen [dsthost:]dstport + +# Transparent proxy using redirect iptables -t nat -A OUTPUT -p tcp -d 198.145.29.83 -j REDIRECT --to-port 4000 @@ -10,6 +14,6 @@ BUGS: Direct connection also possible. In this case original.addr will be equal to listen address. This happens when ipv4 is used. -2. Transparent proxy using tproxy +# Transparent proxy using tproxy - todo diff --git a/pkg/server/socket/socket.go b/pkg/server/socket/socket.go index b419468..62ce5cf 100644 --- a/pkg/server/socket/socket.go +++ b/pkg/server/socket/socket.go @@ -25,6 +25,10 @@ type S interface { Close() } +type Single interface { + Single() +} + type conn struct { net.Conn diff --git a/pkg/server/socket/tun.go b/pkg/server/socket/tun.go index 7336c04..d48c30c 100644 --- a/pkg/server/socket/tun.go +++ b/pkg/server/socket/tun.go @@ -43,6 +43,8 @@ func (s *tunSocket) String() string { return fmt.Sprintf("tun/%s", s.name) } +func (s *tunSocket) Single() {} + func (s *tunSocket) Open(env.Env) (Conn, error) { fd, err := unix.Open("/dev/net/tun", unix.O_RDWR, 0) if err != nil { diff --git a/pkg/server/tunnel.go b/pkg/server/tunnel.go index ccd501e..afd35d8 100644 --- a/pkg/server/tunnel.go +++ b/pkg/server/tunnel.go @@ -373,6 +373,10 @@ func newTunnel(limit int, args []string, env env.Env) (*tunnel, error) { return nil, err } + if _, ok := in.(socket.Single); ok { + limit = 1 + } + if out, err = socket.New(args[n]); err != nil { in.Close() return nil, err @@ -406,12 +410,16 @@ func isOkTunnelName(s string) bool { } func tunnelAdd(r *request) { + limit := maxQueueLimit + args := r.args name := "" - limit := 1 for len(args) > 1 { - if args[0] == "name" { + noarg := false + + switch args[0] { + case "name": name = args[1] if !isOkTunnelName(name) { r.Fatal("bad name") @@ -422,25 +430,26 @@ func tunnelAdd(r *request) { } args = args[2:] - continue - } - if args[0] == "limit" { + case "limit": if n, _ := strconv.Atoi(args[1]); n > 0 && n < maxQueueLimit { limit = n } else { r.Fatal("bad limit") } args = args[2:] - } - if args[0] == "unlim" { - limit = maxQueueLimit + case "single": + limit = 1 args = args[1:] - continue + + default: + noarg = true } - break + if noarg { + break + } } if len(args) < 2 { -- cgit v1.2.3-70-g09d2