http隧道有啥用呢?
有些服务器封端口或者封协议只能走http协议。远程维护机器很不方便,可能要VPN+堡垒机,甚至还有限制了ssh客户端的。这里我就会考虑使用http隧道的方式。
同类文章推荐:
项目地址:https://github.com/jpillora/chisel
Chisel 是一个快速的 TCP/UDP 隧道,通过 HTTP 传输,通过 SSH 进行保护。单个可执行文件,包括客户端和服务器。用 Go (golang) 编写。Chisel 主要用于通过防火墙,但它也可用于为您的网络提供安全端点。
我只介绍两种方式,其他方法请参考项目主页的介绍。
查看最新版本或下载并立即安装
curl https://i.jpillora.com/chisel! | bash
docker run --rm -it jpillora/chisel --help
详细看帮助。
chisel --help
chisel server --help
chisel client --help
chisel server -p 9312 --socks5 --key supersecret
执行结果如下:
➜ ~ chisel server -p 9312 --socks5 --key supersecret
2021/07/08 12:42:41 server: Fingerprint HmlyYqS8Ce4n+tr8hhVZ39jFJRCaKNMJn0KsI0VsL3I=
2021/07/08 12:42:41 server: Listening on http://0.0.0.0:9312
红色字体部分,我们一会儿要用到。
2. 连接 chisel client (使用上面得到的fingerprint)
客户端连接服务端
chisel client --fingerprint 'HmlyYqS8Ce4n+tr8hhVZ39jFJRCaKNMJn0KsI0VsL3I=' 172.16.184.12:9312 socks
172.16.184.12部分换成你的服务ip。
执行结果如下:
$ chisel client --fingerprint 'HmlyYqS8Ce4n+tr8hhVZ39jFJRCaKNMJn0KsI0VsL3I=' 172.16.184.12:9312 socks
2021/07/08 14:27:14 client: Connecting to ws://172.16.184.12:9312
2021/07/08 14:27:14 client: tun: proxy#127.0.0.1:1080=>socks: Listening
2021/07/08 14:27:14 client: Fingerprint HmlyYqS8Ce4n+tr8hhVZ39jFJRCaKNMJn0KsI0VsL3I=
2021/07/08 14:27:14 client: Connected (Latency 1.784676ms)
此时客户端就开启了一个socks代理服务器了,端口默认1080.隧道就建立完成了。
如何使用socket5隧道。可以参考:
《Sockets代理的使用简介》https://blog.csdn.net/lxyoucan/article/details/118573133
我比较常用的用法,通过代理连接ssh。
ssh -o ProxyCommand='nc -x 127.0.0.1:1080 %h %p' [email protected]
我的Nginx配置文件如下:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
sendfile on;
keepalive_timeout 65;
types_hash_max_size 4096;
server {
listen 8061;
server_name localhost;
location /dev/ {
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' 'https://chisel.cloud';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-Chisel-Proxied-Url,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-Chisel-Proxied-Url,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH';
proxy_redirect off;
proxy_set_header Host $proxy_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass "http://127.0.0.1:8080";
proxy_hide_header 'access-control-allow-origin';
add_header 'access-control-allow-origin' 'https://chisel.cloud';
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
其中把proxy_pass "http://127.0.0.1:8080";
中的地址,换成你实际Chisel server的地址就行了。
重点是需要支持websocket协议。
这个配置文件参考了:
上面nginx上根据的路径是/dev/所以,客户端的命令应该这样写:
chisel client --fingerprint 'HmlyYqS8Ce4n+tr8hhVZ39jFJRCaKNMJn0KsI0VsL3I=' 180.188.132.10:8061/dev/ socks
对比Neo-reGeorg隧道穿透,Chisel更稳定和流畅。即使是通过http隧道,使用ssh毫无卡顿感。Neo-reGeorg的优点是比较小巧灵活隐蔽,随便丢个jsp文件到服务器上就可以使用了。Chisel还要单独启动个服务显的重一些。但是通过Neo-reGeorg使用ssh,每按一键都会有明显的卡顿。