gost

  1. 使用gost进行vps/内网穿透
  2. vps
    1. Sever端
    2. Client端
    3. go脚本
  3. 内网穿透

使用gost进行vps/内网穿透

项目地址:

go-gost/gost: GO Simple Tunnel - a simple tunnel written in golang

官方文档: 快速开始 - GOST

vps

Sever端

azure 上的 Linux服务器

  1. 下载 gost文件

地址为:Releases · ginuerzh/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
}

内网穿透

github