diff --git a/CHANGELOG b/CHANGELOG index b886319..2a0b2f5 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,7 @@ proxy更新日志 +v4.1 +1.优化了http(s),socks5代理中的域名智能判断,如果是内网IP,直接走本地网络,提升浏览体验. + v4.0 1.内网穿透三端重构了一个multiplexing版本,使用github.com/xtaci/smux实现了tcp链接的多路复用, 鼎鼎大名的kcp-go底层就是使用的这个库,基于kcp-go的双边加速工具kcptun的广泛使用已经很好 diff --git a/README.md b/README.md index d062928..4e3b62b 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ Proxy是golang实现的高性能http,https,websocket,tcp,udp,socks5代理服务 - [4.4 UDP普通用法](#44udp普通用法) - [4.5 高级用法一](#45高级用法一) - [4.6 高级用法一](#46高级用法二) - - [4.7 tserver的-r参数](#47tserver的-r参数) + - [4.7 server的-r参数](#47server的-r参数) - [4.8 查看帮助](#48查看帮助) - [5. SOCKS5代理](#5socks5代理) - [5.1 普通SOCKS5代理](#51普通socks5代理) @@ -122,7 +122,7 @@ curl -L https://raw.githubusercontent.com/snail007/goproxy/master/install_auto.s 下载地址:https://github.com/snail007/goproxy/releases ```shell cd /root/proxy/ -wget https://github.com/snail007/goproxy/releases/download/v4.0/proxy-linux-amd64.tar.gz +wget https://github.com/snail007/goproxy/releases/download/v4.1/proxy-linux-amd64.tar.gz ``` #### **2.下载自动安装脚本** ```shell @@ -361,13 +361,13 @@ VPS(IP:22.22.22.33)执行: 1. **多路复用版本的server,client可以开启压缩传输,参数是--c。** 1. **server,client要么都开启压缩,要么都不开启,不能只开一个。** -下面的教程以“多链接版本”为例子,说明使用方法。 -内网穿透由三部分组成:tclient端,tserver端,tbridge端;tclient和tserver主动连接tbridge端进行桥接. -当用户访问tserver端,流程是: -1. tserver主动和tbridge端建立连接; -1. 然后tbridge端通知tclient端连接tbridge端,并连接内网目标端口; -1. 然后绑定tclient端到tbridge端和tclient端到内网端口的连接; -1. 然后tbridge端把tclient过来的连接与tserver端过来的连接绑定; +下面的教程以“多路复用版本”为例子,说明使用方法。 +内网穿透由三部分组成:client端,server端,bridge端;client和server主动连接bridge端进行桥接. +当用户访问server端,流程是: +1. server主动和bridge端建立连接; +1. 然后bridge端通知client端连接bridge端,并连接内网目标端口; +1. 然后绑定client端到bridge端和client端到内网端口的连接; +1. 然后bridge端把client过来的连接与server端过来的连接绑定; 1. 整个通道建立完成; #### **4.2、TCP普通用法** @@ -380,11 +380,11 @@ VPS(IP:22.22.22.33)执行: 步骤: 1. 在vps上执行 - `./proxy tbridge -p ":33080" -C proxy.crt -K proxy.key` - `./proxy tserver -r ":28080@:80" -P "127.0.0.1:33080" -C proxy.crt -K proxy.key` + `./proxy bridge -p ":33080" -C proxy.crt -K proxy.key` + `./proxy server -r ":28080@:80" -P "127.0.0.1:33080" -C proxy.crt -K proxy.key` 1. 在公司机器A上面执行 - `./proxy tclient -P "22.22.22.22:33080" -C proxy.crt -K proxy.key` + `./proxy client -P "22.22.22.22:33080" -C proxy.crt -K proxy.key` 1. 完成 @@ -402,11 +402,11 @@ VPS(IP:22.22.22.33)执行: 步骤: 1. 在vps上执行,确保vps的80端口没被其它程序占用. - `./proxy tbridge -p ":33080" -C proxy.crt -K proxy.key` - `./proxy tserver -r ":80@:80" -P "22.22.22.22:33080" -C proxy.crt -K proxy.key` + `./proxy bridge -p ":33080" -C proxy.crt -K proxy.key` + `./proxy server -r ":80@:80" -P "22.22.22.22:33080" -C proxy.crt -K proxy.key` 1. 在自己笔记本上面执行 - `./proxy tclient -P "22.22.22.22:33080" -C proxy.crt -K proxy.key` + `./proxy client -P "22.22.22.22:33080" -C proxy.crt -K proxy.key` 1. 完成 @@ -420,11 +420,11 @@ VPS(IP:22.22.22.33)执行: 步骤: 1. 在vps上执行 - `./proxy tbridge -p ":33080" -C proxy.crt -K proxy.key` - `./proxy tserver --udp -r ":53@:53" -P "127.0.0.1:33080" -C proxy.crt -K proxy.key` + `./proxy bridge -p ":33080" -C proxy.crt -K proxy.key` + `./proxy server --udp -r ":53@:53" -P "127.0.0.1:33080" -C proxy.crt -K proxy.key` 1. 在公司机器A上面执行 - `./proxy tclient -P "22.22.22.22:33080" -C proxy.crt -K proxy.key` + `./proxy client -P "22.22.22.22:33080" -C proxy.crt -K proxy.key` 1. 完成 @@ -439,13 +439,13 @@ VPS(IP:22.22.22.33)执行: 步骤: 1. 在vps上执行 - `./proxy tbridge -p ":33080" -C proxy.crt -K proxy.key` + `./proxy bridge -p ":33080" -C proxy.crt -K proxy.key` 1. 在公司机器A上面执行 - `./proxy tclient -P "22.22.22.22:33080" -C proxy.crt -K proxy.key` + `./proxy client -P "22.22.22.22:33080" -C proxy.crt -K proxy.key` 1. 在家里电脑上执行 - `./proxy tserver -r ":28080@:80" -P "22.22.22.22:33080" -C proxy.crt -K proxy.key` + `./proxy server -r ":28080@:80" -P "22.22.22.22:33080" -C proxy.crt -K proxy.key` 1. 完成 @@ -466,15 +466,15 @@ server连接到bridge的时候,如果同时有多个client连接到同一个brid 步骤: 1. 在vps上执行 - `./proxy tbridge -p ":33080" -C proxy.crt -K proxy.key` - `./proxy tserver -r ":28080@:80" -r ":29090@:21" --k test -P "127.0.0.1:33080" -C proxy.crt -K proxy.key` + `./proxy bridge -p ":33080" -C proxy.crt -K proxy.key` + `./proxy server -r ":28080@:80" -r ":29090@:21" --k test -P "127.0.0.1:33080" -C proxy.crt -K proxy.key` 1. 在公司机器A上面执行 - `./proxy tclient --k test -P "22.22.22.22:33080" -C proxy.crt -K proxy.key` + `./proxy client --k test -P "22.22.22.22:33080" -C proxy.crt -K proxy.key` 1. 完成 -#### **4.7.tserver的-r参数** +#### **4.7.server的-r参数** -r完整格式是:`PROTOCOL://LOCAL_IP:LOCAL_PORT@[CLIENT_KEY]CLIENT_LOCAL_HOST:CLIENT_LOCAL_PORT` 4.7.1.协议PROTOCOL:tcp或者udp. @@ -490,9 +490,9 @@ server连接到bridge的时候,如果同时有多个client连接到同一个brid 4.7.3.LOCAL_IP为空默认是:`0.0.0.0`,CLIENT_LOCAL_HOST为空默认是:`127.0.0.1`; #### **4.8.查看帮助** -`./proxy help tbridge` -`./proxy help tserver` -`./proxy help tserver` +`./proxy help bridge` +`./proxy help server` +`./proxy help server` ### **5.SOCKS5代理** 提示:SOCKS5代理,支持CONNECT,UDP协议,不支持BIND,支持用户名密码认证. diff --git a/install_auto.sh b/install_auto.sh index 631e27c..26790e7 100755 --- a/install_auto.sh +++ b/install_auto.sh @@ -5,7 +5,7 @@ if [ -e /tmp/proxy ]; then fi mkdir /tmp/proxy cd /tmp/proxy -wget https://github.com/snail007/goproxy/releases/download/v4.0/proxy-linux-amd64.tar.gz +wget https://github.com/snail007/goproxy/releases/download/v4.1/proxy-linux-amd64.tar.gz # #install proxy tar zxvf proxy-linux-amd64.tar.gz diff --git a/main.go b/main.go index 0137040..77a063a 100644 --- a/main.go +++ b/main.go @@ -8,7 +8,7 @@ import ( "syscall" ) -const APP_VERSION = "4.0" +const APP_VERSION = "4.1" func main() { err := initConfig() diff --git a/release.sh b/release.sh index 5d5c283..08e8dda 100755 --- a/release.sh +++ b/release.sh @@ -1,5 +1,5 @@ #!/bin/bash -VER="4.0" +VER="4.1" RELEASE="release-${VER}" rm -rf .cert mkdir .cert diff --git a/services/http.go b/services/http.go index 73b6cdc..d8e2951 100644 --- a/services/http.go +++ b/services/http.go @@ -152,22 +152,26 @@ func (s *HTTP) callback(inConn net.Conn) { return } address := req.Host - - useProxy := true - if *s.cfg.Parent == "" { - useProxy = false - } else if *s.cfg.Always { + host, _, _ := net.SplitHostPort(address) + useProxy := false + if !utils.IsIternalIP(host) { useProxy = true - } else { - if req.IsHTTPS() { - s.checker.Add(address, true, req.Method, "", nil) + if *s.cfg.Parent == "" { + useProxy = false + } else if *s.cfg.Always { + useProxy = true } else { - s.checker.Add(address, false, req.Method, req.URL, req.HeadBuf) + if req.IsHTTPS() { + s.checker.Add(address, true, req.Method, "", nil) + } else { + s.checker.Add(address, false, req.Method, req.URL, req.HeadBuf) + } + //var n, m uint + useProxy, _, _ = s.checker.IsBlocked(req.Host) + //log.Printf("blocked ? : %v, %s , fail:%d ,success:%d", useProxy, address, n, m) } - //var n, m uint - useProxy, _, _ = s.checker.IsBlocked(req.Host) - //log.Printf("blocked ? : %v, %s , fail:%d ,success:%d", useProxy, address, n, m) } + log.Printf("use proxy : %v, %s", useProxy, address) err = s.OutToTCP(useProxy, address, &inConn, &req) diff --git a/services/socks.go b/services/socks.go index a29aebd..00a1753 100644 --- a/services/socks.go +++ b/services/socks.go @@ -416,8 +416,14 @@ func (s *Socks) proxyTCP(inConn *net.Conn, methodReq socks.MethodsRequest, reque outConn, err = s.getOutConn(methodReq.Bytes(), request.Bytes(), request.Addr()) } else { if *s.cfg.Parent != "" { - s.checker.Add(request.Addr(), true, "", "", nil) - useProxy, _, _ = s.checker.IsBlocked(request.Addr()) + host, _, _ := net.SplitHostPort(request.Addr()) + useProxy := false + if utils.IsIternalIP(host) { + useProxy = false + } else { + s.checker.Add(request.Addr(), true, "", "", nil) + useProxy, _, _ = s.checker.IsBlocked(request.Addr()) + } if useProxy { outConn, err = s.getOutConn(methodReq.Bytes(), request.Bytes(), request.Addr()) } else { diff --git a/utils/functions.go b/utils/functions.go index f0bbaaa..887b3ee 100755 --- a/utils/functions.go +++ b/utils/functions.go @@ -454,6 +454,29 @@ func HttpGet(URL string, timeout int) (body []byte, code int, err error) { body, err = ioutil.ReadAll(resp.Body) return } +func IsIternalIP(domainOrIP string) bool { + var outIPs []net.IP + outIPs, err := net.LookupIP(domainOrIP) + if err != nil { + return false + } + for _, ip := range outIPs { + if ip.IsLoopback() { + return true + } + if ip.To4().Mask(net.IPv4Mask(255, 0, 0, 0)).String() == "10.0.0.0" { + return true + } + if ip.To4().Mask(net.IPv4Mask(255, 0, 0, 0)).String() == "192.168.0.0" { + return true + } + if ip.To4().Mask(net.IPv4Mask(255, 0, 0, 0)).String() == "172.0.0.0" { + i, _ := strconv.Atoi(strings.Split(ip.To4().String(), ".")[1]) + return i >= 16 && i <= 31 + } + } + return false +} // type sockaddr struct { // family uint16