summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Osipov <mike.osipov@gmail.com>2020-07-06 00:53:18 +0300
committerMikhail Osipov <mike.osipov@gmail.com>2020-07-06 00:53:18 +0300
commit144f66574706c9e251c964b694e80406206cb10b (patch)
treeaaed72a4c250787b5dc9aa27fa94278b92217868
parente00995cf2a5968ae94d4dc0abfe21a66dae5cd54 (diff)
single socket option
-rw-r--r--USAGE8
-rw-r--r--pkg/server/socket/socket.go4
-rw-r--r--pkg/server/socket/tun.go2
-rw-r--r--pkg/server/tunnel.go29
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 {