Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ee93171c63 | ||
|
|
ddd2302cb2 | ||
|
|
c96d2288b3 | ||
|
|
6f5a088091 | ||
|
|
9a07797e29 | ||
|
|
055a020d33 |
@ -1,4 +1,11 @@
|
|||||||
proxy更新日志
|
proxy更新日志
|
||||||
|
v3.9
|
||||||
|
1.增加了守护运行参数--forever,比如: proxy http --forever ,
|
||||||
|
proxy会fork子进程,然后监控子进程,如果子进程异常退出,5秒后重启子进程.
|
||||||
|
该参数配合后台运行参数--daemon和日志参数--log,可以保障proxy一直在后台执行不会因为意外退出,
|
||||||
|
而且可以通过日志文件看到proxy的输出日志内容.
|
||||||
|
比如: proxy http -p ":9090" --forever --log proxy.log --daemon
|
||||||
|
|
||||||
v3.8
|
v3.8
|
||||||
1.增加了日志输出到文件--log参数,比如: --log proxy.log,日志就会输出到proxy.log方便排除问题.
|
1.增加了日志输出到文件--log参数,比如: --log proxy.log,日志就会输出到proxy.log方便排除问题.
|
||||||
|
|
||||||
|
|||||||
61
README.md
61
README.md
@ -27,7 +27,9 @@ Proxy是golang实现的高性能http,https,websocket,tcp,udp,socks5代理服务
|
|||||||
- ...
|
- ...
|
||||||
|
|
||||||
|
|
||||||
本页是v3.6-v3.7手册,其他版本手册请点击下面链接查看.
|
本页是v3.9手册,其他版本手册请点击下面链接查看.
|
||||||
|
- [v3.8手册](https://github.com/snail007/goproxy/tree/v3.8)
|
||||||
|
- [v3.6-v3.7手册](https://github.com/snail007/goproxy/tree/v3.6)
|
||||||
- [v3.5手册](https://github.com/snail007/goproxy/tree/v3.5)
|
- [v3.5手册](https://github.com/snail007/goproxy/tree/v3.5)
|
||||||
- [v3.4手册](https://github.com/snail007/goproxy/tree/v3.4)
|
- [v3.4手册](https://github.com/snail007/goproxy/tree/v3.4)
|
||||||
- [v3.3手册](https://github.com/snail007/goproxy/tree/v3.3)
|
- [v3.3手册](https://github.com/snail007/goproxy/tree/v3.3)
|
||||||
@ -46,7 +48,10 @@ Proxy是golang实现的高性能http,https,websocket,tcp,udp,socks5代理服务
|
|||||||
### 首次使用必看
|
### 首次使用必看
|
||||||
- [环境](#首次使用必看-1)
|
- [环境](#首次使用必看-1)
|
||||||
- [使用配置文件](#使用配置文件)
|
- [使用配置文件](#使用配置文件)
|
||||||
|
- [调试输出](#调试输出)
|
||||||
|
- [使用日志文件](#使用日志文件)
|
||||||
- [后台运行](#后台运行)
|
- [后台运行](#后台运行)
|
||||||
|
- [守护运行](#守护运行)
|
||||||
- [生成通讯证书文件](#生成加密通讯需要的证书文件)
|
- [生成通讯证书文件](#生成加密通讯需要的证书文件)
|
||||||
- [安全建议](#安全建议)
|
- [安全建议](#安全建议)
|
||||||
|
|
||||||
@ -109,23 +114,15 @@ curl -L https://raw.githubusercontent.com/snail007/goproxy/master/install_auto.s
|
|||||||
安装完成,配置目录是/etc/proxy,更详细的使用方法参考下面的进一步了解.
|
安装完成,配置目录是/etc/proxy,更详细的使用方法参考下面的进一步了解.
|
||||||
如果安装失败或者你的vps不是linux64位系统,请按照下面的半自动步骤安装:
|
如果安装失败或者你的vps不是linux64位系统,请按照下面的半自动步骤安装:
|
||||||
|
|
||||||
#### 手动安装
|
#### 手动安装
|
||||||
#### **1.登录你的VPS,下载守护进程monexec,选择合适你的版本,vps一般选择"linux_amd64.tar.gz"的即可.**
|
|
||||||
下载地址:https://github.com/reddec/monexec/releases
|
#### **1.下载proxy**
|
||||||
比如下载到/root/proxy/
|
|
||||||
执行:
|
|
||||||
```shell
|
|
||||||
mkdir /root/proxy/
|
|
||||||
cd /root/proxy/
|
|
||||||
wget https://github.com/reddec/monexec/releases/download/v0.1.1/monexec_0.1.1_linux_amd64.tar.gz
|
|
||||||
```
|
|
||||||
#### **2.下载proxy**
|
|
||||||
下载地址: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/v3.8/proxy-linux-amd64.tar.gz
|
wget https://github.com/snail007/goproxy/releases/download/v3.9/proxy-linux-amd64.tar.gz
|
||||||
```
|
```
|
||||||
#### **3.下载自动安装脚本**
|
#### **2.下载自动安装脚本**
|
||||||
```shell
|
```shell
|
||||||
cd /root/proxy/
|
cd /root/proxy/
|
||||||
wget https://raw.githubusercontent.com/snail007/goproxy/master/install.sh
|
wget https://raw.githubusercontent.com/snail007/goproxy/master/install.sh
|
||||||
@ -133,7 +130,7 @@ chmod +x install.sh
|
|||||||
./install.sh
|
./install.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
## 首次使用必看
|
## **首次使用必看**
|
||||||
|
|
||||||
#### **环境**
|
#### **环境**
|
||||||
接下来的教程,默认系统是linux,程序是proxy;所有操作需要root权限;
|
接下来的教程,默认系统是linux,程序是proxy;所有操作需要root权限;
|
||||||
@ -150,26 +147,40 @@ http
|
|||||||
--local-type=tcp
|
--local-type=tcp
|
||||||
--local=:33080
|
--local=:33080
|
||||||
```
|
```
|
||||||
### 生成加密通讯需要的证书文件
|
### **调试输出**
|
||||||
|
默认情况下,日志输出的信息不包含文件行数,某些情况下为了排除程序问题,快速定位问题,
|
||||||
|
可以使用--debug参数,输出代码行数和毫秒时间.
|
||||||
|
|
||||||
|
### **使用日志文件**
|
||||||
|
默认情况下,日志是直接在控制台显示出来的,如果要保存到文件,可以使用--log参数,
|
||||||
|
比如: --log proxy.log,日志就会输出到proxy.log方便排除问题.
|
||||||
|
|
||||||
|
|
||||||
|
### **生成加密通讯需要的证书文件**
|
||||||
http,tcp,udp代理过程会和上级通讯,为了安全我们采用加密通讯,当然可以选择不加密通信通讯,本教程所有和上级通讯都采用加密,需要证书文件.
|
http,tcp,udp代理过程会和上级通讯,为了安全我们采用加密通讯,当然可以选择不加密通信通讯,本教程所有和上级通讯都采用加密,需要证书文件.
|
||||||
在linux上并安装了openssl命令,可以直接通过下面的命令生成证书和key文件.
|
在linux上并安装了openssl命令,可以直接通过下面的命令生成证书和key文件.
|
||||||
`./proxy keygen`
|
`./proxy keygen`
|
||||||
默认会在当前程序目录下面生成证书文件proxy.crt和key文件proxy.key。
|
默认会在当前程序目录下面生成证书文件proxy.crt和key文件proxy.key。
|
||||||
|
|
||||||
### 后台运行
|
### **后台运行**
|
||||||
默认执行proxy之后,如果要保持proxy运行,不能关闭命令行.
|
默认执行proxy之后,如果要保持proxy运行,不能关闭命令行.
|
||||||
如果想在后台运行proxy,命令行可以关闭,只需要在命令最后加上--daemon参数即可.
|
如果想在后台运行proxy,命令行可以关闭,只需要在命令最后加上--daemon参数即可.
|
||||||
比如:
|
比如:
|
||||||
`./proxy http -t tcp -p "0.0.0.0:38080" --daemon`
|
`./proxy http -t tcp -p "0.0.0.0:38080" --daemon`
|
||||||
更推荐用monexec守护运行proxy比较好.
|
|
||||||
|
|
||||||
### 安全建议
|
### **守护运行**
|
||||||
|
守护运行参数--forever,比如: `proxy http --forever` ,
|
||||||
|
proxy会fork子进程,然后监控子进程,如果子进程异常退出,5秒后重启子进程.
|
||||||
|
该参数配合后台运行参数--daemon和日志参数--log,可以保障proxy一直在后台执行不会因为意外退出,
|
||||||
|
而且可以通过日志文件看到proxy的输出日志内容.
|
||||||
|
比如: `proxy http -p ":9090" --forever --log proxy.log --daemon`
|
||||||
|
|
||||||
|
### **安全建议**
|
||||||
当VPS在nat设备后面,vps上网卡IP都是内网IP,这个时候可以通过-g参数添加vps的外网ip防止死循环.
|
当VPS在nat设备后面,vps上网卡IP都是内网IP,这个时候可以通过-g参数添加vps的外网ip防止死循环.
|
||||||
假设你的vps外网ip是23.23.23.23,下面命令通过-g参数设置23.23.23.23
|
假设你的vps外网ip是23.23.23.23,下面命令通过-g参数设置23.23.23.23
|
||||||
`./proxy http -g "23.23.23.23"`
|
`./proxy http -g "23.23.23.23"`
|
||||||
|
|
||||||
### 1.HTTP代理
|
### **1.HTTP代理**
|
||||||
#### **1.1.普通HTTP代理**
|
#### **1.1.普通HTTP代理**
|
||||||
`./proxy http -t tcp -p "0.0.0.0:38080"`
|
`./proxy http -t tcp -p "0.0.0.0:38080"`
|
||||||
|
|
||||||
@ -255,7 +266,7 @@ KCP协议需要-B参数设置一个密码用于加密解密数据
|
|||||||
#### **1.9.查看帮助**
|
#### **1.9.查看帮助**
|
||||||
`./proxy help http`
|
`./proxy help http`
|
||||||
|
|
||||||
### 2.TCP代理
|
### **2.TCP代理**
|
||||||
|
|
||||||
#### **2.1.普通一级TCP代理**
|
#### **2.1.普通一级TCP代理**
|
||||||
本地执行:
|
本地执行:
|
||||||
@ -297,7 +308,7 @@ VPS(IP:22.22.22.33)执行:
|
|||||||
#### **2.6.查看帮助**
|
#### **2.6.查看帮助**
|
||||||
`./proxy help tcp`
|
`./proxy help tcp`
|
||||||
|
|
||||||
### 3.UDP代理
|
### **3.UDP代理**
|
||||||
|
|
||||||
#### **3.1.普通一级UDP代理**
|
#### **3.1.普通一级UDP代理**
|
||||||
本地执行:
|
本地执行:
|
||||||
@ -339,7 +350,7 @@ VPS(IP:22.22.22.33)执行:
|
|||||||
#### **3.6.查看帮助**
|
#### **3.6.查看帮助**
|
||||||
`./proxy help udp`
|
`./proxy help udp`
|
||||||
|
|
||||||
### 4.内网穿透
|
### **4.内网穿透**
|
||||||
#### **4.1、原理说明**
|
#### **4.1、原理说明**
|
||||||
内网穿透,由三部分组成:client端,server端,bridge端;client和server主动连接bridge端进行桥接.
|
内网穿透,由三部分组成:client端,server端,bridge端;client和server主动连接bridge端进行桥接.
|
||||||
当用户访问server端,流程是:
|
当用户访问server端,流程是:
|
||||||
@ -473,7 +484,7 @@ server连接到bridge的时候,如果同时有多个client连接到同一个brid
|
|||||||
`./proxy help tserver`
|
`./proxy help tserver`
|
||||||
`./proxy help tserver`
|
`./proxy help tserver`
|
||||||
|
|
||||||
### 5.SOCKS5代理
|
### **5.SOCKS5代理**
|
||||||
提示:SOCKS5代理,支持CONNECT,UDP协议,不支持BIND,支持用户名密码认证.
|
提示:SOCKS5代理,支持CONNECT,UDP协议,不支持BIND,支持用户名密码认证.
|
||||||
#### **5.1.普通SOCKS5代理**
|
#### **5.1.普通SOCKS5代理**
|
||||||
`./proxy socks -t tcp -p "0.0.0.0:38080"`
|
`./proxy socks -t tcp -p "0.0.0.0:38080"`
|
||||||
|
|||||||
86
config.go
86
config.go
@ -1,12 +1,14 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"proxy/services"
|
"proxy/services"
|
||||||
"proxy/utils"
|
"proxy/utils"
|
||||||
|
"time"
|
||||||
|
|
||||||
kingpin "gopkg.in/alecthomas/kingpin.v2"
|
kingpin "gopkg.in/alecthomas/kingpin.v2"
|
||||||
)
|
)
|
||||||
@ -14,6 +16,7 @@ import (
|
|||||||
var (
|
var (
|
||||||
app *kingpin.Application
|
app *kingpin.Application
|
||||||
service *services.ServiceItem
|
service *services.ServiceItem
|
||||||
|
cmd *exec.Cmd
|
||||||
)
|
)
|
||||||
|
|
||||||
func initConfig() (err error) {
|
func initConfig() (err error) {
|
||||||
@ -38,6 +41,7 @@ func initConfig() (err error) {
|
|||||||
app.Author("snail").Version(APP_VERSION)
|
app.Author("snail").Version(APP_VERSION)
|
||||||
debug := app.Flag("debug", "debug log output").Default("false").Bool()
|
debug := app.Flag("debug", "debug log output").Default("false").Bool()
|
||||||
daemon := app.Flag("daemon", "run proxy in background").Default("false").Bool()
|
daemon := app.Flag("daemon", "run proxy in background").Default("false").Bool()
|
||||||
|
forever := app.Flag("forever", "run proxy in forever,fail and retry").Default("false").Bool()
|
||||||
logfile := app.Flag("log", "log file path").Default("").String()
|
logfile := app.Flag("log", "log file path").Default("").String()
|
||||||
|
|
||||||
//########http#########
|
//########http#########
|
||||||
@ -155,18 +159,6 @@ func initConfig() (err error) {
|
|||||||
//parse args
|
//parse args
|
||||||
serviceName := kingpin.MustParse(app.Parse(os.Args[1:]))
|
serviceName := kingpin.MustParse(app.Parse(os.Args[1:]))
|
||||||
flags := log.Ldate
|
flags := log.Ldate
|
||||||
if *daemon {
|
|
||||||
args := []string{}
|
|
||||||
for _, arg := range os.Args[1:] {
|
|
||||||
if arg != "--daemon" {
|
|
||||||
args = append(args, arg)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cmd := exec.Command(os.Args[0], args...)
|
|
||||||
cmd.Start()
|
|
||||||
fmt.Printf("%s [PID] %d running...\n", os.Args[0], cmd.Process.Pid)
|
|
||||||
os.Exit(0)
|
|
||||||
}
|
|
||||||
if *debug {
|
if *debug {
|
||||||
flags |= log.Lshortfile | log.Lmicroseconds
|
flags |= log.Lshortfile | log.Lmicroseconds
|
||||||
} else {
|
} else {
|
||||||
@ -180,7 +172,75 @@ func initConfig() (err error) {
|
|||||||
log.Fatal(e)
|
log.Fatal(e)
|
||||||
}
|
}
|
||||||
log.SetOutput(f)
|
log.SetOutput(f)
|
||||||
} else {
|
}
|
||||||
|
if *daemon {
|
||||||
|
args := []string{}
|
||||||
|
for _, arg := range os.Args[1:] {
|
||||||
|
if arg != "--daemon" {
|
||||||
|
args = append(args, arg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cmd = exec.Command(os.Args[0], args...)
|
||||||
|
cmd.Start()
|
||||||
|
f := ""
|
||||||
|
if *forever {
|
||||||
|
f = "forever "
|
||||||
|
}
|
||||||
|
log.Printf("%s%s [PID] %d running...\n", f, os.Args[0], cmd.Process.Pid)
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
if *forever {
|
||||||
|
args := []string{}
|
||||||
|
for _, arg := range os.Args[1:] {
|
||||||
|
if arg != "--forever" {
|
||||||
|
args = append(args, arg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
if cmd != nil {
|
||||||
|
cmd.Process.Kill()
|
||||||
|
}
|
||||||
|
cmd = exec.Command(os.Args[0], args...)
|
||||||
|
cmdReaderStderr, err := cmd.StderrPipe()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("ERR:%s,restarting...\n", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
cmdReader, err := cmd.StdoutPipe()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("ERR:%s,restarting...\n", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
scanner := bufio.NewScanner(cmdReader)
|
||||||
|
scannerStdErr := bufio.NewScanner(cmdReaderStderr)
|
||||||
|
go func() {
|
||||||
|
for scanner.Scan() {
|
||||||
|
fmt.Println(scanner.Text())
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
go func() {
|
||||||
|
for scannerStdErr.Scan() {
|
||||||
|
fmt.Println(scannerStdErr.Text())
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
if err := cmd.Start(); err != nil {
|
||||||
|
log.Printf("ERR:%s,restarting...\n", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
pid := cmd.Process.Pid
|
||||||
|
log.Printf("worker %s [PID] %d running...\n", os.Args[0], pid)
|
||||||
|
if err := cmd.Wait(); err != nil {
|
||||||
|
log.Printf("ERR:%s,restarting...", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
log.Printf("%s [PID] %d unexpected exited, restarting...\n", os.Args[0], pid)
|
||||||
|
time.Sleep(time.Second * 5)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if *logfile == "" {
|
||||||
poster()
|
poster()
|
||||||
}
|
}
|
||||||
//regist services and run service
|
//regist services and run service
|
||||||
|
|||||||
@ -1,12 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
# install monexec
|
|
||||||
tar zxvf monexec_0.1.1_linux_amd64.tar.gz
|
|
||||||
cd monexec_0.1.1_linux_amd64
|
|
||||||
cp monexec /usr/bin/
|
|
||||||
chmod +x /usr/bin/monexec
|
|
||||||
cd ..
|
|
||||||
# #install proxy
|
# #install proxy
|
||||||
tar zxvf proxy-linux-amd64.tar.gz
|
tar zxvf proxy-linux-amd64.tar.gz
|
||||||
cp proxy /usr/bin/
|
cp proxy /usr/bin/
|
||||||
|
|||||||
@ -5,15 +5,8 @@ if [ -e /tmp/proxy ]; then
|
|||||||
fi
|
fi
|
||||||
mkdir /tmp/proxy
|
mkdir /tmp/proxy
|
||||||
cd /tmp/proxy
|
cd /tmp/proxy
|
||||||
wget https://github.com/reddec/monexec/releases/download/v0.1.1/monexec_0.1.1_linux_amd64.tar.gz
|
wget https://github.com/snail007/goproxy/releases/download/v3.9/proxy-linux-amd64.tar.gz
|
||||||
wget https://github.com/snail007/goproxy/releases/download/v3.8/proxy-linux-amd64.tar.gz
|
|
||||||
|
|
||||||
# install monexec
|
|
||||||
tar zxvf monexec_0.1.1_linux_amd64.tar.gz
|
|
||||||
cd monexec_0.1.1_linux_amd64
|
|
||||||
cp monexec /usr/bin/
|
|
||||||
chmod +x /usr/bin/monexec
|
|
||||||
cd ..
|
|
||||||
# #install proxy
|
# #install proxy
|
||||||
tar zxvf proxy-linux-amd64.tar.gz
|
tar zxvf proxy-linux-amd64.tar.gz
|
||||||
cp proxy /usr/bin/
|
cp proxy /usr/bin/
|
||||||
|
|||||||
19
main.go
19
main.go
@ -1,7 +1,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
@ -9,14 +8,18 @@ import (
|
|||||||
"syscall"
|
"syscall"
|
||||||
)
|
)
|
||||||
|
|
||||||
const APP_VERSION = "3.8"
|
const APP_VERSION = "3.9"
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
err := initConfig()
|
err := initConfig()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("err : %s", err)
|
log.Fatalf("err : %s", err)
|
||||||
}
|
}
|
||||||
Clean(&service.S)
|
if service != nil && service.S != nil {
|
||||||
|
Clean(&service.S)
|
||||||
|
} else {
|
||||||
|
Clean(nil)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
func Clean(s *services.Service) {
|
func Clean(s *services.Service) {
|
||||||
signalChan := make(chan os.Signal, 1)
|
signalChan := make(chan os.Signal, 1)
|
||||||
@ -29,8 +32,14 @@ func Clean(s *services.Service) {
|
|||||||
syscall.SIGQUIT)
|
syscall.SIGQUIT)
|
||||||
go func() {
|
go func() {
|
||||||
for _ = range signalChan {
|
for _ = range signalChan {
|
||||||
fmt.Println("\nReceived an interrupt, stopping services...")
|
log.Println("Received an interrupt, stopping services...")
|
||||||
(*s).Clean()
|
if s != nil && *s != nil {
|
||||||
|
(*s).Clean()
|
||||||
|
}
|
||||||
|
if cmd != nil {
|
||||||
|
log.Printf("clean process %d", cmd.Process.Pid)
|
||||||
|
cmd.Process.Kill()
|
||||||
|
}
|
||||||
cleanupDone <- true
|
cleanupDone <- true
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
VER="3.8"
|
VER="3.9"
|
||||||
RELEASE="release-${VER}"
|
RELEASE="release-${VER}"
|
||||||
rm -rf .cert
|
rm -rf .cert
|
||||||
mkdir .cert
|
mkdir .cert
|
||||||
|
|||||||
1
services/mux_bridge.go
Normal file
1
services/mux_bridge.go
Normal file
@ -0,0 +1 @@
|
|||||||
|
package services
|
||||||
1
services/mux_client.go
Normal file
1
services/mux_client.go
Normal file
@ -0,0 +1 @@
|
|||||||
|
package services
|
||||||
1
services/mux_server.go
Normal file
1
services/mux_server.go
Normal file
@ -0,0 +1 @@
|
|||||||
|
package services
|
||||||
Reference in New Issue
Block a user