使用haproxy实现同一端口跑SSH和VMess

(为什么要把这两个开在一个端口上就不说了,反正都懂)
一开始是在网上找的SS+SSH教程,但发现这些教程都是以开启http伪装或者tls为前提的。
为了获取更好的性能和更少的麻烦(因为禁止跑网站,套tls容易产生误会),还是决定折腾一下。

通过抓包发现,Linux的ssh命令在连接时会主动发送SSH的payload,但XShell这类工具会在tcp连接建立后等待服务器发起SSH请求。

于是需要判断的事情就很明确了:

  1. 延迟进入的连接一段时间
  2. 判断时间结束前客户端是否发送了payload
  3. 判断payload是否为SSH协议
  4. 如果不是SSH协议则发送到v2ray后端
  5. 如果是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

标签: v2ray, haproxy, vmess, openssh, ssh

添加新评论