Signed-off-by: arraykeys@gmail.com <arraykeys@gmail.com>

This commit is contained in:
arraykeys@gmail.com
2017-12-05 10:27:51 +08:00
parent 7164349944
commit 99b06e813e
8 changed files with 81 additions and 45 deletions

View File

@ -1,4 +1,7 @@
proxy更新日志 proxy更新日志
v4.1
1.优化了http(s),socks5代理中的域名智能判断,如果是内网IP,直接走本地网络,提升浏览体验.
v4.0 v4.0
1.内网穿透三端重构了一个multiplexing版本使用github.com/xtaci/smux实现了tcp链接的多路复用 1.内网穿透三端重构了一个multiplexing版本使用github.com/xtaci/smux实现了tcp链接的多路复用
鼎鼎大名的kcp-go底层就是使用的这个库基于kcp-go的双边加速工具kcptun的广泛使用已经很好 鼎鼎大名的kcp-go底层就是使用的这个库基于kcp-go的双边加速工具kcptun的广泛使用已经很好

View File

@ -91,7 +91,7 @@ Proxy是golang实现的高性能http,https,websocket,tcp,udp,socks5代理服务
- [4.4 UDP普通用法](#44udp普通用法) - [4.4 UDP普通用法](#44udp普通用法)
- [4.5 高级用法一](#45高级用法一) - [4.5 高级用法一](#45高级用法一)
- [4.6 高级用法一](#46高级用法二) - [4.6 高级用法一](#46高级用法二)
- [4.7 tserver的-r参数](#47tserver的-r参数) - [4.7 server的-r参数](#47server的-r参数)
- [4.8 查看帮助](#48查看帮助) - [4.8 查看帮助](#48查看帮助)
- [5. SOCKS5代理](#5socks5代理) - [5. SOCKS5代理](#5socks5代理)
- [5.1 普通SOCKS5代理](#51普通socks5代理) - [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 下载地址:https://github.com/snail007/goproxy/releases
```shell ```shell
cd /root/proxy/ 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.下载自动安装脚本** #### **2.下载自动安装脚本**
```shell ```shell
@ -361,13 +361,13 @@ VPS(IP:22.22.22.33)执行:
1. **多路复用版本的serverclient可以开启压缩传输参数是--c。** 1. **多路复用版本的serverclient可以开启压缩传输参数是--c。**
1. **serverclient要么都开启压缩要么都不开启不能只开一个。** 1. **serverclient要么都开启压缩要么都不开启不能只开一个。**
下面的教程以“多链接版本”为例子,说明使用方法。 下面的教程以“多路复用版本”为例子,说明使用方法。
内网穿透由三部分组成:tclient端,tserver端,tbridge端tclient和tserver主动连接tbridge端进行桥接. 内网穿透由三部分组成:client端,server端,bridge端client和server主动连接bridge端进行桥接.
当用户访问tserver端,流程是: 当用户访问server端,流程是:
1. tserver主动和tbridge端建立连接 1. server主动和bridge端建立连接
1. 然后tbridge端通知tclient端连接tbridge端,并连接内网目标端口; 1. 然后bridge端通知client端连接bridge端,并连接内网目标端口;
1. 然后绑定tclient端到tbridge端和tclient端到内网端口的连接 1. 然后绑定client端到bridge端和client端到内网端口的连接
1. 然后tbridge端把tclient过来的连接与tserver端过来的连接绑定 1. 然后bridge端把client过来的连接与server端过来的连接绑定
1. 整个通道建立完成; 1. 整个通道建立完成;
#### **4.2、TCP普通用法** #### **4.2、TCP普通用法**
@ -380,11 +380,11 @@ VPS(IP:22.22.22.33)执行:
步骤: 步骤:
1. 在vps上执行 1. 在vps上执行
`./proxy tbridge -p ":33080" -C proxy.crt -K proxy.key` `./proxy bridge -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 server -r ":28080@:80" -P "127.0.0.1:33080" -C proxy.crt -K proxy.key`
1. 在公司机器A上面执行 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. 完成 1. 完成
@ -402,11 +402,11 @@ VPS(IP:22.22.22.33)执行:
步骤: 步骤:
1. 在vps上执行,确保vps的80端口没被其它程序占用. 1. 在vps上执行,确保vps的80端口没被其它程序占用.
`./proxy tbridge -p ":33080" -C proxy.crt -K proxy.key` `./proxy bridge -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 server -r ":80@:80" -P "22.22.22.22:33080" -C proxy.crt -K proxy.key`
1. 在自己笔记本上面执行 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. 完成 1. 完成
@ -420,11 +420,11 @@ VPS(IP:22.22.22.33)执行:
步骤: 步骤:
1. 在vps上执行 1. 在vps上执行
`./proxy tbridge -p ":33080" -C proxy.crt -K proxy.key` `./proxy bridge -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 server --udp -r ":53@:53" -P "127.0.0.1:33080" -C proxy.crt -K proxy.key`
1. 在公司机器A上面执行 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. 完成 1. 完成
@ -439,13 +439,13 @@ VPS(IP:22.22.22.33)执行:
步骤: 步骤:
1. 在vps上执行 1. 在vps上执行
`./proxy tbridge -p ":33080" -C proxy.crt -K proxy.key` `./proxy bridge -p ":33080" -C proxy.crt -K proxy.key`
1. 在公司机器A上面执行 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. 在家里电脑上执行 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. 完成 1. 完成
@ -466,15 +466,15 @@ server连接到bridge的时候,如果同时有多个client连接到同一个brid
步骤: 步骤:
1. 在vps上执行 1. 在vps上执行
`./proxy tbridge -p ":33080" -C proxy.crt -K proxy.key` `./proxy bridge -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 server -r ":28080@:80" -r ":29090@:21" --k test -P "127.0.0.1:33080" -C proxy.crt -K proxy.key`
1. 在公司机器A上面执行 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. 完成 1. 完成
#### **4.7.tserver的-r参数** #### **4.7.server的-r参数**
-r完整格式是:`PROTOCOL://LOCAL_IP:LOCAL_PORT@[CLIENT_KEY]CLIENT_LOCAL_HOST:CLIENT_LOCAL_PORT` -r完整格式是:`PROTOCOL://LOCAL_IP:LOCAL_PORT@[CLIENT_KEY]CLIENT_LOCAL_HOST:CLIENT_LOCAL_PORT`
4.7.1.协议PROTOCOL:tcp或者udp. 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.7.3.LOCAL_IP为空默认是:`0.0.0.0`,CLIENT_LOCAL_HOST为空默认是:`127.0.0.1`;
#### **4.8.查看帮助** #### **4.8.查看帮助**
`./proxy help tbridge` `./proxy help bridge`
`./proxy help tserver` `./proxy help server`
`./proxy help tserver` `./proxy help server`
### **5.SOCKS5代理** ### **5.SOCKS5代理**
提示:SOCKS5代理,支持CONNECT,UDP协议,不支持BIND,支持用户名密码认证. 提示:SOCKS5代理,支持CONNECT,UDP协议,不支持BIND,支持用户名密码认证.

View File

@ -5,7 +5,7 @@ if [ -e /tmp/proxy ]; then
fi fi
mkdir /tmp/proxy mkdir /tmp/proxy
cd /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 # #install proxy
tar zxvf proxy-linux-amd64.tar.gz tar zxvf proxy-linux-amd64.tar.gz

View File

@ -8,7 +8,7 @@ import (
"syscall" "syscall"
) )
const APP_VERSION = "4.0" const APP_VERSION = "4.1"
func main() { func main() {
err := initConfig() err := initConfig()

View File

@ -1,5 +1,5 @@
#!/bin/bash #!/bin/bash
VER="4.0" VER="4.1"
RELEASE="release-${VER}" RELEASE="release-${VER}"
rm -rf .cert rm -rf .cert
mkdir .cert mkdir .cert

View File

@ -152,8 +152,10 @@ func (s *HTTP) callback(inConn net.Conn) {
return return
} }
address := req.Host address := req.Host
host, _, _ := net.SplitHostPort(address)
useProxy := true useProxy := false
if !utils.IsIternalIP(host) {
useProxy = true
if *s.cfg.Parent == "" { if *s.cfg.Parent == "" {
useProxy = false useProxy = false
} else if *s.cfg.Always { } else if *s.cfg.Always {
@ -168,6 +170,8 @@ func (s *HTTP) callback(inConn net.Conn) {
useProxy, _, _ = s.checker.IsBlocked(req.Host) useProxy, _, _ = s.checker.IsBlocked(req.Host)
//log.Printf("blocked ? : %v, %s , fail:%d ,success:%d", useProxy, address, n, m) //log.Printf("blocked ? : %v, %s , fail:%d ,success:%d", useProxy, address, n, m)
} }
}
log.Printf("use proxy : %v, %s", useProxy, address) log.Printf("use proxy : %v, %s", useProxy, address)
err = s.OutToTCP(useProxy, address, &inConn, &req) err = s.OutToTCP(useProxy, address, &inConn, &req)

View File

@ -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()) outConn, err = s.getOutConn(methodReq.Bytes(), request.Bytes(), request.Addr())
} else { } else {
if *s.cfg.Parent != "" { if *s.cfg.Parent != "" {
host, _, _ := net.SplitHostPort(request.Addr())
useProxy := false
if utils.IsIternalIP(host) {
useProxy = false
} else {
s.checker.Add(request.Addr(), true, "", "", nil) s.checker.Add(request.Addr(), true, "", "", nil)
useProxy, _, _ = s.checker.IsBlocked(request.Addr()) useProxy, _, _ = s.checker.IsBlocked(request.Addr())
}
if useProxy { if useProxy {
outConn, err = s.getOutConn(methodReq.Bytes(), request.Bytes(), request.Addr()) outConn, err = s.getOutConn(methodReq.Bytes(), request.Bytes(), request.Addr())
} else { } else {

View File

@ -454,6 +454,29 @@ func HttpGet(URL string, timeout int) (body []byte, code int, err error) {
body, err = ioutil.ReadAll(resp.Body) body, err = ioutil.ReadAll(resp.Body)
return 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 { // type sockaddr struct {
// family uint16 // family uint16