让一个端口同时做两件事:http/https和ssh

相信很多人都在YY:能不能让80端口分析连接协议,如果是http协议就让服务器交给http服务程序(如Apache、Nginx等)处理,如果是ssh协议就交给ssh服务程序(如OpenSSH Server)处理呢?

答案显然是有的。

首先,配置http服务程序监听8080端口或者让https服务监听8443端口,配置ssh服务程序监听22端口。具体不再赘述,如果这都不懂就不用往下看了,因为肯定会搞不定的。

然后,安装一个叫haproxy的强大工具。步骤如下。

下载源代码:

wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.16.tar.gz

查看当前内核版本:

uname -r

然后进入目录编译安装:

cd haproxy-1.4.16

make TARGET=linux26 PREFIX=/usr/local/blog.creke.net/haproxy

make install PREFIX=/usr/local/blog.creke.net/haproxy

其中,第二行的“TARGET”参数要和内核版本一致。第二、三行的“PREFIX”是安装位置。

最后,配置haproxy。

如果要监听80端口,检测到http协议就转发给8080端口使用HTTP,否则转发给22端口使用ssh。配置如下:

#By http://blog.creke.net/

global
    maxconn 5120 
    chroot /usr/local/blog.creke.net/haproxy  
    daemon
    quiet
    nbproc 2
    pidfile /usr/local/blog.creke.net/haproxy/haproxy.pid

defaults
    timeout connect 5s
    timeout client 50s
    timeout server 20s

listen http
    bind :80
    timeout client 1h
    tcp-request inspect-delay 2s
    acl is_http req_proto_http
    tcp-request content accept if is_http
    server server-http :8080
    use_backend ssh if !is_http

backend ssh
    mode tcp
    timeout server 1h
    server server-ssh :22

如果还有监听443端口,检测到https协议就转发到8443端口使用HTTPS,否则转发给22端口使用ssh。则配置如下:

global
    maxconn 5120 
    chroot /usr/local/blog.creke.net/haproxy  
    daemon
    quiet
    nbproc 2
    pidfile /usr/local/blog.creke.net/haproxy/haproxy.pid

defaults
    timeout connect 5s
    timeout client 50s
    timeout server 20s

listen https
    bind :443
    timeout client 1h
    tcp-request inspect-delay 2s
    acl is_ssl req_ssl_ver 2:3.1
    tcp-request content accept if is_ssl
    server server-https :8443
    use_backend ssh if !is_ssl

backend ssh
    mode tcp
    timeout server 1h
    server server-ssh :22

把内容保存为“/usr/local/blog.creke.net/haproxy/etc/haproxy.conf”,执行命令:

/usr/local/blog.creke.net/haproxy/sbin/haproxy -f /usr/local/blog.creke.net/haproxy/etc/haproxy.conf

即可运行。

好了,大家应该可以举一反三,起码也可以依葫芦画瓢吧。

参考文章:

https://dgl.cx/2010/01/haproxy-ssh-and-ssl-on-same-port

http://haproxy.1wt.eu/download/1.4/doc/configuration.txt

4 comments

  1. Howard Xiao says:

    您太伟大了!
    这问题困扰了我很久
    建议lZ发一个for windows的
    如果可能的话

    1. creke says:

      你可以到文中提到的haproxy官网看看,上面是没有现成的win版,得自己编译。

  2. says:

    呃,好久远的帖子。
    这样设置发现一个问题, http/https server 不能获取到客户端的 IP。

Leave a comment