www.fastssh.com SSH over WebSockets with CDNs

https://www.fastssh.com/page/create-ssh-cdn-websocket/server/


这其实不是标准的websocket报文(服务器响应报文无Sec-Websocket-Accept字段),所以无法使用github.com/gorilla/websocket包:


GET / HTTP/1.1
Host: hostname:8080
User-Agent: Go-http-client/1.1
Connection: Upgrade
Origin: http://hostname:8080
Sec-WebSocket-Key: t+M8AiisFSInx6hLi1YBOg==
Sec-WebSocket-Version: 13
Upgrade: websocket

HTTP/1.1 101 Switching Protocol
Server: nginx/1.24.0
Date: Sat, 04 May 2024 08:37:56 GMT
Content-Length: 1048576000000
Connection: upgrade

首先申请账户:

使用golang1.20 编写转发程序:

package main
 
import (
	"bufio"
	"fmt"
	"net"
	"io"
	"net/http"
	_ "strings"
)

var upgradeHeaders = []string{
	"GET / HTTP/1.1",
	"Host: sg-public1.sshws.net:80",
	"User-Agent: Go-http-client/1.1",
	"Connection: Upgrade",
	"Origin: http://sg-public1.sshws.net:80",
	"Sec-WebSocket-Key: t+M8AiisFSInx6hLi1YBOg==",
	"Sec-WebSocket-Version: 13",
	"Upgrade: websocket",
	"",
	"",
}

func main() {
	listener, err := net.Listen("tcp", ":6022")
	if err != nil {
		fmt.Println("Error listening on port 6022: ", err)
		return
	}
	defer listener.Close()

	for {
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("Error accepting connection: ", err)
			continue
		}

		go handleClient(conn)
	}
}

func handleClient(conn net.Conn) {
	defer conn.Close()

	// Connect to the WebSocket server
	serverConn, err := net.Dial("tcp", "sg-public1.sshws.net:80")
	if err != nil {
		fmt.Println("Error connecting to WebSocket server: ", err)
		return
	}
	defer serverConn.Close()

	// Send upgrade headers
	for _, header := range upgradeHeaders {
		if _, err := fmt.Fprint(serverConn, header+"\r\n"); err != nil {
			fmt.Println("Error sending header: ", err)
			return
		}
	}

	// Read server response
	reader := bufio.NewReader(serverConn)
	response, err := http.ReadResponse(reader, nil)
	if err != nil {
		fmt.Println("Error reading server response: ", err)
		return
	}
	defer response.Body.Close()

	if response.StatusCode != http.StatusSwitchingProtocols {
		fmt.Println("Server did not accept WebSocket upgrade: ", response.Status)
		return
	}

	// Forward data between TCP client and WebSocket server
	buffer := make([]byte, 1024)
	go io.CopyBuffer(serverConn, conn, buffer)
	io.CopyBuffer(conn, serverConn, buffer)
}

编译后运行: 

mkdir -pv /tmp/Ay;
cd /tmp/Ay;  
go build -ldflags="-s -w" -o ws2.elf  ws2.go ;

./ws2.elf

验证并使用:

/tmp/busybox netstat -anl|grep 6022;   


ssh -o StrictHostKeyChecking=no -o HostKeyAlgorithms=+ssh-dss -o ServerAliveInterval=10 -o ServerAliveCountMax=3 -D 3080 -Nf -v fastssh.com-username@127.0.0.22 -p 6022;


/tmp/busybox netstat -anl|grep 3080; 

curl -v -4 -x socks5h://127.0.0.1:3080 cip.cc;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值