让一个端口同时做两件事: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。配置如下:
global
maxconn 5120
chroot /usr/local/blog.creke.net/haproxy
daemon
quiet
nbproc 2
pidfile /usr/local/blog.creke.net/haproxy/haproxy.piddefaults
timeout connect 5s
timeout client 50s
timeout server 20slisten 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_httpbackend 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.piddefaults
timeout connect 5s
timeout client 50s
timeout server 20slisten 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_sslbackend 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
这样设置发现一个问题, http/https server 不能获取到客户端的 IP。
http://blog.creke.net/758.html/comment-page-1