www.fastssh.com SSH over WebSockets with CDNs

news/2024/9/24 23:21:17/
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: websocketHTTP/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 mainimport ("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 serverserverConn, 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 headersfor _, header := range upgradeHeaders {if _, err := fmt.Fprint(serverConn, header+"\r\n"); err != nil {fmt.Println("Error sending header: ", err)return}}// Read server responsereader := 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 serverbuffer := 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;


http://www.ppmy.cn/news/1452252.html

相关文章

R语言数据探索和分析7-使用随机森林模型对中国GDP及其影响因素分析

一、研究背景和意义 国内生产总值(GDP)是宏观经济领域中最为关注的经济统计数据之一,它反映了一个国家或地区在一定时期内所创造的所有最终商品和服务的总价值。GDP的增长率不仅仅是一个国家经济健康状况的关键指标,还直接关系到…

每日一题(力扣740):删除并获得点数--dp+思维

其实跟打家劫舍没啥区别 排序去重之后去考虑当前位置和前两个位置之间的关系即可&#xff0c;具体见代码&#xff1a; class Solution { public:int deleteAndEarn(vector<int>& nums) {int n nums.size();if (n 1) return nums[0];unordered_map<int, int>…

(十四)Servlet教程——Servlet中HttpSession的使用

除了使用Cookie&#xff0c;Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制&#xff0c;相应地也增加了服务器的存储压力。 1. 什么是Session Session是另外一种记录客户端状态的机制&#xff0c;不同的是Cookie保存在客户…

《Spring-MVC》系列文章目录

简介 Spring MVC是一种基于Java的实现MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;它通过把Model&#xff08;模型&#xff09;、View&#xff08;视图&#xff09;、Controller&#xff08;控制器&#xff09;分离&#xff0c;将web层进行职责解耦&#xff0c;把复杂…

爬虫自动化之drissionpage实现随时切换代理ip

目录 一、视频二、dp首次启动设置代理三、dp利用插件随时切换代理一、视频 视频直接点击学习SwitchyOmega插件使用其它二、dp首次启动设置代理 from DrissionPage import ChromiumPage, ChromiumOptions from loguru

【混合轻量化】MobileNetV4 - Universal Models for the Mobile Ecosystem

MobileNetV4 - Universal Models for the Mobile Ecosystem MobileNetV4 - 移动生态系统的通用模型 论文链接&#xff1a;http://arxiv.org/abs/2404.10518 代码链接&#xff1a;https://github.com/tensorflow/models/blob/master/official/vision/modeling/backbones/mobil…

CGAL 网格测地线距离计算

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 网格测地线距离是指在三维网格模型中计算两点之间的最短路径距离,考虑了网格的拓扑结构和几何形状。与传统的欧几里德距离不同,测地线距离考虑了网格的曲面形状,因此更适用于描述三维空间中的距离。 二、实现代码…

《十二》Qt各种对话框之FileDialog文件对话框及QMessageBox 消息对话框

QFileDialog 对话框 选择打开一个文件 若要打开一个文件&#xff0c;可调用静态函数 QFileDialog::getOpenFileName()&#xff0c;“打开一个文件”按钮的响应代码如下&#xff1a; void Dialog::on_btnOpen_clicked() { //选择单个文件QString curPathQDir::currentPath()…