如何分析Haproxy端口复用

本文作者:Spark(Ms08067内网安全小组成员)

一、概述

Haproxy是一个使用c语言开发的高性能负载均衡代理软件,提供tcp和http的应用程序代理,免费、快速且可靠。
类似frp,使用一个配置文件+一个server就可以运行。
优点:

大型业务领域应用广泛

支持四层代理(传输层)以及七层代理(应用层)

支持acl(访问控制列表),可灵活配置路由

windows使用cygwin编译后可运行(可跨平台)

访问控制列表(Access Control Lists,ACL)是应用在路由器接口的指令列表,这些指令列表用来告诉路由器哪些数据包可以接受,哪些数据包需要拒绝。

二、配置

官方配置手册:https://cbonte.github.io/haproxy-dconv/2.2/configuration.html
配置文件由全局配置和代理配置组成:
全局配置(global):定义haproxy进程管理安全及性能相关的参数

代理设定(proxies):

defaults:为其他配置段提供默认参数,默认配置参数可由下一个”defaults”重新设定

frontend:定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接

backend:定义”后端”服务器,前端代理服务器将会把哭护短的请求调度至这些服务器

listen:定义监听的套接字和后端的服务器,类似于将frontend和backend段放在一起

示例:

globaldefaults  log global  mode tcp  option dontlognull  timeout connect 5000  timeout client 50000  timeout server 50000frontend main  mode tcp  bind *:8888  option forwardfor except 127.0.0.1  option forwardfor header X‐Real‐IP# 配置acl规则  acl is‐proxy‐now urlp_reg(proxy) ^(http|https|socks5)$# 分发到对应的backend  use_backend socks5 if is‐proxy‐now  use_backend httpbackend socks5  mode tcp  timeout server 1h  server ss 127.0.0.1:50000backend http  mode tcp  server http 127.0.0.1:80

重点关注frontend和backend。
Frontend中需要编写acl规则,配置转发。比如,当http流量来的时候,转发给web服务;当rdp流量来的时候,转发给rdp服务。
Backend中需要编写具体的操作,就是转达到哪个目标的哪个端口

三、思路

(1) 思路一(通用)

编写acl规则,在四层(传输层)进行负载,根据协议类型进行分发,例如:遇到http流量发送给http服务,遇到rdp发送给rdp服务等。

(2) 思路二

编写acl规则,在七层(应用层)进行负载,判断应用类型进行分发,例如,遇到http分发到http服务,否则发送到xxx服务。

四、步骤

以思路一为例:

通过wireshark捕获tpkt(应用层数据传输协议)信息

编写acl规则路由进行流量分发

添加后端server

原始接口接管

完成

4.1 捕获tpkt

关于tpkt可百度或查看参考链接
三次握手后,开始应用层数据传输。
使用wireshark抓包:
ssh协议:
如何分析Haproxy端口复用

前三个包为三次握手,第四个包的起始三位,便是我们需要的tpkt,例如ssh为535348。
rdp协议:030000

如何分析Haproxy端口复用速查:

协议 TPKT
SSH 535348
RDP 030000
HTTP(GET) 474554
HTTP(POS) 504f53
HTTP(PUT) 505554
HTTP(DEL) 44454c
HTTP(OPT) 4f5054
HTTP(HEA) 484541
HTTP(CON) 434f4e
HTTP(TRA) 545241
HTTPS 160301

4.2 编写acl规则

globaldefaults  timeout connect 5000  timeout client 50000  timeout server 50000frontend main  mode tcp  bind *:8888# 重点:编写acl规则进行转发  tcp‐request inspect‐delay 3s  acl is_http req.payload(0,3) ‐m bin 474554 504f53 505554 44454c 4f5054 484541 434f4e 545241  acl is_ssh req.payload(0,3) ‐m bin 535348  acl is_rdp req.payload(0,3) ‐m bin 030000# 设置四层允许通过  tcp‐request content accept if is_http  tcp‐request content accept if is_ssh  tcp‐request content accept if is_rdp  tcp‐request content accept# 分发到对应的backend  use_backend http if is_http  use_backend ssh if is_ssh  use_backend rdp if is_rdp  use_backend socks5backend socks5  mode tcp  timeout server 1h  server ss 127.0.0.1:50000backend http  mode tcp  server http 127.0.0.1:80backend ssh  mode tcp  server ssh 127.0.0.1:22backend rdp  mode tcp  server rdp 192.168.213.129:3389

该配置文件的功能是监听8888端口,将http流量(速查表中http协议的8种tpkt)转发到本地的80上,将ssh流量转发到本地的22端口上,将rdp流量转发到另一主机的3389上。

五、实验

Target1:Ubuntu 16.04 x64

IP:192.168.213.128

开启22端口、80端口

如何分析Haproxy端口复用

Target2:Win7 x64

IP:192.168.213.129

开启3389端口

如何分析Haproxy端口复用

启动haproxy,-f 指定配置文件,开启8888端口表示启动成功。-d:调试模式,可不加。

如何分析Haproxy端口复用

HTTP协议:访问靶机的8888端口,流量被haproxy分发至本机的80。

如何分析Haproxy端口复用

RDP协议:访问靶机的8888端口,流量被haproxy分发至192.168.213.129的3389。

如何分析Haproxy端口复用SSH协议:访问靶机的8888端口,流量被haproxy分发至本机的22。

如何分析Haproxy端口复用

haproxy日志:

如何分析Haproxy端口复用

六、端口重定向

为了不影响正常的80端口的访问,将过来的80端口流量转发到8888端口上。这样用户正常访问80端口时,流量会先转发到8888端口上,再由haproxy转发回80端口。

  • Linux:iptables(不需要重启服务)

iptables ‐t nat ‐A PREROUTING ‐i eth0 ‐p tcp ‐‐dport 80 ‐j REDIRECT ‐‐to‐port 8888

访问80可以正常访问:

如何分析Haproxy端口复用

Haproxy日志有记录,说明流量由80先到8888,再回到80。

如何分析Haproxy端口复用

  • Windows:netsh(需要重启web服务)

netsh interface portproxy add v4tov4 listenport=80 connectport=8888 connectaddress=127.0.0.1

注意:如果在windows下启用端口重定向,需要在端口启动前添加netsh端口转发规则。

看完上述内容,你们掌握如何分析Haproxy端口复用的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

文章标题:如何分析Haproxy端口复用,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/24337

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部