使用gost进行vps/内网穿透
项目地址:
go-gost/gost: GO Simple Tunnel - a simple tunnel written in golang
官方文档: 快速开始 - GOST
vps
Sever端
azure 上的 Linux服务器
- 下载 gost文件
wget https://github.com/ginuerzh/gost/releases/download/v2.12.0/gost_2.12.0_linux_amd64.tar.gz
# 加解压
tar -xzvf gost_2.12.0_linux_amd64.tar.gz -C ../scr/
启动Linux端服务的命令
screen -S gost
/home/azureuser/my_vpn/scr/gost -L mwss://账号:密码@IP地址:2123
设置开机自启动
在 azure 上设置定时开关机可以减少费用,反正有白嫖时长,不用白不用
sudo vi /etc/systemd/system/myrun.service
编写相应的服务
[Unit]
Description=Run my script at boot
[Service]
Type=simple
ExecStart=/bin/bash /home/youruser/run.sh
Restart=on-failure
User=youruser
[Install]
WantedBy=multi-user.target
赋予你的脚本执行权
chmod +x /home/youruser/run.sh
启用并启动服务:
sudo systemctl daemon-reload
sudo systemctl enable myrun
sudo systemctl start myrun
Client端
下载预编译版本,或手动编译
gost -L=:6666 -F=mwss://账号:密码@xx.xx.xx.xx.99:2123
go脚本
使用go编写一个简单的启动脚本在 windows 上使用
自动启动代理转发
package main
import (
"fmt"
"os"
"os/exec"
"os/signal"
"syscall"
)
func setProxy(port int) error {
addr := fmt.Sprintf("127.0.0.1:%d", port)
cmd := exec.Command("reg", "add", "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", "/v", "ProxyEnable", "/t", "REG_DWORD", "/d", "1", "/f")
if err := cmd.Run(); err != nil {
return err
}
cmd = exec.Command("reg", "add", "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", "/v", "ProxyServer", "/t", "REG_SZ", "/d", addr, "/f")
return cmd.Run()
}
func unsetProxy() error {
cmd := exec.Command("reg", "add", "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", "/v", "ProxyEnable", "/t", "REG_DWORD", "/d", "0", "/f")
return cmd.Run()
}
func ProxyOverride() error {
lists := "127.0.0.1;localhost"
cmd := exec.Command("reg", "add", "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", "/v", "ProxyOverride", "/t", "REG_SZ", "/d", lists, "/f")
return cmd.Run()
}
func main() {
port := 6666
ip_jp := ""
ip_hk := ""
use := "jp"
var ip string
if use == "jp" {
ip = ip_jp
} else {
ip = ip_hk
}
fmt.Println("使用的IP:", ip)
// 0. 设置代理例外
// if err := ProxyOverride(); err != nil {
// fmt.Println("设置代理例外失败:", err)
// return
// }
// fmt.Println("代理例外已设置")
// 1. 设置系统代理
if err := setProxy(port); err != nil {
fmt.Println("设置代理失败:", err)
return
}
fmt.Println("系统代理已启用: 127.0.0.1:6666")
// 信号处理,确保中断时关闭代理
sigs := make(chan os.Signal, 1)
done := make(chan struct{})
signal.Notify(sigs, os.Interrupt, syscall.SIGTERM, syscall.SIGINT)
go func() {
<-sigs
fmt.Println("\n检测到中断信号,正在关闭系统代理...")
unsetProxy()
close(done)
}()
// 2. 启动gost(前台运行,退出后再关闭代理)
tmp := fmt.Sprintf("-F=mwss://:@%s:", ip_jp)
cmd := exec.Command("gost", "-L=:6666", tmp)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Stdin = os.Stdin
if err := cmd.Run(); err != nil {
fmt.Println("gost 运行出错:", err)
}
// 3. 关闭系统代理(正常退出时)
unsetProxy()
fmt.Println("系统代理已关闭")
// 等待信号处理完成(如果是信号退出)
<-done
}