http隧道Chisel

http隧道有啥用呢?
有些服务器封端口或者封协议只能走http协议。远程维护机器很不方便,可能要VPN+堡垒机,甚至还有限制了ssh客户端的。这里我就会考虑使用http隧道的方式。
http隧道Chisel_第1张图片
同类文章推荐:

  • 《http隧道Neo-reGeorg使用笔记》https://blog.csdn.net/lxyoucan/article/details/118120656
  • 《钉钉内网穿透》 https://blog.csdn.net/lxyoucan/article/details/112548798

简介

项目地址:https://github.com/jpillora/chisel

Chisel 是一个快速的 TCP/UDP 隧道,通过 HTTP 传输,通过 SSH 进行保护。单个可执行文件,包括客户端和服务器。用 Go (golang) 编写。Chisel 主要用于通过防火墙,但它也可用于为您的网络提供安全端点。

特征

  • 易于使用
  • 性能*
  • 使用 SSH 协议的加密连接(通过crypto/ssh)
  • 经过身份验证的连接;具有用户配置文件的经过身份验证的客户端连接,具有指纹匹配的经过身份验证的服务器连接。
  • 客户端使用指数退避自动重新连接
  • 客户端可以通过一个 TCP 连接创建多个隧道端点
  • 客户端可以选择通过 SOCKS 或 HTTP CONNECT 代理
  • 反向端口转发(连接通过服务器并从客户端传出)
  • 服务器可选择兼作反向代理
  • 服务器可选择允许SOCKS5连接(请参阅下面的指南)
  • 客户端可选择允许来自反向端口的SOCKS5连接转发
  • 通过 stdio 的客户端连接支持ssh -o ProxyCommand通过 HTTP 提供 SSH

安装方法

我只介绍两种方式,其他方法请参考项目主页的介绍。

Binaries

查看最新版本或下载并立即安装

curl https://i.jpillora.com/chisel! | bash

Docker

docker run --rm -it jpillora/chisel --help

用法

详细看帮助。

chisel --help
chisel server --help
chisel client --help

SOCKS5实例

  1. 开启chisel server
    服务端开启服务。
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+Chisel

我的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协议。
这个配置文件参考了:

  • https://www.huaweicloud.com/articles/bb617f001e20ce4973e446d497831b05.html
  • https://gist.github.com/alediaferia/ebc7ecadb88889e6665b32aec9951f46

上面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,每按一键都会有明显的卡顿。

你可能感兴趣的:(网络安全,linux,Chisel,http隧道)