使用haproxy实现同一端口跑SSH和VMess
本文发布于 ,内容可能和实际情况存在出入。如果文章存在错误欢迎指正,我会根据情况对文章进行修改或做隐藏处理
(为什么要把这两个开在一个端口上就不说了,反正都懂)
一开始是在网上找的SS+SSH教程,但发现这些教程都是以开启http伪装或者tls为前提的。
为了获取更好的性能和更少的麻烦(因为禁止跑网站,套tls容易产生误会),还是决定折腾一下。
通过抓包发现,Linux的ssh命令在连接时会主动发送SSH的payload,但XShell这类工具会在tcp连接建立后等待服务器发起SSH请求。
于是需要判断的事情就很明确了:
- 延迟进入的连接一段时间
- 判断时间结束前客户端是否发送了payload
- 判断payload是否为SSH协议
- 如果不是SSH协议则发送到v2ray后端
- 如果是SSH协议,或超时前客户端没发送任何信息则转到openssh
配置文件如下:
global
log /dev/log local2
pidfile /run/haproxy.pid
maxconn 1000
defaults
timeout http-request 30s
timeout queue 30s
timeout connect 10s
timeout client 15m
timeout client-fin 15m
timeout server 15m
timeout http-keep-alive 10s
timeout check 10s
timeout tunnel 12h
frontend main
mode tcp
bind *:11111
tcp-request inspect-delay 100ms
tcp-request content accept if { req.payload(0,3) -m found }
tcp-request content accept if WAIT_END #延迟请求
acl is_ssh req.payload(0,3) -m bin 535348 #判断是否是SSH payload
acl have_payload req.payload(0,3) -m found #判断是否有payload
use_backend ssh if is_ssh #如果是SSH转发到openssh
use_backend v2ray if have_payload #如果不是SSH,且有payload则转发给v2ray
default_backend ssh #其他情况转发给openssh
backend ssh
mode tcp
server sshd 127.0.0.1:22
backend v2ray
mode tcp
server v2ray 127.0.0.1:8989