Skip to content

Commit

Permalink
feat:联调ok
Browse files Browse the repository at this point in the history
  • Loading branch information
0990 committed Mar 16, 2023
1 parent 9bc1aa0 commit 1886421
Show file tree
Hide file tree
Showing 11 changed files with 291 additions and 76 deletions.
22 changes: 22 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# ipt2socks
将iptables(TPROXY)透明代理流量转换为socks5流量的golang版工具,类似工具有[zfl9/ipt2socks](https://github.com/zfl9/ipt2socks)

## 特性
* 支持转成sock4流量
* 支持转成socks5(tcp&udp)流量

## 使用
```
ipt2socks --listen=0.0.0.0:60080 --proxy=socks5://127.0.0.1:1080
```

### 参数
```
--listen 本地监听地址,格式为x.x.x.x:xx
--proxy sock5代理地址,格式为sock5://x.x.x.x:xx或sock4://x.x.x.x:xx
--udptimeout udp超时时间(单位秒)
--verbose 若指定此选项,则将会打印较为详尽的运行时日志
```



54 changes: 13 additions & 41 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,30 @@ import (
"fmt"
"github.com/0990/ipt2socks"
"github.com/sirupsen/logrus"
"net/url"
"os"
"os/signal"
"strings"
)

var proxy = flag.String("proxy", "", "Use this proxy [protocol://]host[:port]")
var listen = flag.String("listen", "", "listen addr")
var proxy = flag.String("proxy", "socks5://127.0.0.1:1080", "Use this proxy [protocol://]host[:port]")
var listen = flag.String("listen", "0.0.0.0:60080", "listen addr")
var udpTimeout = flag.Int("udptimeout", 60, "udp timeout second")
var verbose = flag.Bool("verbose", false, "print verbose log, affect performance")

func main() {
flag.Parse()

cfg, err := parseCfg(*proxy, *listen, *udpTimeout)
if err != nil {
logrus.Fatal(err)
if *verbose {
logrus.SetLevel(logrus.DebugLevel)
} else {
logrus.SetLevel(logrus.WarnLevel)
}

server, err := ipt2socks.NewServer(cfg)
server, err := ipt2socks.NewServer(ipt2socks.Config{
Proxy: *proxy,
ListenAddr: *listen,
UDPTimeout: int32(*udpTimeout),
})

if err != nil {
logrus.Fatalln(err)
}
Expand All @@ -37,36 +42,3 @@ func main() {
s := <-c
fmt.Println("quit,Got signal:", s)
}

func parseCfg(proxy string, listen string, udpTimeout int) (ipt2socks.Config, error) {
proxyAddr, err := parseProxy(proxy)
if err != nil {
return ipt2socks.Config{}, err
}

return ipt2socks.Config{
ProxyAddr: proxyAddr,
ListenAddr: listen,
UDPTimeout: int32(udpTimeout),
}, nil
}

func parseProxy(s string) (string, error) {
if !strings.Contains(s, "://") {
s = fmt.Sprintf("%s://%s", "socks5" /* default protocol */, s)
}

u, err := url.Parse(s)
if err != nil {
return "", err
}

protocol := strings.ToLower(u.Scheme)

switch protocol {
case "socks5":
return u.Host, nil
default:
return "", fmt.Errorf("unsupported protocol: %s", protocol)
}
}
2 changes: 1 addition & 1 deletion config.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package ipt2socks

type Config struct {
ProxyAddr string
Proxy string
ListenAddr string
UDPTimeout int32
}
12 changes: 7 additions & 5 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@ module github.com/0990/ipt2socks
go 1.19

require (
github.com/0990/socks5 v1.0.2
github.com/0990/socks5 v1.0.3-0.20230316151936-1306c51dc297
github.com/sirupsen/logrus v1.9.0
)

require (
github.com/miekg/dns v1.1.33 // indirect
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 // indirect
golang.org/x/net v0.0.0-20190923162816-aa69164e4478 // indirect
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect
github.com/miekg/dns v1.1.52 // indirect
golang.org/x/crypto v0.7.0 // indirect
golang.org/x/mod v0.9.0 // indirect
golang.org/x/net v0.8.0 // indirect
golang.org/x/sys v0.6.0 // indirect
golang.org/x/tools v0.7.0 // indirect
)
14 changes: 14 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
github.com/0990/socks5 v1.0.2 h1:0I8zWt6at7Ah4ApO3v3eKbFLLXG8LfByI5MQBr9bNvs=
github.com/0990/socks5 v1.0.2/go.mod h1:DRz3lYsUoXTc+8O8axm+3oAjjPs5v39dQSBRwDH6gJE=
github.com/0990/socks5 v1.0.3-0.20230316151936-1306c51dc297 h1:J5dE9Pu07SwaEyF75s0Ac6xA8ZyDvZ5t3M6iuIzrxLM=
github.com/0990/socks5 v1.0.3-0.20230316151936-1306c51dc297/go.mod h1:DRz3lYsUoXTc+8O8axm+3oAjjPs5v39dQSBRwDH6gJE=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/miekg/dns v1.1.33 h1:8KUVEKrUw2dmu1Ys0aWnkEJgoRaLAzNysfCh2KSMWiI=
github.com/miekg/dns v1.1.33/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
github.com/miekg/dns v1.1.52 h1:Bmlc/qsNNULOe6bpXcUTsuOajd0DzRHwup6D9k1An0c=
github.com/miekg/dns v1.1.52/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY=
github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
Expand All @@ -20,11 +24,17 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs=
golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190923162816-aa69164e4478 h1:l5EDrHhldLYb3ZRHDUhXF7Om7MvYXnkV9/iQNo1lX6g=
golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
Expand All @@ -33,8 +43,12 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4=
golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
Expand Down
7 changes: 0 additions & 7 deletions proxy.go

This file was deleted.

62 changes: 62 additions & 0 deletions proxy_dialer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package ipt2socks

import (
"errors"
"fmt"
"github.com/0990/socks5"
"net"
"net/url"
"strings"
)

type proxyDialer interface {
Dial(network, addr string) (net.Conn, error)
}

func newProxyDialer(proxy string, udpTimeout int32) (proxyDialer, error) {
protocol, addr, err := parseProxy(proxy)
if err != nil {
return nil, err
}

switch protocol {
case "socks5":
return socks5.NewSocks5Client(socks5.ClientCfg{
ServerAddr: addr,
UserName: "",
Password: "",
UDPTimout: int(udpTimeout),
TCPTimeout: 60,
}), nil
case "socks4":
return socks5.NewSocks4Client(socks5.ClientCfg{
ServerAddr: addr,
UserName: "",
Password: "",
UDPTimout: int(udpTimeout),
TCPTimeout: 60,
}), nil
default:
return nil, errors.New("not support proxy type")
}
}

func parseProxy(s string) (string, string, error) {
if !strings.Contains(s, "://") {
s = fmt.Sprintf("%s://%s", "socks5" /* default protocol */, s)
}

u, err := url.Parse(s)
if err != nil {
return "", "", err
}

protocol := strings.ToLower(u.Scheme)

switch protocol {
case "socks5", "socks4":
return protocol, u.Host, nil
default:
return "", "", fmt.Errorf("unsupported protocol: %s", protocol)
}
}
14 changes: 5 additions & 9 deletions server.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package ipt2socks

import (
"github.com/0990/ipt2socks/tproxy"
"github.com/0990/socks5"
"github.com/sirupsen/logrus"
"io"
"net"
Expand Down Expand Up @@ -33,18 +32,15 @@ func NewServer(c Config) (*Server, error) {
return nil, err
}

client := socks5.NewSocks5Client(socks5.ClientCfg{
ServerAddr: c.ProxyAddr,
UserName: "",
Password: "",
UDPTimout: int(c.UDPTimeout),
TCPTimeout: 60,
})
dialer, err := newProxyDialer(c.Proxy, c.UDPTimeout)
if err != nil {
return nil, err
}

return &Server{
tcpListenAddr: taddr,
udpListenAddr: uaddr,
proxyDialer: client,
proxyDialer: dialer,
cfg: c,
}, nil
}
Expand Down
Loading

0 comments on commit 1886421

Please sign in to comment.